V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
AndyAO
V2EX  ›  问与答

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

  •  1
     
  •   AndyAO · 2021-05-04 10:01:29 +08:00 · 394 次点击
    这是一个创建于 1307 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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

    2 条回复    2021-05-04 13:24:00 +08:00
    geelaw
        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/
    AndyAO
        2
    AndyAO  
    OP
       2021-05-04 13:24:00 +08:00
    @geelaw #1

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

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

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

    所以 PowerShell 猜测是字符串并不会有问题,但是现在看来,连「不默认分割」这个选项好像都没给。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2574 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 04:33 · PVG 12:33 · LAX 20:33 · JFK 23:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.