IndexOf 找到一个字符串,但 -match 没有

IndexOf finds a string, but -match doesn't

我需要在脚本中找到我的 wsl 内核版本,所以我试图 运行 wsl --status 找到它,但是当我尝试 -match 它时, PowerShell 找不到我要找的东西:

$wsl = wsl --status
(Invoke-Command { wsl --status | Out-String }) -match 'kernel'
False

我能够使用 IndexOf:

找到解决方法
$wsl = wsl --status
(Invoke-Command { wsl --status | Out-String }).IndexOf('kernel')
412

该变通方法肯定可以解决我的问题,但我想了解发生了什么,因为它对我来说毫无意义。

可能是字符编码问题,我不知道...到目前为止,我尝试更改 [Console]::OutputEncoding 并使用 [System.Text.Encoding]::Convert[System.Text.Encoding]::UTF8.GetString[System.Text.Encoding]::UTF8.GetBytes没有成功。

提前致谢!

由于某种原因,每个字符后都有一个空字符。

(wsl --status) -match "k`0" | Format-Hex

   Label: String (System.String) <216842AD>

          Offset Bytes                                           Ascii
                 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
          ------ ----------------------------------------------- -----
0000000000000000 00 4B 00 65 00 72 00 6E 00 65 00 6C 00 20 00 76  K e r n e l   v
0000000000000010 00 65 00 72 00 73 00 69 00 6F 00 6E 00 3A 00 20  e r s i o n :
0000000000000020 00 35 00 2E 00 31 00 30 00 2E 00 31 00 30 00 32  5 . 1 0 . 1 0 2
0000000000000030 00 2E 00 31 00                                   . 1

我还没弄明白为什么它在那里。你可以像这样删除它。

(wsl --status) -replace "`0"

不确定你为什么使用Invoke-Command,你可以简化为这个。

(wsl --status) -replace "`0" -match 'kernel'

现在这将 return 匹配行,因为左侧是一个数组。这相当于 true/false 检查中的 $true。要强制使用布尔值,您可以像以前一样使用 Out-String,转换为布尔值等

(wsl --status | Out-String) -replace "`0" -match 'kernel'

[bool]((wsl --status) -replace "`0" -match 'kernel')

编辑

正如评论中Santiago指出的那样,将编码设置为

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

解决了这个特殊问题。

(wsl --status) -match "kernel"