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"
我需要在脚本中找到我的 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"