ディレクトリ内のファイル一覧を取得する

ディレクトリ内に配置されているファイル一覧を取得するには 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