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

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

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

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

http://winscript.jp/powershell/131

https://stackoverflow.com/questions/44035319/get-childitem-length-is-wrong

によると、対象が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でも通る。