Windows に標準搭載されている、マイクロソフトが開発した .NET フレームワークが利用できるオブジェクト指向のコマンドラインインタプリタ (CLI) PowerShell で、フォルダ内の全ての拡張子を列挙するプログラム例とその実行結果について紹介します。
パート2では、前回実行した、フォルダ内の全ての拡張子を列挙するプログラムのパイプでつながった各コマンドレットとオプション(パラメータ)の処理内容を紹介します。
※ Windows PowerShell 5.1.19041.5965 を使用します。
※プログラムは自己責任でご利用ください。
前回の記事
前回は、PowerShell のバージョン情報の確認、ファイル構成の表示、フォルダ内の全ての拡張子を列挙するプログラム例とその実行結果について紹介しました。

全ての拡張子を列挙するプログラム例の解説
以下は、前回実行した、フォルダ内のファイルの拡張子を出力する PowerShell のプログラム例です。
Get-ChildItem -Recurse -File |
Where-Object { $_.Extension -ne "" } |
Select-Object -ExpandProperty Extension |
ForEach-Object { $_.TrimStart('.') } |
Sort-Object -Unique
今回は、このプログラムの | (パイプ) で連結した、各コマンドレットとそのオプション(正確にはパラメータ)の処理内容について紹介します。
Get-ChildItem の処理
Get-ChildItem -Recurse -File |
Get-ChildItem コマンドレットは、ファイル・フォルダ、レジストリキー、証明書など、指定したオプション(パラメータ)に応じて、さまざまな情報と、その下位の情報を取得します。
指定された1つまたは複数の場所にある項目と子項目を取得します。
Get-ChildItem (Microsoft.PowerShell.Management) – PowerShell | Microsoft Learn
-File オプション(パラメータ)を指定すると、カレントディレクトリにあるファイルの情報を FileInfo オブジェクトとして、1つずつ取得して、そのオブジェクトを | (パイプ) でつながれた次の処理に渡します。
注意
このパラメーターは、FileSystem プロバイダーでのみ使用できます。ファイルの一覧を取得するには、File パラメーターを使用します。 Recurse パラメーターは、Fileと共に使用できます。
Get-ChildItem (Microsoft.PowerShell.Management) – PowerShell | Microsoft Learn
-Recurse をつけると、サブフォルダなど、フォルダに含まれているすべての項目が対象になります。
-Recurse
指定した場所およびその場所内のすべての子項目から項目を取得します。
Get-ChildItem (Microsoft.PowerShell.Management) – PowerShell | Microsoft Learn
次の処理に渡される FileInfo オブジェクト
取得されたファイル一覧の情報は、1つのファイル情報を持つ FileInfo クラスのオブジェクトで、オブジェクト1つずつ、 | (パイプ) 経由で次の処理に渡されます。
オブジェクト型は、オブジェクトの種類を通知します。 たとえば、ファイルを表すオブジェクトは、 FileInfo オブジェクトです。
about_Objects – PowerShell | Microsoft Learn
FileInfo クラスは、ファイルの操作を行うメソッド、拡張子などのファイルの情報を取得できるプロパティを持ちます。
ファイルの作成、コピー、削除、移動、および開くためのプロパティとインスタンス メソッドを提供し、FileStream オブジェクトの作成に役立ちます。 このクラスは継承できません。
(中略)
FileInfo クラスには、ファイルに関する情報を取得できる次のプロパティが用意されています。 各プロパティの使用方法の例については、プロパティ ページを参照してください。
FileInfo クラス (System.IO) | Microsoft Learn
$_ の意味
$_ は | (パイプ) 経由で渡されたオブジェクトにアクセスできる変数です。
$_
$PSItem
と同じ。 パイプライン オブジェクト内の現在のオブジェクトを格納します。 この変数は、パイプライン内のすべてのオブジェクトに対してアクションを実行するコマンドで使用できます。詳細については、「 about_PSItem」を参照してください。
about_Automatic_Variables – PowerShell | Microsoft Learn $_
先ほどの Get-ChildItem -File -Recurse では、 FileInfo オブジェクトが $_ に格納され、 | (パイプ) 経由で受け取った次の処理で、オブジェクト1つずつ処理します。
Where-Object の処理
Where-Object(条件文)で、その条件を満たしたオブジェクトだけを選別(フィルタリング)して、例では次の処理へと | (パイプ)で渡します。
-ne オプション(switch パラメータ)は、左辺と右辺が異なる場合 (not equal) のときに条件を満たすので、この場合は、前の処理から受け取った File オブジェクトの拡張子の文字列が “” (空文字列)ではない場合に、次の処理へと File オブジェクトを渡します。
Where-Object (Microsoft.PowerShell.Core) – PowerShell | Microsoft Learn
Where-Object
コマンドレットは、渡されるオブジェクトのコレクションから、特定のプロパティ値を持つオブジェクトを選択します。 たとえば、Where-Object
コマンドレットを使用して、特定の日付以降に作成されたファイル、特定の ID を持つイベント、または特定のバージョンの Windows を使用するコンピューターを選択できます。
パイプ経由で渡された $_ に格納されている FileInfo オブジェクトの Extension は、 先頭の . を含むファイル名の拡張子部分の文字列です。
ファイル名全体であっても先頭のドット
.
を含む、ファイル名の拡張子部分を取得します。拡張子がない場合は空の文字列を取得しますFileSystemInfo 拡張子を格納している文字列。
FileSystemInfo.Extension プロパティ (System.IO) | Microsoft Learn
Select-Object の処理
前の処理から受け取った File オブジェクトの Extension プロパティを選択して、その選択した . を含む拡張子の文字列 Extension プロパティだけを次の処理に渡します。
Select-Object (Microsoft.PowerShell.Utility) – PowerShell | Microsoft Learn
Select-Object
コマンドレットは、オブジェクトまたはオブジェクトのセットの指定されたプロパティを選択します。 加えて、配列内の一意のオブジェクト、指定された数のオブジェクト、または指定された位置にあるオブジェクトを選択することもできます。
ForEach-Object の処理
ForEach-Object コマンドレットでは、パイプラインの上流から1個ずつ渡されてくるオブジェクトを逐次処理します。
※パイプラインの上流から渡されたオブジェクトを1個ずつ処理するだけで、この ForEach-Object のスコープでループ処理を行うわけではありません。
ForEach-Object (Microsoft.PowerShell.Core) – PowerShell | Microsoft Learn
ForEach-Object
コマンドレットは、入力オブジェクトのコレクション内の各項目に対して操作を実行します。 入力オブジェクトは、コマンドレットにパイプ処理することも、 InputObject パラメーターを使用して指定することもできます。
上流から | (パイプ)を通じて渡されたオブジェクトは $_ に格納されています。
今回の例では、前述の各処理ごとに $_ には以下の内容が格納されています。
- $_ = FileInfo オブジェクト
- $_ = 拡張子のある FileInfo オブジェクト
- $_ = FileInfo オブジェクトの Extension プロパティ( . を含む拡張子の文字列)
今回の ForEach-Object では、受け取った拡張子の文字列の先頭の . を取り除きます。
ForEach-Object { $_.TrimStart('.') } |
String クラスの TrimStart メンバ関数は、先頭から指定した文字を削除します。
指定した文字の先頭のすべての出現箇所を現在の文字列から削除します。
String.TrimStart メソッド (System) | Microsoft Learn (char)
同じ文字が続いている限りそれらを削除します。
以下はその例です。
– が3個続いている部分は消されますが、最初に – がない場合は、そのあとにある – は削除されません。
PS G:\Dev\PowerShell\Enumerate-Extensions\TestFolder1> "---abc---xyz---".TrimStart('-')
abc---xyz---
PS G:\Dev\PowerShell\Enumerate-Extensions\TestFolder1> "abc---xyz---".TrimStart('-')
abc---xyz---
Sort-Object の処理
Sort-Object では、パイプラインの上流で逐次処理された全てのオブジェクトを受け取った後に、それらのオブジェクトをソートします。
その後、さらに | (パイプ) があれば、ソートした後のオブジェクトを1個ずつ逐次下流に渡して処理させます。
Sort-Object (Microsoft.PowerShell.Utility) – PowerShell | Microsoft Learn
Sort-Object
コマンドレットは、オブジェクトのプロパティ値に基づいてオブジェクトを昇順または降順で並べ替えます。
-Unique オプション(switch パラメータ)を指定すると、重複を排除します。
今回の例では、同じ拡張子の文字列は1個だけになり、同じ拡張子が何回も表示されないようにします。
-Unique
Sort-Object
が重複を排除し、コレクションの一意のメンバーのみを返すように指定します。 並べ替えられた出力には、一意の値の最初のインスタンスが含まれます。一意の では大文字と小文字が区別されません。 文字ケースによってのみ異なる文字列は同じと見なされます。 たとえば、文字や CHARACTER などです。
Sort-Object (Microsoft.PowerShell.Utility) – PowerShell | Microsoft Learn
Sort-Object が上流の処理が全て完了するのを待つ流れについては、以下の記事を参照してください。
今回はここまで
次回は、拡張子の列挙の処理に、隠しフォルダを対象に含むかどうかを指定できる -Force オプション(switch パラメータ)について紹介します。
参照サイト Thank You!
- PowerShell とは – PowerShell | Microsoft Learn
- Get-ChildItem (Microsoft.PowerShell.Management) – PowerShell | Microsoft Learn
- ForEach-Object (Microsoft.PowerShell.Core) – PowerShell | Microsoft Learn
- Sort-Object (Microsoft.PowerShell.Utility) – 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
コメント