一人情シスのつぶやき

名古屋の中小企業で一人情シスをしている作者が、日々の業務で思うことをつぶやきます。

Get-ChildItemからのLengthプロパティでのファイル容量取得ではまる

PowerShellで特定のフォルダ配下に存在する一定容量以上のファイルをリストアップするスクリプトを作成。

Get-ChildItem -Recurse  . | Where-Object{$_.Length -ge 10*1024*1024 }

よくあるお題であちこちにサンプルがあるのだが、なぜかLengthプロパティがないというエラーが出る。

色々調べた結果、Set-Strictのversionを2以上にすると発生することが分かった。1の場合には存在しないプロパティでも無視することで動作するようだ。

winscript.jpstackoverflow.com によると、対象がdirectoryの場合に配下のFileInfoとDirectoryInfo配列のサイズを返すところ、配下が1つのみの場合だと存在するFileInfo,またはDirectoryInfoのLengthを返そうとするためで、無理やり配列にすればいけるとあるが、ダメ。Directoryに対しては配下にファイルが無くても、何個あってもLengthプロパティへの問い合わせはエラーとなる。PowerShell Ver.5.1.17763.503 on Win10 1809(64bit)で確認。

結論としては、Directoryの中の個数をカウントしてもしょうがないので、対象をファイルのみにすることだった。

Get-ChildItem -Recurse -File . | Where-Object{$_.Length -ge 10*1024*1024 }

これであれば、Set-StrictのVersionがlatestでも通る。