#6 Get-ChildItemで業務効率アップ

Powershellプログラミングの画像 PowerShell

本日のお題は「Get-ChildItem」です。
Get-ChildItemではファイル一覧を取得します。
ファイル一覧とは例えば、ディレクトリ(フォルダ)のパスを指定して、そのフォルダに入っているファイルのリストを取得できます。
以下のようなオプションがあります。

オプション説明使用例備考
-Path対象のパスを指定。絶対パス・相対パスどちらも可。Get-ChildItem -Path "C:\Logs"複数パスも配列で指定可能
-Filterファイル名や拡張子などのフィルターを指定。Get-ChildItem -Filter "*.txt"ワイルドカード使用可。高速だが柔軟性は低め
-Recurseサブフォルダーも含めて再帰的に取得。Get-ChildItem -Recurse大量のファイル取得時は注意
-Fileファイルのみ取得。Get-ChildItem -FilePowerShell 3.0以降
-Directoryディレクトリのみ取得。Get-ChildItem -DirectoryPowerShell 3.0以降
-Include指定したパターンに一致するアイテムを含める。Get-ChildItem -Include *.log-Recurse-Path と併用が必要な場合あり
-Exclude指定したパターンに一致するアイテムを除外。Get-ChildItem -Exclude *.bak-Include と同様、併用に注意
-Nameフルパスではなく名前のみを返す。Get-ChildItem -Name出力がシンプルになる
-Force隠しファイルやシステムファイルも含めて取得。Get-ChildItem -Force通常は表示されないファイルも取得可能
-Depth再帰の深さを制限(PowerShell 7以降)。Get-ChildItem -Recurse -Depth 2パフォーマンス制御に便利

正規表現を使用できる方はWhere-Objectというものを使用してファイル名を指定することもできます。
日々の業務でファイル名に日付を付けることが多いと思いますので以下のようにコードを書くと良いでしょう。

# folderの中の先頭に数字が8桁で末尾(拡張子)が.txtのファイル
Get-ChildItem -Path "C:\folder" | Where-Object { $_.Name -match "^\d{8}.*\.txt$" }

ちなみに上記のコードの説明ですが、
Where-Objectの前に置かれている “|” はパイプライン演算子と呼ばれます。
“|” より前のものを次の内容で処理してください。というものです。

“Where-Object” はコマンドレット(動詞-名詞の構文で書かれている)というものです。
英語っぽくも違和感がありますが「そういうものなんだ」程度で受け入れてください。
“Where-Object”の意味としては「条件に一致するオブジェクトを抽出」です。

次は{}の中の部分ですが、 “$_” の不可解さがあると思いますが、これも「そういうもの」として覚えてください。
“$_” とは “|” で渡された1つ1つのアイテムを表しています。
つまりGet-ChilItemで取得したすべてのファイルの中の1つということです。
続けて “-match” は、次と一致するものを条件としています。
条件は次のものです。
“^\d{8}.*\.txt$”
分解して解説します。
・”^” これは先頭を表しています。”^”の後ろに文字列を入れることで先頭に〇〇が付くという意味になります。
・”\d” これは数字を表しています。
・”{8} これは直前の正規表現を8回繰り返すことを表しています。ここでは数字が8回ですね。
・”.” これは何かしらの文字1文字を表します。
・”\.txt” これはエスケープと呼ばれる”\”と上記と同じく何かしらの1文字”.”となるのですが、
 エスケープされた文字はそのものが文字とされます。
 つまり通常では “.” は何かしらの1文字という正規表現になりますが、 “\.” とすることで正規表現から抜けて、”.”(ドット)として扱われます。結果、”.txt”という文字列になります。
・”$” これは末尾を表しています。”^”の対になるものですね。
繋げて解説すると、ファイル名が「先頭に数字8桁が付いている.txtで終わるファイル」ということです。

少々深堀りして解説しましたが、コマンドレットや正規表現を利用することで、コードを短縮して組み込むことが可能になります。ぜひ覚えましょう!

コメント

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