PowerShellでGet-ChildItemで取得したファイルの一覧をWhere-Objectで絞り込む。

powershell コンピュータ
powershell

とあるフォルダのファイルの一覧をGet-ChildItemで取得してみます。通常Get-ChidItemはフォルダも返しますが、ファイルのみ取得するために-Fileオプションを付加しています。

PS H:\ps1> Get-ChildItem . -File


    ディレクトリ: H:\ps1


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2023/10/20     11:02            361 NewsReader.ps1
-a----        2023/07/21     17:25        1603969 Pictures.zip
-a----        2023/08/18     10:57           1434 RecentFiles.ps1
-a----        2023/08/18     10:57          15017 RecentLog.csv
-a----        2023/08/18     10:02            297 RecentLog.ps1
-a----        2023/08/31     11:39            588 resx.ps1
-a----        2023/08/31     11:39           6056 sample.resx
-a----        2023/07/21     17:25            771 ZipOptiPNG.ps1
-a----        2023/10/13      9:42              0 さんぷる.txt

Where-Objectでファイル名にRecentから始まるファイルのみに絞り込みます。

PS H:\ps1> Get-ChildItem . -File | Where-Object { $_.Name -match "^Recent" }


    ディレクトリ: H:\ps1


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2023/08/18     10:57           1434 RecentFiles.ps1
-a----        2023/08/18     10:57          15017 RecentLog.csv
-a----        2023/08/18     10:02            297 RecentLog.ps1

Where-Objectは{}内部で記述したコードの戻り値が真のオブジェクトのみに絞りこまれます。$_がGet-ChildItemからパイプラインで送られたオブジェクト(この場合ファイル1件分)で名前(ファイル名)にアクセスするため$_.Nameとしています。次の-matchは正規表現で文字列が条件にマッチするか確認する演算子になります。マッチした場合真、そうでない場合偽を返します。次に正規表現の文字列をセットしています。一般的にreturn 変数で戻り値を返しますが、PowerShellの場合{}の最後に処理された条件式や変数が戻り値として扱われるので、条件式の結果が戻り値になりWhere-Objectの絞り込み条件として使われます。

ファイル名で絞り込みをするだけなのに結構コードが長い感じがしますが、Where-Objectでコードが複数行にまたがる複雑な絞り込み条件を記述することが出来ますので、コード量は多くなりますがその分高機能だといえます。

絞り込んだファイルを、別のディレクトリコピーしてみます。

PS H:\ps1> Get-ChildItem . -File | Where-Object { $_.Name -match "^Recent" } | Copy-Item -Destination H:\PowerShellScript
PS H:\ps1> ls ..\PowerShellScript


    ディレクトリ: H:\PowerShellScript


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2023/08/18     10:57           1434 RecentFiles.ps1
-a----        2023/08/18     10:57          15017 RecentLog.csv
-a----        2023/08/18     10:02            297 RecentLog.ps1

Copy-Itemは色々なオブジェクトをコピーするコマンドレットですが、ファイルオブジェクトを引数にするとファイルのコピーコマンドとして使えます。ファイルのコピーコマンドで必須となる引数は“コピー元のファイル”“コピー先の場所”が必要となります。今回のサンプルでは-Destination
“コピー先の場所”を指定していますが”コピー元のファイル”は指定していません。”コピー元のファイル”はパイプラインで絞り込まれたファイルがコピーする対象ファイルとなります。
サンプルではコピーされたことを確認する為ls(Get-ChildItemのエイリアス)で”コピー先の場所”であるPowerShellScriptのファイルの一覧を取得していますが、Recentから始まるファイルのみがコピーされていることが確認できます。

今回はファイルをコピーしましたが、同様に移動や削除することも出来ます。今回のサンプルの様に数個のファイルであればPowerShellを使う必要もないかもしれませんが、多量のファイルを処理したい場合効果を発揮すると思われます。

以上

コメント