Cara menggabungkan konten file di PowerShell. Dan jangan menderita

Apa yang harus dilakukan


Suatu kali saya harus menggabungkan banyak file teks yang terletak di satu direktori menjadi satu file. Saya tidak ingin melakukan ini dengan tangan saya dan Google membantu saya, seperti biasa ,! Saya mendengar banyak tentang kekuatan alat seperti PowerShell, dan memutuskan untuk menggunakannya untuk "tugas besar" ini. Setidaknya karena saya tidak terbiasa dengan celaka cmd.exe . Nah, melakukannya dengan tangan Anda bukanlah cara kami.


Apa yang salah


Google memberi tahu saya bahwa Anda dapat melakukan ini dengan perintah sederhana


Get-ChildItem -Filter *.log | Get-Content | Out-File result.txt 

"Sangat keren! Hanya semacam cara Unix!" Saya pikir. Saya menyalin perintah, sedikit memodifikasinya, dan tekan Enter. Kursor pindah ke baris baru ... dan tidak lebih. Di manajer file, saya membuka file terakhir - itu benar-benar mirip dengan hasil yang diinginkan. Itu banyak baris dari file sumber. Kembali ke konsol, saya melihat bahwa prosesnya masih ... dalam proses. Membantu Ctrl + C.


Melihat lebih dekat pada ukuran file, saya melihat bahwa itu entah bagaimana besar mencurigakan. Ukurannya melebihi 100 megabita. Meskipun data airnya tidak begitu besar.


Mengapa ini terjadi?


Ini semua tentang "modifikasi mudah saya". Saya hanya tidak membutuhkan filter ekstensi. Ya, dan parameter ini opsional. Dan ternyata tim membuat file yang dihasilkan, melihat bahwa itu ada di direktori, membacanya dan menulis isinya kembali ke akhir dan melakukannya sampai saya menekan Ctrl + C. Saya tidak bisa menjelaskan pertumbuhan berkelanjutan dari file output untuk hal lain


Saya mengulangi ini dalam kondisi "steril". Untuk kesederhanaan dan kemurnian, saya melakukan percobaan di direktori terpisah, karena saya takut membunuh mesin yang berfungsi


  1. Saya membuat file teks


     echo "Hello world" > hello.txt 

  2. Saya menjalankan perintah


     Get-ChildItem | Get-Content | Out-File result.txt 

    atau dalam bentuk singkat


     dir | cat | Out-File result.txt 

    Masalahnya berulang. File yang dihasilkan tumbuh, diisi ulang dengan baris dari sumber (atau baris dari itu sendiri?). Dalam 10 detik eksekusi:


    • satu baris dari file sumber berubah menjadi 400 ribu baris
    • ukuran file meningkat dari 11 byte menjadi hampir 8 megabyte
    • prosesor dimuat sekitar 20-25%.
    • tidak ada kelebihan pada subsistem disk atau RAM. Tampaknya, PowerShell dioptimalkan dengan baik dalam hal bekerja dengan komponen-komponen ini. )


Ini juga menarik - jika Anda menentukan nama satu-satunya file di direktori sebagai parameter dari perintah terakhir, maka, tentu saja, Anda dapat menebak drum roll ... kekosongan akan ditulis ke file!


Inilah logika pekerjaan yang "menarik"


Apa yang terjadi


File yang dibuat pada langkah pertama mulai tumbuh. Perilaku ini setidaknya tidak dapat diprediksi.
Itu juga mengejutkan bahwa sistem operasi terus bekerja secara normal. File tumbuh lambat (atau tidak benar-benar?) Tanpa memblokir pekerjaan pengguna.


Apa itu berbahaya?


Pengisian ruang disk yang tidak sensitif.


Bagaimana cara menghindarinya


Saring daftar file input:


 Get-ChildItem -Filter *.log | Get-Content | Out-File result.txt 

Tetapi ini tidak akan menghemat, jika file input dan output cocok dengan kondisi filter


PS


Saya menggunakan PowerShell versi 5.1.17134.407. Ngomong-ngomong, dalam mencoba mencari tahu, saya mencoba semua metode / logika dan akal sehat yang saya tahu (yaitu flag seperti -Version --version -v -h ). Tetapi itu tidak membantu. Membantu , seperti biasa, Stackoverflow. Berikut ini cara mengetahui versi PowerShell


 $PSVersionTable.PSVersion 

Jawaban ini telah mengumpulkan hampir 3.000 suka! Ini tentu saja kurang dari jawaban untuk pertanyaan tentang bagaimana menutup vim , tetapi juga, saya pikir, adalah indikasi!


Secara umum, PowerShell adalah hal yang sangat kuat (setidaknya dibandingkan dengan cmd.exe)! Dan tentu saja saya akan terus menggunakannya.

Source: https://habr.com/ru/post/id433682/


All Articles