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でコマンド一覧を取得するコマンドレットGet-Commandの使い方

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

no image

PowerShellでWebリクエストを実行するコマンドレットInvoke-WebRequestの使い方

こんにちは、今日はPowerShellでWebリクエストを実行するコマンドレットInvoke-WebRequestの使い方についてまとめていきます。 確認環境 PSVersion 5.1.18362. …

no image

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

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

no image

PowerShellで文字列の置換をする方法

確認環境 PSVersion 5.1.18362.1171 文字列の置換 -replace 以下のように置換したい文字列のあとに-replaceとカンマの前に置き換えたい文字列を、カンマの後に置き換え …

no image

PowerShellでWindows Management Instrumentation (WMI)オブジェクトを取得するコマンドレットGet-WmiObjectの使い方

こんにちは、今日はPowerShellでWindows Management Instrumentation (WMI)オブジェクトを取得するコマンドレットGet-WmiObjectの使い方についてま …