【PowerShell】フォルダ配下のファイルのリストを取得する方法【Get-ChildItem】
PowerShellのGet-ChildItemコマンドレットを用いて「特定のフォルダ配下にあるファイルのリストを取得する方法」を紹介します。
結論:下記のコードで実施します。
①フォルダ直下のファイル一覧を取得する
Get-ChildItem -Path "FOLDER_PATH" -File
②ファイル配下(サブフォルダ含む)のファイル一覧を取得する
Get-ChildItem -Path "FOLDER_PATH" -Recurse -File
取得したファイル1つ1つに対して処理をしたい場合は、変数に格納してforeachでループします。
1# ファイルのリストを変数 $folderFileList に設定
2$folderFileList = Get-ChildItem -Path "FOLDER_PATH" -File
3
4#取得したファイルリストをループ($item変数に設定)
5foreach($item in $folderFileList)
6{
7 # $item(ファイル毎)に関する処理
8}
以下、コードの解説です。(公式リファレンスはこちら)
子項目を取得する「Get-ChildItem」コマンドレット
PoerShellのGet-ChildItemコマンドレットは、指定したフォルダ配下のフォルダやファイルを取得することができます。
例えば、下記のような構成でファイルやフォルダが配置されている場合を見てみます。
このとき、コマンドレットを実行したときの出力は下記のようになります。
1PS C:\Users\user> Get-ChildItem "E:\test"
2
3
4 ディレクトリ: E:\test
5
6
7Mode LastWriteTime Length Name
8---- ------------- ------ ----
9d----- 2023/08/11 7:31 フォルダ1
10-a---- 2023/08/08 23:34 0 ファイル1.txt
11-a---- 2023/08/08 23:35 0 ファイル2.bmp
12-a---- 2023/08/08 23:35 8860 ファイル3.xlsx
13-a---- 2023/08/08 23:35 22 ファイル4.zip
デフォルトではMode(属性)、LastWriteTime(更新日時)、Length(ファイルサイズ)、Name(名前)が出力されます。なお、Modeで出力される英字が意味するのは下記のとおりです。
l
(リンク)d
(ディレクトリ)a
(アーカイブ)r
(読み取り専用)h
(非表示)s
(システム)
「Get-ChilItem」コマンドレットのオプション
Get-ChildItemコマンドレットはいくつかの特定のパラメータを指定することで、様々なオプションを付与できます。ここではよく使うものをいくつか紹介します。
パラメータ | できること | 使用例 |
---|---|---|
Path | 対象フォルダを指定する | Get-ChildItem -Path C:\test |
Name | 名前のみ取得する | Get-ChildItem -Path C:\test -Name |
Recurse | サブフォルダまで対象にする | Get-ChildItem -Path C:\Test -Recurse |
Depth | 走査する階層を指定する | Get-ChildItem -Path C:\Test -Depth 2 |
Include | 名前に含む文字列を指定する | Get-ChildItem -Path C:\test* -Include *.txt |
Exclude | 名前に含まない文字列を指定する | Get-ChildItem -Path C:\test* -Exclude *.log |
File | ファイルのみ取得する | Get-ChildItem -Path C:\test -File |
Directory | フォルダのみ取得する | Get-ChildItem -Path C:\test -Directory |
例えば、冒頭の例では「File」や「Recurse」を使用して、取得対象をファイルだけに絞ったり、再帰処理でサブフォルダまで走査したりさせています。
各パラメータは、制約が設けられている場合もある(「Include」を使うときはPathにワイルドカードを指定する 等)ので、上手く動かない場合は公式リファレンスで確認することをお勧めします。
「Get-ChilItem」コマンドレットの使用例
ここでは、Get-ChildItemコマンドレットを使って、こんな処理を作ってみます。
「E:\test」配下(サブフォルダ含む)にあるすべてのファイル名のリストを表示する
実行するのはこんなコードです。
Get-ChildItem -Path E:\test -File -Recurse -Name
対象フォルダであるE:\testは、「Path」パラメータの引数として渡します。取得したいのはファイルのみのため「File」パラメータを指定。サブフォルダがある場合はその中身まで走査したいので「Recurse」も指定します。今回必要なのはファイル名のみなので「Name」パラメータも指定しておきました。実行結果は下記のとおりです。
1PS C:\Users\user> Get-ChildItem -Path E:\test -File -Recurse -Name
2Excelファイル.xlsx
3zipファイル.zip
4テキストファイル.txt
5テキストファイル2.txt
6テキストファイル3.txt
7テキストファイル4.txt
8テキストファイル5.txt
9画像ファイル.bmp
10子フォルダ\子テキストファイル.txt
11子フォルダ\子テキストファイル2.txt
12子フォルダ\孫フォルダ\孫テキストファイル.txt
13子フォルダ\孫フォルダ\孫テキストファイル2.txt
14子フォルダ\孫フォルダ\孫テキストファイル3.txt
取得したファイルに対して処理をしたい場合は、こちらで説明したとおりforeachループを使用します。
まとめ
PowershellのGet-ChildItemコマンドレットを使って特定フォルダ配下のファイルを取得する方法を紹介しました。
本ページの内容を組み込めば、
- ファイルの一覧を作成する
- ファイルのプロパティ(作成日時や更新日時)を一括で書き換える
- ファイルの名称をルールに従って変更する
などの処理を作れるようになります。
WindowsのPCではすぐに作って使えるところがPowerShellの良いところですね。