PowerShell 5.1命令输出子字符串匹配异常问题及解决方案
问题说明
- 运行环境:PowerShell 5.1
- 问题现象:采集外部命令的多行输出后尝试逐行解析字符串,操作始终失败;输出内容肉眼可见与手动输入的同内容字符串一致,但长度差异极大,正则匹配返回错误结果,调用
.Trim()方法也无法清除疑似存在的隐藏内容。
复现过程
执行以下命令可复现异常:
PS $x = wsl -l -v PS $x[4] DistroName Stopped 2 PS $x[4].Length 71 PS $x[4] -match "Stopped" False PS $z = " DistroName Stopped 2" PS $z -match "Stopped" True PS $z.Length 36
排查更新
验证捕获到的输出元素类型,确认是标准字符串类型,不存在类型转换问题:
PS $x[4].GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True String System.Object
解决方案
核心遗漏知识点
PowerShell 捕获外部原生命令输出时,默认控制台输出编码与wsl命令默认使用的Unicode编码不匹配,导致解码后的字符串中混入大量不可见的空字节(\0字符),因此出现显示内容一致但实际字符串内容不符的问题。.Trim()默认仅清理首尾空白字符,无法清理字符串中间嵌入的空字节,因此调用后无效果。
修复操作
在执行外部命令采集输出前,先将控制台输出编码设置为Unicode编码:
[Console]::OutputEncoding = [System.Text.Encoding]::Unicode
设置完成后重新采集wsl -l -v输出即可恢复正常:多余空字符全部消失,字符串.Length返回预期值,-match等字符串操作符可正常工作。
该方案由@Santiago Squarzon 提供
内容的提问来源于stack exchange,提问作者PfunnyGuy
相关产品推荐
相关产品推荐

