PowerShell 中有把字符串自动转换为字符串数组的倾向,所以很多获取字符串的 Cmdlet 都有 -Raw
参数,以便可以停止这个机制,例如 Get-Clipboard
和 Get-Content
。
但是,原生命令没有 -Raw
参数可以发挥这种作用,那么怎么样直接获取原始字符串呢?
目前看来比较好的方案是-join [System.Environment]::NewLine
[^1],除了有些冗长之外问题不大。
另外,可以使用Out-String
,但是这个命令会在末尾追加换行符,所以严格来讲是不行的。(使用-NoNewLine 也不行,因为会将所有的换行都去掉)
[^1]: 例如 (python.exe "$PSSR/stdout.py") -join [System.Environment]::NewLine | Should -Be $RawString
。
1
geelaw 2021-05-04 11:00:22 +08:00 2
原来你说的“原生命令”是指可执行文件的命令。那你最好不要给 PowerShell 任何解读它的 stdout 的机会,因为一旦 PowerShell 开始解读(它会猜测 encoding,并分割字符串,导致失去原始 stdout 的编码和行结尾,而且也不是所有的 stdout 都要是字符串的有效编码),你就失去了 stdout 的真实面目。解决方法是实现裸(二进制)管道。
https://geelaw.blog/entries/powershell-use-rawpipeline/ |