諸般の事情からファイルの一覧を取得して分析をしたかったのだけれど、標題の件のやり方がなかなか解らなかったのでメモっておきます。
はじめに
メインはLinuxなどのUNIX系OSな人です。よってPowerShellは本当によくわかっていません。なので、本記事の読者は似たような人を想定しています!
本編
やりかた
$target = "c:\path\to\target\dir"
$outfile = "c:\path\to\result.csv"
Get-ChildItem -Recurse $target | Where-Object { ! $_.PSIsContainer } | Select-Object FullName, Length, CreationTimeUtc, LastWriteTimeUtc, LastAccessTimeUtc | Export-CSV -path $outfile -Encoding UTF8 -NoTypeInformation
(若干の)解説
まず前提として
従来のDOSやLinuxコマンドとは異なり、PowerShellの場合、大ざっぱにいうと、コマンドの実行結果は何らかのオブジェクトのインスタンスが返却されます。なので、パイプで多段化する際に、 grep
のように絞り込んだり awk
のように変形させるだけではなくて、情報を増やす事も可能だったりします。
そして、コマンドの表示結果のカスタマイズ(e.g. 表示項目を増やしたり形式を変えたり)というのは --help
相当の Get-Help
を使っても出てきませんので、各コマンドがどんなインスタンスを返却するのかを考えつつ、絞り込んだり表示項目や書式をカスタマイズする必要があります。
Get-ChildItem
Get-Helpだと殆どオプションが出てきませんが、 Get-Help Get-ChildItem -Online
だと、上記で利用した -Recurse
等も出てきます。今回のサンプルだと、再帰的に見たかったので -Recurse
のみ入れました。
Where-Object
今回はディレクトリ不要でファイルだけ取りたかったので、フォルダでないものになるように絞り込みをしています。こちらもローカルで見れるヘルプは大した事が載っていないので、 -Online
をつけてヘルプを見ましょう!
Select-Object
ここがDOSやLinuxのshellと特に異なっている部分です。コマンドはインスタンスを返しているため、何も指定しないと既定の出力(全部ではなくてメジャー項目を適当なフォーマットで出力する)となります。必要項目をちゃんと指定してあげると、指定した項目は漏れなく表示されます。
Export-CSV
こちらは直感的なのでまずまずわかりやすいと思いますが、 -NoTypeInformation
をしないと1行目にゴミが入ります。これは入れましょう。また、エンコーディングを指定しないとASCII扱いとなり、日本語等々思い切り文字化けになるので、こちらも基本指定しましょう。
その他注意点
260文字を超えるPATHがあるとエラーになります。この場合はWindows10やWindows Server 2016以降であれば、 LongPathsEnabled
を有効にすると制限を解除できるようです。それ以前の場合はどうにもなりませんので、サードパーティのツール等々を使用しましょう。
個人的な感想
LinuxのShellとはだいぶ異なるので、正直取っつき辛いなと思っていたのですが、実は結構高機能(今回は紹介していませんが、.Netのちょっとした処理もすぐに実行できる)なので、ちょっとしたことなら意外と出来たりします。パス問題のように、どうにもならないケースも多々あるのでそれが難しいところですが…。