こんにちは、今日はPowerShellでエクスプローラーと同じ並びでファイルのリストを取得する方法についてまとめていきます。
Table of Contents
確認環境
PSVersion 5.1.18362.1110
ファイル一覧取得
現在のディレクトリに以下のようなファイルがあった場合、エクスプローラーでは数値の昇順、降順で並び替えられます。
- 0_Test.txt
- 1_Test.txt
- 2_Test.txt
- 11_Test.txt
これをGet-ChildItemコマンドレットで取得すると、
$files = Get-ChildItem -File -Recurse -Include "*.txt"
foreach ( $file in $files )
{
$file
}
以下のような並びになります。
ディレクトリ: C:\Users\santerabyte\Workspace
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2021/01/16 22:30 0 0_Test.txt
-a---- 2021/01/16 22:30 0 11_Test.txt
-a---- 2021/01/16 22:30 0 1_Test.txt
-a---- 2021/01/16 22:30 0 2_Test.txt
これをPowerShell側でもファイル名先頭の桁数が異なる数値の大小で並び替えられるようにします。
ファイルのソート
以下のようにSort-Objectコマンドレットを用いてソートを行います。
$files = Get-ChildItem -File -Recurse -Include "*.txt" | Sort-Object { [regex]::Replace($_.BaseName, '\d+', { $args[0].Value.PadLeft(2) }) }
foreach ( $file in $files )
{
$file
}
ディレクトリ: C:\Users\santerabyte\Workspace
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2021/01/16 22:30 0 0_Test.txt
-a---- 2021/01/16 22:30 0 1_Test.txt
-a---- 2021/01/16 22:30 0 2_Test.txt
-a---- 2021/01/16 22:30 0 11_Test.txt
処理内容
$files = Get-ChildItem -File -Recurse -Include "*.txt" | Sort-Object { [regex]::Replace($_.BaseName, '\d+', { $args[0].Value.PadLeft(2) }) }
上記の部分では、Get-ChildItemコマンドレットで取得した.txtファイルの一覧をパイプでSort-Objectコマンドレットに渡し、連続する数値の部分(0_Test.txtであれば0、11_Test.txtであれば11の部分)を探し、その部分の左側に2桁になるように空白を挿入しています。
この値を元にソートすることにより
内部的に以下のようなファイル名でソートすることで「11_Test.txt」が最後に来ています。
- 0_Test.txt
- 1_Test.txt
- 2_Test.txt
- 11_Test.txt
リンク
Get-ChildItem (Microsoft.PowerShell.Management) – PowerShell | Microsoft Docs
https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/get-childitem?view=powershell-7