標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

PowerShell でのワイルドカード展開のソート順が難儀

リリースノートに記載された最初のバージョン部分の記載を日英それぞれについて引用するツールを PowerShell で作っている。基本的には英語の方を先に出るようにしたいので、読む順番は:

  1. release_note.md
  2. release_note_en.md
  3. release_note_ja.md

としたい。sh だと普通にワイルドカードを使うだけで

$ echo release_note*.md
release_note.md release_note_ja.md

となるが、PowerShell だと Sort-Object をはさんでも:

> Get-ChildItem release_note*.md | Sort-Object Name

    Directory: C:\Users\hymko\src\minipage

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---          2025/10/02    23:57           2485 release_note_ja.md
-a---          2025/10/02    23:58           2019 release_note.md

となってしまう。これは単純な ASCII ソートではないせいだからと思われる。

普通に考えると、Sort-Object にソートの仕方の指定すればよさそうなものだが、Microsoft Learn を見る限り、-Descending (逆順), -Culture (Culture指定)、 -CaseSensitive (英大文字・小文字を区別する)しかない。Culture にいたっては、選択肢が他にない

> Get-Culture

LCID             Name             DisplayName
----             ----             -----------
1041             ja-JP            日本語 (日本)

困ったあげく、Google の AI 検索に頼ったところ、次のようにすることで解決した。 ( ChatGPT はこの件に限ってはポンコツ化してダメだった )

> Get-ChildItem "release_note*" | Sort-Object { Format-Hex -InputObject $_.Name }

    Directory: C:\Users\hymko\src\minipage

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a---          2025/10/02    23:58           2019 release_note.md
-a---          2025/10/02    23:57           2485 release_note_ja.md
  • 16進数化して比較することで、実質、ASCII 順となる
  • スクリプトブロックで比較関数を与えることができる

不思議なのは、Sort-Object にスクリプトブロックが与えられるという仕様が Microsoft Learn の最新バージョン向けにも記載されていないという点。なぜだろう。 ( まぁ、解決したらよいのではあるが )