我想做与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 PS 6+ PS:内存使用率将高于默认的流式传输方法。如果你的二进制文件没有那么大,这不应该是个问题。Get-Content $args[0], $args[1] -Encoding Byte -Raw | Set-Content -Path 'output.txt' -Encoding Byte
Get-Content $args[0], $args[1] -AsByteStream -Raw | Set-Content -Path 'output.txt' -AsByteStream