首页 > 解决方案 > Powershell用单引号调用cmd

问题描述

我想做与Powershell 调用 cmd.exe 命令相同的操作,例如 copy /b,但现在我遇到了 quote : ' 的问题,此时是出乎意料的。

我试图用 \ 逃脱,但更糟

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

标签: powershellcmd

解决方案


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

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

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

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

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

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

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

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


推荐阅读