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でプロセスを停止するコマンドレットStop-Processの使い方

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

no image

PowerShellで実行ポリシーを取得するコマンドレットGet-ExecutionPolicyの使い方

こんにちは、今日はPowerShellで実行ポリシーを取得するコマンドレットGet-ExecutionPolicyの使い方についてまとめていきます。 確認環境 PSVersion 5.1.18362. …

no image

PowerShellで現在のディレクトリを表示するコマンドレットGet-Locationの使い方

こんにちは、今日はPowerShellで現在のディレクトリを表示するコマンドレットGet-Locationの使い方についてまとめていきます。 確認環境 PSVersion 5.1.18362.1110 …

no image

PowerShellでトースト通知を送る

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

no image

PowerShellでロード済のアセンブリ一覧を取得する

以下のように現在のアプリケーション ドメインを取得し、そのドメインで読み込まれているアセンブリをGetAssemblies関数で取得します。 PS C:\Users\santerabyte> & …