在 PowerShell 中获取本机命令标准输出中原始字符串的「最佳实践」是什么?

2021-05-04 10:01:29 +08:00
 AndyAO

PowerShell 中有把字符串自动转换为字符串数组的倾向,所以很多获取字符串的 Cmdlet 都有 -Raw 参数,以便可以停止这个机制,例如 Get-ClipboardGet-Content

但是,原生命令没有 -Raw 参数可以发挥这种作用,那么怎么样直接获取原始字符串呢?


目前看来比较好的方案是-join [System.Environment]::NewLine[^1],除了有些冗长之外问题不大。

另外,可以使用Out-String,但是这个命令会在末尾追加换行符,所以严格来讲是不行的。(使用-NoNewLine 也不行,因为会将所有的换行都去掉)

[^1]: 例如 (python.exe "$PSSR/stdout.py") -join [System.Environment]::NewLine | Should -Be $RawString

367 次点击
所在节点    问与答
2 条回复
geelaw
2021-05-04 11:00:22 +08:00
原来你说的“原生命令”是指可执行文件的命令。那你最好不要给 PowerShell 任何解读它的 stdout 的机会,因为一旦 PowerShell 开始解读(它会猜测 encoding,并分割字符串,导致失去原始 stdout 的编码和行结尾,而且也不是所有的 stdout 都要是字符串的有效编码),你就失去了 stdout 的真实面目。解决方法是实现裸(二进制)管道。

https://geelaw.blog/entries/powershell-use-rawpipeline/
AndyAO
2021-05-04 13:24:00 +08:00
@geelaw #1

现在想来,与任何的 Native Command 进行交互,只要本来是对传统的 Shell 设计的,也许都会或多或少的有问题,毕竟不是同一个体系的东西。

但我这个情况还好,因为对 Python 中的 re 模块更熟悉,所以想在 PowerShell 中调用 Python 代码专门用来使用正则表达式处理字符串。

那么标准输出中的内容是 UTF-8 字符串,这个情况是已经确定。

所以 PowerShell 猜测是字符串并不会有问题,但是现在看来,连「不默认分割」这个选项好像都没给。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/774817

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX