2019年2月23日土曜日

PowerShell 王道の使い方(?) ファイルの一覧を取得してCSVファイルに出力したい

今回は、PowerShellの使い方でも特に王道かなと思われる、「ファイルの一覧を取得してCSVファイルに出力」をやってみたいと思います。


$F = (GET-CHILDITEM "C:\Windows\SysWow64" | ?{$_.EXTENSION -match ".EXE" -and !($_.PSIsContainer)}) 
$F2= ($F | SORT @{Expression="LastWriteTime";Descending=$true},Name)
$F2 |SELECT-OBJECT Directory,Name,LastWriteTime,Length| EXPORT-CSV C:\Temp\FILELIST.CSV -encoding UTF8 -NotypeInformation

↑コマンドは横に長くなるので、結果を2段階に分けて取得して、最後にEXPORT-CSVコマンドレットでCSVファイルにぶっこむ、というやり方をしたいと思います。

  • GET-CHILDITEMで情報を取得し、拡張子EXEだけ、ファイルだけに絞り込み。
  • 最終更新日を降順、名前を昇順でソート。
  • Directory、Name、LastWriteTime、LengthをCSVに出力
というやり方になります。

ソートが割とやっかいで、全部が昇順なら楽なのですが、降順と昇順を混在させようとすると、連想配列(ハッシュ)で書かないといけなくなるのでどうしても記述が長くなってしまいます。

また、EXPORT-CSVですが、文字コードが初期値でASCIIなので日本語が文字化け(?になる)します!!

-encodingオプションに、UTF8だとバイトオーダーマーク(BOM)付きUTF8で、defaultだとShift_JISになります。

EXPORT-CSVのUTF-8は3バイトのバイナリ(BOM)がくっついているので、プログラムコードで入力データとして使用する時は注意が必要だったりします。

このBOMと改行コード(など)は、データをテキスト形式で扱う時に、まれに直撃弾を食ってプチパニックになるので心構えが必要だったりしますね。


↑実行すると、ファイルの一覧が最終更新日付の降順、名前の昇順にソートされ、ディレクトリ(フォルダ)、名前、最終更新日、バイト数項目でCSVに書かれます。


↑ファイルの内容の確認は、GET-CONTENT ファイル名(フルパス)でもOKです。

EXPORT-CSVを使うメリットとしては、区切り文字(デリミター)や、タイトル行の付与に煩わされなくて良いという事と、デメリットとしては、文字コードや出力内容などに融通が利かないため、場合によっては使えなくなるという所でしょうか。