Powershell -奇怪的WSL输出字符串编码

pdsfdshx  于 2023-01-13  发布在  Shell
关注(0)|答案(4)|浏览(209)

今天我只是想检查一下我的windows工作站上是否安装了一个特定的子系统。所以我使用的是Windows Subsystem for Linux(WSL),并安装了从微软商店可以买到的Ubuntu。现在我正在尝试找到一种方法来检查它是否以编程的方式安装。

我有以下输出:

PS C:\> wsl -l -v
NAME            STATE           VERSION
* Ubuntu-20.04    Stopped         2

我需要知道是否安装了“Ubuntu-20.04”。我尝试了很多方法,但没有像这样的相关:

$state = wsl -l -v
if($state -like '*Ubuntu*') {
      Write-Host 'Installed'
} else {
      Write-Host 'Nope'
}

但是没有工作。你有线索给我吗?谢谢大家!

3htmauhk

3htmauhk1#

这似乎是一个编码问题。在您的字符串中有(不可见的)空字符。我仍在尝试找出处理它的最佳方法。
与此同时......这里有一个快速解决方案:

$state = (wsl -l -v) -replace "\x00",""
    • 更新**

另一种解决方法,但这将更改整个会话的编码:

[System.Console]::OutputEncoding = [System.Text.Encoding]::Unicode
xe55xuns

xe55xuns2#

如果你是从WSL或者Windows Git Bash运行wsl,你可以用这个来转换:

wsl -l -v | iconv -f UTF-16LE -t UTF-8
z4iuyo4d

z4iuyo4d3#

您的示例代码现在可以在最新的WSL预览版本(0.64.0)中使用选择加入修复程序正常工作,但请注意(至少在预览中)它仅对Windows 11用户可用。
要选择加入(这样当您实现了类似前面答案的解决方案时,就不会意外地破坏旧代码),只需将WSL_UTF8环境变量设置为1值(只有此值才有效)。
例如,在PowerShell中:

$env:WSL_UTF8=1

如果需要,也可以在Windows中全局设置。
如果从 * 内部 * WSL本身运行wsl.exe,请参见this answer以获取使用WSLENV的示例代码。

yb3bgrhw

yb3bgrhw4#

演示了wsl如何输出utf 16 le。所以偶数字节为空“0”。如果你有emacs,你可以在一个文件上运行esc-x hexl模式来得到类似的显示。据我所知,在powershell中没有等价的iconv。

wsl --help | select -first 1 | format-hex

   Label: String (System.String) <09F5DDB6>

          Offset Bytes                                           Ascii
                 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
          ------ ----------------------------------------------- -----
0000000000000000 43 00 6F 00 70 00 79 00 72 00 69 00 67 00 68 00 C o p y r i g h
0000000000000010 74 00 20 00 28 00 63 00 29 00 20 00 4D 00 69 00 t   ( c )   M i
0000000000000020 63 00 72 00 6F 00 73 00 6F 00 66 00 74 00 20 00 c r o s o f t
0000000000000030 43 00 6F 00 72 00 70 00 6F 00 72 00 61 00 74 00 C o r p o r a t
0000000000000040 69 00 6F 00 6E 00 2E 00 20 00 41 00 6C 00 6C 00 i o n .   A l l
0000000000000050 20 00 72 00 69 00 67 00 68 00 74 00 73 00 20 00   r i g h t s
0000000000000060 72 00 65 00 73 00 65 00 72 00 76 00 65 00 64 00 r e s e r v e d
0000000000000070 2E 00

相关问题