Powershellで特定のフォルダの拡張子の一覧を取得する

特定のフォルダ配下に含まれるファイルの拡張子の一覧を取得するための方法のメモ

Powershellを使ってファイルの拡張子を得るにはいくつか方法があって、例えばSystem.IO.Pathクラスを使う手もあったりするが、それよりはSystem.IO.FileInfoクラスを生成してしまった方が楽だし応用が効くように思う。

PS D:\> Get-ChildItem -Recurse -File | %{$_.Extension} | Sort-Object -CaseSensitive | Get-Unique
.log
.txt

やっていることは以下のような流れ

  • Get-ChildItem -Recurse -Fileでカレントディレクトリのファイルをサブディレクトリ含めて取得
  • FileInfoのExtentionフィールドで拡張子を取得して
  • Sort-Object -CaseSensitiveで大文字小文字を区別してソートしたうえで
  • Get-Uniqueでユニークにする(重複を除く)

なお、Get-ChileItemのFileパラメータはv3からしか使えないので、v2の場合はWhere-Objectの抽出条件でFileInfoのAttributeか、PSIsContainerを使って絞りこむことで代替する。

PS D:\SandBox> Get-ChildItem -Recurse | Where-Object{$_.Attribute -ne "Directory" } | %{$_.Extension} | Sort-Object -CaseSensitive | Get-Unique

PS D:\SandBox> Get-ChildItem -Recurse | Where-Object{$_.PSIsContainer -eq $false } | %{$_.Extension} | Sort-Object -CaseSensitive | Get-Unique

また、特定のファイルの拡張子を取得するときはGet-ItemでFileInfoのオブジェクトを取得すればよい。Alias(gi)を使うと楽に書ける。

PS D:\> $(Get-Item .\random.log).Extension
.log