Windows に標準搭載されている、マイクロソフトが開発した .NET フレームワークが利用できるオブジェクト指向のコマンドラインインタプリタ (CLI) PowerShell で、フォルダ内の全ての拡張子を列挙するプログラム例とその実行結果について紹介します。
次回は、拡張子の列挙の処理で、正規表現を用いて指定したフォルダとその中にある項目を除外するプログラム例を紹介します。
※ Windows PowerShell 5.1.19041.5965 を使用します。
※プログラムは自己責任でご利用ください。
前回の記事
前回パート3では、拡張子の列挙の処理に、隠しフォルダを対象に含むかどうかを指定できる -Force オプション(switch パラメータ)について紹介しました。
正規表現でパスを比較して、特定のフォルダを除外する
特定のフォルダを処理から除外するには、Where-Object の FileInfo オブジェクトの選別で、そのオブジェクトのファイルパスに、指定したフォルダ名がマッチしないことを条件にする方法があります。
Where-Object については、パート2を参照してください。
.git フォルダを除外する Where-Object の条件式
.git フォルダを処理から除外したい場合は、以下のようにプログラム中の Where-Object コマンドレットでフォルダ名を指定します。
Get-ChildItem -Recurse -File -Force |
Where-Object {
$_.FullName -notmatch '\\\.git\\' -and
$_.Extension -ne ''
} |
Select-Object -ExpandProperty Extension |
ForEach-Object { $_.TrimStart('.') } |
Sort-Object -Unique
Where-Object コマンドレットで、文字列のあとに -nomatch を指定すると、正規表現のパターンに当てはまらない $_ に格納されているオブジェクトだけが選別されて、| (パイプ) でつながった次の処理に渡されます。
そのため、このパターンに当てはまった場合は、そのファイルパスの処理は除外されます。
-match
と-notmatch
正規表現を使用して、左側の値のパターンを検索します。 正規表現は、メール アドレス、UNC パス、書式設定された電話番号などの複雑なパターンと一致する場合があります。 右側の文字列は、 規則 規則に従う必要があります。比較演算子について – PowerShell | Microsoft Learn'bag' -notmatch 'b[iou]g' # Output: True
例で用いた ‘\\\.git\\’ は .git というフォルダ名が含まれる FileInfo オブジェクトを処理から除外します。
\ は、エスケープ文字の先頭で使い、 \\ は文字の \ を、 \. は文字の . を表しています。
\ は改行コードの \r\n のように特殊な扱いをするため、ただの文字として \ を記述するには \\ を用います。
. も正規表現では「任意の1文字」という特殊な意味があるため、ただの文字として . を記述するには \. を用います。
これにより \.git\ という .git のフォルダ名を、パス区切り文字で囲った文字列を powershell の正規表現で記述できました。
前後を \ で区切ったので、 xxx.gityyy のような文字列はマッチせず、 .git だけがマッチします。
'\\\.git\\'
↑ ↑ ↑
│ │ └─ 最後の `\\` → パスの区切りの \ を表すエスケープ文字です。
│ └──── `\.` → . を正規表現の「任意の1文字」ではなく「. という文字」として扱うためのエスケープ文字です。
└─────── 最初の `\\` → パスの区切りの \ を表すエスケープ文字です。
前述のプログラムを powershell アプリに貼り付けて Enter キーで実行すると csv, md, png, txt 拡張子が列挙されました。
※ Windows 10 の場合は、エクスプローラでサンプルフォルダを開いて、アドレスバーに powershell⏎ と入力すると、そのフォルダをカレントディレクトリにして powershell アプリが起動します。
Where-Object コマンドレットの -nomatch で指定した .git フォルダ内にある .sample 拡張子は、処理から除外されたので表示されませんでした。

PS G:\Dev\PowerShell\Enumerate-Extensions\TestFolder2> Get-ChildItem -Recurse -File -Force |
>> Where-Object {
>> $_.FullName -notmatch '\\\.git\\' -and
>> $_.Extension -ne ''
>> } |
>> Select-Object -ExpandProperty Extension |
>> ForEach-Object { $_.TrimStart('.') } |
>> Sort-Object -Unique
csv
md
png
txt
除外するフォルダの追加と、2階層のフォルダ名の指定
さらに処理から除外するフォルダを増やす場合は、条件式の行を増やします。
例えば、以下のように secret フォルダと、Image\secret フォルダのように、同じ secret フォルダが複数あり、 Image\secret フォルダだけを処理から除外したい場合の条件式を追加してみましょう。
PS G:\Dev\PowerShell\Enumerate-Extensions\TestFolder3> tree /f
フォルダー パスの一覧: ボリューム ボリューム
ボリューム シリアル番号は 9691-AE5E です
G:.
│ 123.csv
│ hello, world.txt
│ moon.png
│ readme.md
│ こんにちは世界.txt
│
├─Image
│ │ clowd.png
│ │ sun.png
│ │
│ └─secret
│ lighting.bmp
│
└─secret
hello.hsp
Image\secret フォルダのように、あるフォルダの下位のフォルダを除外する場合は「上位フォルダ名\\無視するフォルダ名\\」を指定します。
※「\\上位フォルダ名\\無視するフォルダ名\\」のように最初にも\\を付けた方が、上位フォルダ名の前に文字列があるものを正規表現に含めないため、厳密です。
Get-ChildItem -Recurse -File -Force |
Where-Object {
$_.FullName -notmatch '\\\.git\\' -and
$_.FullName -notmatch 'Image\\secret\\' -and
$_.Extension -ne ''
} |
Select-Object -ExpandProperty Extension |
ForEach-Object { $_.TrimStart('.') } |
Sort-Object -Unique
結果として、 Image\secret だけにある bmp 拡張子は出力されず、 secret フォルダだけにある hsp 拡張子は表示されました。

PS G:\Dev\PowerShell\Enumerate-Extensions\TestFolder3> Get-ChildItem -Recurse -File -Force |
>> Where-Object {
>> $_.FullName -notmatch '\\\.git\\' -and
>> $_.FullName -notmatch 'Image\\secret\\' -and
>> $_.Extension -ne ''
>> } |
>> Select-Object -ExpandProperty Extension |
>> ForEach-Object { $_.TrimStart('.') } |
>> Sort-Object -Unique
csv
hsp
md
png
txt
まとめ
今回は全4話で、Windows に標準搭載されている、マイクロソフトが開発した .NET フレームワークが利用できるオブジェクト指向のコマンドラインインタプリタ (CLI) PowerShell で、フォルダ内の全ての拡張子を列挙するプログラム例とその実行結果について紹介しました。
参照サイト Thank You!
- PowerShell とは – PowerShell | Microsoft Learn
- Get-ChildItem (Microsoft.PowerShell.Management) – PowerShell | Microsoft Learn
- about_Automatic_Variables – PowerShell | Microsoft Learn
- Where-Object (Microsoft.PowerShell.Core) – PowerShell | Microsoft Learn
- Select-Object (Microsoft.PowerShell.Utility) – PowerShell | Microsoft Learn
- about_Pipelines – PowerShell | Microsoft Learn
- PowerShell – Wikipedia
- Git
記事一覧 → Compota-Soft-Press
コメント