Powershell用单引号调用cmd



我想做与Powershell相同的操作,调用cmd.exe命令,如复制/b,但现在我遇到了引号问题:'在此时是意外的。

我试着用逃跑,但情况更糟

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

--%,停止解析符号,不能与PowerShell变量和表达式组合,因为它将命令行的其余部分传递给目标可执行文件-在本例中为cmd.exe-,按原样,唯一的例外是cmd.exe样式环境变量引用的扩展(插值(,例如CCD_ 4。

通常,--%有许多限制-请参阅此答案。

以下内容应该有效;请注意,必须引用&才能传递到cmd.exe,而>由于未引用,由PowerShell插入。

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

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

如果您想将单引号作为值的部分传递(而不是将其语法用作PowerShell字符串文字(,请使用可扩展字符串("..."(:

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

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

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

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

经过短暂的测试。。作为Byte(使用"-Encoding Byte">的PS 5.1和使用"-AsByteStream">

因此,尝试使用"-生的";参数。由于您不想以任何方式循环输入,因此不需要可枚举对象。你需要它的原始性能。

测试以下内容:

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:内存使用率将高于默认的流式传输方法。如果你的二进制文件没有那么大,这不应该是个问题。

最新更新