【问题标题】:Powershell calling cmd with single quotePowershell用单引号调用cmd
【发布时间】:2020-11-14 13:55:15
【问题描述】:

我想和Powershell call cmd.exe command like copy /b 做同样的事情,但现在我遇到了引用问题:'此时出乎意料。

我试图用\逃脱,但更糟

function concat-filenames {
   cmd.exe --% /c (echo file '$($args[0])' & echo file '$($args[0])' )>list.txt
}

【问题讨论】:

    标签: powershell cmd


    【解决方案1】:

    --%stop-parsing symbol不能与 PowerShell 变量和表达式组合,因为它将命令行的其余部分传递给目标可执行文件 - cmd.exe 在这种情况下 - 原样,唯一的例外是 cmd.exe 样式的扩展(插值)环境变量引用,例如 %USERNAME%

    通常,--% 有很多限制 - 请参阅this answer

    类似下面的东西应该可以工作;请注意,& 必须被引用才能传递给 cmd.exe,而 > 由于未被引用,因此被 PowerShell 插入。

    function concat-filenames {
      cmd.exe /c echo file $args[0] '&' echo file $args[0] > list.txt
    }
    

    请注意,在echo 命令之后、后续运算符(例如&>)之前的cmd.exe 尾随空格成为输出的一部分。

    如果您打算将单引号作为 值的一部分(而不是将它们的 句法用作 PowerShell 字符串文字),请使用 expandable strings (@ 987654337@):

    function concat-filenames {
      cmd.exe /c echo file "'$($args[0])'" '&' echo file "'$($args[0])'" > list.txt
    }
    

    请注意,在这两种情况下,PowerShell 都会在后台执行按需重新引用:如果 扩展(插值)参数值包含 空格 , 它用双引号 ("...") 括起来。

    【讨论】:

      【解决方案2】:

      请尝试加载/使用原始-内容。

      默认情况下,Get-Content 将输入解析(或尝试)为 X 类型的数组(通常为字符串数组)。

      经过短暂的测试 .. 作为字节(PS 5.1 使用 "-Encoding Byte" 和 PS 6+ 使用 "-AsByteStream")PowerShell 引擎流式传输对管道的“解析”输入不是一个整体。 (PS6+ 的参数名称已经表明了)。

      因此尝试使用“-Raw”参数。由于您不想以任何方式循环输入,因此您不需要可枚举的对象。你需要它来提高性能。

      测试以下内容:

      PS 5.1

      Get-Content $args[0], $args[1] -Encoding Byte -Raw | Set-Content -Path 'output.txt' -Encoding Byte
      

      PS 6+

      Get-Content $args[0], $args[1] -AsByteStream -Raw | Set-Content -Path 'output.txt' -AsByteStream
      

      PS: 内存使用量将高于默认的流式传输方法。如果您的二进制文件不是那么大,这应该不是问题。

      【讨论】:

      • 请注意,您不是在回答手头的问题,而是一个不同的问题,即问题主体仅链接到
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 2011-09-07
      • 2021-12-07
      • 1970-01-01
      相关资源
      最近更新 更多