PowerShellでファイルの内容を結合する方法。 そして苦しむな

なすべきこと



1つのディレクトリにある一連のテキストファイルを1つのファイルに結合する必要がありました。 私はこれを自分の手でやりたくありませんでしたし、Googleはいつものように私の助けになりました! PowerShellのようなツールのパワーについて多くのことを聞き、この「メガタスク」に使用することにしました。 少なくとも私はcmd.exeの悲惨さに慣れていないからです。 まあ、あなたの手でそれを行うことは私たちの方法ではありません。







何が悪かった



Googleは簡単なコマンドでこれができると言った







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





「本当にすごい!ある種のUnixウェイ!」 思った。 コマンドをコピーし、少し変更して、Enterキーを押しました。 カーソルは新しい行に移動しました... ファイルマネージャーで、最終ファイルを開きました。これは実際に目的の結果に似たものでした。 ソースファイルから多くの行がありました。 コンソールに戻ると、プロセスはまだ...プロセス中であることがわかりました。 Ctrl + Cを支援しました







ファイルサイズを見ると、なんとなく疑わしいほど大きいことがわかりました。 そのサイズは100メガバイトを超えました。 水のデータはそれほど大きくありませんでしたが。







なぜこれが起こったのですか?



それはすべて、私の「簡単な変更」についてです。 拡張フィルターは必要ありませんでした。 また、このパラメーターはオプションです。 そして、チームが結果ファイルを作成し、それがディレクトリにあることを確認し、最後にその内容を読み、書き留めて、 Ctrl + C押すまでそれを行ったことが判明しました。私は他の何かのために出力ファイルの継続的な成長を説明できませんでした







これを「無菌」条件下で繰り返しました。 単純さと純度のために、作業中のマシンを殺すのが怖いので、別のディレクトリで実験をしました。







  1. テキストファイルを作成します







     echo "Hello world" > hello.txt
          
          





  2. コマンドを実行します







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





    または短い形式で







     dir | cat | Out-File result.txt
          
          





    問題が繰り返されます。 結果のファイルは大きくなり、ソースからの行(またはそれ自体からの行?)で補充されます。 実行の10秒で:







    • ソースファイルの1行が40万行になります
    • ファイルサイズが11バイトからほぼ8メガバイトに増加しました
    • プロセッサの負荷は約20〜25%です。
    • ディスクサブシステムまたはRAMの過負荷はありません。 どうやら、PowerShellはこれらのコンポーネントの操作に関して最適化されています。 )




また、興味深いのは、最後のコマンドのパラメーターとしてディレクトリ内の唯一のファイルの名前を指定すると、もちろん、 ドラムロールを推測したことです...ファイルに空が書き込まれます!







ここに、このような「興味深い」作業ロジックがあります







どうした



最初のステップで作成されたファイルは大きくなり始めます。 この動作は少なくとも予測不可能です。

また、オペレーティングシステムが正常に動作し続けることも驚きでした。 ユーザーの作業をブロックせずに、ファイルの成長が遅くなります(実際にそうではありませんか?)。







危険なもの



ディスクスペースの感知できない充填。







避ける方法



入力ファイルのリストをフィルタリングします。







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





ただし、入力ファイルと出力ファイルの両方がフィルター条件に一致する場合、これは保存されません







PS



PowerShellバージョン5.1.17134.407を使用しています。 ところで、見つけるために、私はすべてのメソッド/ロジックと私が知っている常識を試しました (つまり-Version --version -v -hのようなフラグ)。 しかし、それは助けにはなりませんでした。 いつものように、Stackoverflowを手伝いました 。 PowerShellのバージョンを確認する方法は次のとおりです。







 $PSVersionTable.PSVersion
      
      





この回答では、ほぼ3,000件のいいね! これはもちろん、 vimを閉じる方法の質問に対する答えよりも少ないですが、また、私は、示唆的だと思います!







一般的に、PowerShellは(少なくともcmd.exeと比較して)本当に強力なものです! そしてもちろん、私はそれを使い続けます。








All Articles