フォルダ内の全てのファイルの拡張子の一覧を表示するバッチファイル例4/4

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 パス、書式設定された電話番号などの複雑なパターンと一致する場合があります。 右側の文字列は、 規則 規則に従う必要があります。

'bag'        -notmatch 'b[iou]g'   # Output: True
比較演算子について – PowerShell | Microsoft Learn

例で用いた ‘\\\.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 拡張子は、処理から除外されたので表示されませんでした。

フォルダ内の全てのファイルの拡張子の一覧を表示するバッチファイル例5
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 拡張子は表示されました。

フォルダ内の全てのファイルの拡張子の一覧を表示するバッチファイル例6
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!

記事一覧 → Compota-Soft-Press

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました