Unyablog.

のにれんのブログ

wsl.exe の出力を UTF-8 にして Powershell の Select-String や -match が動くようにする

Powershell で wsl.exe の出力をそのまま操作しようとするとうまく動かない。

PS C:\Windows\System32> wsl.exe --list --running | Select-String "U"

Windows Subsystem for Linux Distributions:
Ubuntu (Default)

PS C:\Windows\System32> wsl.exe --list --running | Select-String "Ubuntu"
(何も出ない)

これは wsl.exe の出力 (unicode) と Powershell の想定する文字コード (UTF-8) が合わないのが原因。

wsl.exe の出力は一見すると普通の文字列に見えるが、 Format-Hex すると ASCII でも後ろに 0x00 が入っていることがわかる。

PS C:\Windows\System32> wsl.exe --list --running | Format-Hex
...
          Offset Bytes                                           Ascii
                 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
          ------ ----------------------------------------------- -----
0000000000000000 00 55 00 62 00 75 00 6E 00 74 00 75 00 20 00 28  U b u n t u   (
0000000000000010 00 44 00 65 00 66 00 61 00 75 00 6C 00 74 00 29  D e f a u l t )
0000000000000020 00

この対策としては、 WSL_UTF8 環境変数を設定して wsl.exe の出力を UTF-8 にすれば良い。

PS C:\Windows\System32> $env:WSL_UTF8=1
PS C:\Windows\System32> wsl.exe --list --running | Select-String "Ubuntu"

Ubuntu (Default)

github.com