如何为PowerShell的Select-String设置UTF-16编码?
问题解答
关于Select-String对UTF-16的支持性
PowerShell 5.1及更早版本中,Select-String的-Encoding参数不直接识别utf-16字符串标识,仅支持以下和UTF-16相关的枚举值:
Unicode:对应UTF-16LE(小端序UTF-16,也是绝大多数Windows原生程序输出的UTF-16编码格式)BigEndianUnicode:对应UTF-16BE(大端序UTF-16)
PowerShell 7及以上版本已经支持utf-16作为合法的编码参数值,升级版本后原代码可直接运行。
解决方法
方法1:替换编码参数值(最简便)
如果你的exe输出的是常规的UTF-16LE编码内容,直接将编码参数改为Unicode即可:
& "my.exe" | Select-String -Pattern "skipping non-regular file" -NotMatch -Encoding Unicode
如果exe输出的是大端序UTF-16,将编码参数改为BigEndianUnicode即可。
方法2:手动转码处理(兼容性最强)
如果改编码参数后还是出现乱码,可以通过捕获原始字节流手动转码的方式处理,避免PowerShell管道自动转码带来的问题:
# 捕获exe输出的原始字节到临时文件 & "my.exe" | Out-File -FilePath temp_utf16.tmp -Encoding Byte -Raw # 读取字节并转码为字符串(大端场景替换Unicode为BigEndianUnicode即可) $rawContent = [System.Text.Encoding]::Unicode.GetString((Get-Content temp_utf16.tmp -Encoding Byte -Raw)) # 执行匹配过滤 $rawContent | Select-String -Pattern "skipping non-regular file" -NotMatch # 清理临时文件 Remove-Item temp_utf16.tmp -Force
内容的提问来源于stack exchange,提问作者zomega
相关产品推荐
相关产品推荐

