3テラバイト

プログラム関連備忘録サイト。主にゲーム。

PowerShell

PowerShellでエクスプローラーと同じ並びでファイルのリストを取得する

投稿日:2021年1月16日 更新日:

こんにちは、今日はPowerShellでエクスプローラーと同じ並びでファイルのリストを取得する方法についてまとめていきます。

確認環境

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

-PowerShell


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

PowerShellで0埋めする方法

こんにちは、今日はPowerShellで0埋めする方法についてまとめていきます。 確認環境 PSVersion 5.1.18362.1110 0埋め 以下の”{0:D3}”の「 …

no image

PowerShellでアイテムのコンテンツを取得するコマンドレットGet-Contentの使い方

こんにちは、今日はPowerShellでアイテムのコンテンツを取得するコマンドレットGet-Contentの使い方についてまとめていきます。 確認環境 PSVersion 5.1.18362.1110 …

no image

PowerShellで特定ディレクトリのファイル内文字列を置換する

Get-ChildItem . | ForEach-Object {Get-Content -Encoding utf8 $_ | ForEach-Object {$_ -creplace ‘br’, …

no image

PowerShellでトースト通知を送る

確認環境 PSVersion 5.1.18362.1110 トースト通知を送る [Windows.UI.Notifications.ToastNotificationManager, Wind …

no image

PowerShellでプロセスを停止するコマンドレットStop-Processの使い方

こんにちは、今日はPowerShellでプロセスを停止するコマンドレットStop-Processの使い方についてまとめていきます。 確認環境 PSVersion 5.1.18362.1110 Stop …