ディレクトリ内のファイル一覧を取得する
ディレクトリ内に配置されているファイル一覧を取得するには Get-ChildItem コマンドを用います。本記事では現場で想定されるいろいろなバリエーションを紹介します。
ファイル一覧を取得するコマンドを単純に発行する
まずは単純に Get-ChildItem に取得対象ディレクトリをベタ書きして一行で済ませます。
Get-ChildItem c:/tmp/rec
それではシェルスクリプトらしくないので、対象ディレクトリを変数にすると、このようになります。
# 対象のディレクトリを変数に入れる.
$the_dir = "c:/tmp/rec"
# 対象のディレクトリ内に配置されているファイル一覧を取得する.
Get-ChildItem $the_dir
下記が実行結果です。
ディレクトリ: C:\tmp\rec
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2022/06/24 15:47 1168778 training_000.png
-a---- 2022/06/24 15:47 1170899 training_001.png
-a---- 2022/06/24 15:47 1172616 training_002.png
-a---- 2022/06/24 15:47 1173823 training_003.png
-a---- 2022/06/24 15:47 1167576 training_004.png
-a---- 2022/06/24 15:47 1172557 training_005.png
-a---- 2022/06/24 15:47 1166832 training_006.png
-a---- 2022/06/24 15:47 1167171 training_007.png
ファイル名の一覧を取得する
単純に Get-ChildItem を発行しただけでは、DOSコマンドの dir とまったく同じような出力結果になります。ここからファイル一覧の情報をつかって、ファイル移動 Move-Item、ファイルコピー Copy-Item、ファイルリネーム Rename-Item したりするには情報が多すぎます。
ファイル名だけを取得するには -Name オプションを使います。
$the_dir = "c:/tmp/rec"
Get-ChildItem $the_dir -Name
下記が実行結果です。
training_000.png
training_001.png
training_002.png
training_003.png
training_004.png
training_005.png
training_006.png
training_007.png
フルパスの一覧を取得する
ファイル名だけでなく、格納されているディレクトリを含めたフルパス名を取得するには、Get-ChildItem で得られた結果をパイプをつかって ForEach-Object {$_.FullName} に流します。
$the_dir = "c:/tmp/rec"
Get-ChildItem $the_dir | ForEach-Object {$_.FullName}
上記の手法は ForEach が使えることを示唆しています。
下記にパイプをつかわない方法を示します。Get-ChildItem の戻り値を配列として受け取り、その配列に ForEach して、必要なメンバのみを出力します。いま必要なのは FullName メンバの値です。
$the_dir = "c:/tmp/rec"
#配列としてうけとる.
$arr = Get-ChildItem $the_dir
#配列をループ参照する.
foreach ($item in $arr)
{
Write-Output ( $item.FullName )
}
ForEach ループが使えるということは、Forループでも可能ということです。下記にコードを示します。for の条件文の中にある -lt は、"less than" の略で「小なり」を意味します。
PowerShellの配列アクセスは、10要素の場合、0~9のインデックスアクセスです。普段 VBA に慣れている人は注意してください。
$the_dir = "c:/tmp/rec"
$arr = Get-ChildItem $the_dir
# 配列の要素数を取得する.
$num = $arr.Length
# 配列の要素数ぶんだけループする.
for ( $n = 0; $n -lt $num; $n++ )
{
# 配列要素にインデックスアクセスをする.
Write-Output ( $arr[$n].FullName )
}
上記3つのサンプル test20, test21, test22 の実行結果がこれです。
C:\tmp\rec\training_000.png
C:\tmp\rec\training_001.png
C:\tmp\rec\training_002.png
C:\tmp\rec\training_003.png
C:\tmp\rec\training_004.png
C:\tmp\rec\training_005.png
C:\tmp\rec\training_006.png
C:\tmp\rec\training_007.png
ファイルの一覧をソートする
Get-ChildItem で得られた結果を Sort-Object にパイプで流して降順(Descending)に出力するサンプルです。一行で記述できます。
$the_dir = "c:/tmp/rec"
Get-ChildItem $the_dir | Sort-Object -Descending
いったん配列に受ける場合はこのようにします。
$the_dir = "c:/tmp/rec"
#配列で受ける.
$arr = Get-ChildItem $the_dir
#配列を降順 Descending でソートする.
$arr_sorted = $arr | Sort-Object -Descending
foreach ( $item in $arr_sorted )
{
Write-Output ( $item )
}
下記が実行結果です。
ディレクトリ: C:\tmp\rec
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2022/06/24 15:47 1167171 training_007.png
-a---- 2022/06/24 15:47 1166832 training_006.png
-a---- 2022/06/24 15:47 1172557 training_005.png
-a---- 2022/06/24 15:47 1167576 training_004.png
-a---- 2022/06/24 15:47 1173823 training_003.png
-a---- 2022/06/24 15:47 1172616 training_002.png
-a---- 2022/06/24 15:47 1170899 training_001.png
-a---- 2022/06/24 15:47 1168778 training_000.png
ファイルの一覧を LastWriteTime 順にソートする
配列のソート要素を明示したい場合は -Property を使います。この例では LastWriteTime です。降順にしたい場合は -Descending スイッチを使います。
$the_dir = "c:/tmp/rec"
$arr = Get-ChildItem $the_dir
#配列を LastWriteTime 降順(Descending)でソートする.
$arr_sorted = $arr | Sort-Object -Property LastWriteTime -Descending
<#
#配列を LastWriteTime 昇順でソートする場合はこちら.
$arr_sorted = $arr | Sort-Object -Property LastWriteTime
#>
foreach ( $item in $arr_sorted )
{
Write-Output ( $item )
}
下記が実行結果です。降順 -Descending スイッチをオンオフして動作を確認してください。
MSDNのドキュメントをみたところ、昇順を明示するスイッチは無いようです。
ディレクトリ: C:\tmp\rec
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2022/06/25 00:47 1167171 test_a.png
-a---- 2022/06/25 00:46 1166832 test_b.png
-a---- 2022/06/25 00:45 1172557 test_c.png
-a---- 2022/06/25 00:44 1167576 test_d.png
-a---- 2022/06/25 00:43 1173823 test_e.png
-a---- 2022/06/25 00:42 1172616 test_f.png
-a---- 2022/06/25 00:41 1170899 test_g.png
-a---- 2022/06/25 00:40 1168778 test_h.png