フォルダーのみ、ファイルのみの一覧を取得する

 Get-ChildItemコマンドレットはフォルダーとファイルの両方を一覧表示します。どちらかのみを一覧表示したい場合は Where-Objectコマンドレット( ?{ … } )を使用してフィルタリングします。

ファイルサイズを判定する方法

コマンド例

> # フォルダーのみを取得
> Get-ChildItem | ?{ $_.Length -eq $null }
>
> # ファイルのみを取得
> Get-ChildItem | ?{ $_.Length -ne $null }

解説

 適当なフォルダーでGet-ChildItemを実行すると、ファイルのLengthプロパティには何かしら値が入っているのに対し、フォルダーのLengthプロパティには値が入っていないことが分かります。ちなみに、0バイトのファイルであれば0が表示されますので、ファイルのLengthプロパティが$nullと一致することはありません。

 これを利用して、Lengthプロパティと$nullを比較すれば、フォルダーとファイルの違いを判別することができます。

データ型を判定する方法

コマンド例

> # フォルダーのみを取得
> Get-ChildItem | ?{ $_.GetType().Name -eq "DirectoryInfo" }
>
> # ファイルのみを取得
> Get-ChildItem | ?{ $_.GetType().Name -eq "FileInfo" }
>

 ファイルのオブジェクトはFileInfo型、フォルダーのオブジェクトはDirectoryInfo型なので、それを判別します。

Test-Pathを使用する方法

コマンド例

> # フォルダーのみを取得
> Get-ChildItem | ?{ Test-Path -LiteralPath $_ -PathType Container }
>
> # ファイルのみを取得
> Get-ChildItem | ?{ Test-Path -LiteralPath $_ -PathType Leaf }

解説

 コマンドレットにつけている -LiteralPath は、ファイル名に[ や ]が含まれている場合のための備えです。これらが含まれていないことが確実ならば次のように省力しても構いません。

PS U:\Ps> Get-ChildItem | ?{ Test-Path $_ -PathType Leaf }

 この方法は、ファイルとフォルダーの判別だけでなく、レジストリのキーと値を判別するなどにも流用できる方法です。

inserted by FC2 system