为什么我无法匹配 wsl.exe 输出中的字符串?

2024-02-29

我正在尝试使用 PowerShell 从 wsl.exe 获取有用的输出。 对于我的一生,我似乎无法匹配输出中的字符串(见下文)。 我在 PowerShell 5 和 7 中得到相同的行为。 有谁有可靠的方法来捕获 wsl.exe 的输出?

Thanks

PS C:\Users\gsamuel> $foo = (wsl -l -v)
PS C:\Users\gsamuel> $foo
  NAME            STATE           VERSION

* Ubuntu-20.04    Running         2


PS C:\Users\gsamuel> $foo | Select-String -Pattern 'Ubuntu'
PS C:\Users\gsamuel> $foo -match 'Ubuntu'
PS C:\Users\gsamuel>
PS C:\Users\gsamuel>
PS C:\Users\gsamuel> [string]$foo | Select-String -Pattern 'Ubuntu'
PS C:\Users\gsamuel> [string]$foo -match 'Ubuntu'
False

这似乎是某种编码问题:输出的每个字母之间有一个空值,可能是因为 UTF-16 输出被解释为 UTF-8。

您可以通过将所有空字符替换为@:

$foo = (wsl -l -v)
$foo -Replace "`0", '@'

这给出了这个:

 @ @N@A@M@E@ @ @ @ @ @ @ @ @ @ @ @ @S@T@A@T@E@ @ @ @ @ @ @ @ @ @ @ @V@E@R@S@I@O@N@
@
@*@ @U@b@u@n@t@u@-@2@0@.@0@4@ @ @ @ @R@u@n@n@i@n@g@ @ @ @ @ @ @ @ @ @2@
@
@

所以输出实际上并不包含字符串"Ubuntu"!

一个简单的解决方法是将其替换为空字符串:

$foo -Replace "`0", '' | Select-String 'Ubuntu'

输出预期的匹配:


* Ubuntu-18.04    Stopped         2


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我无法匹配 wsl.exe 输出中的字符串? 的相关文章

随机推荐