运行 PowerShell 中的命令行

Run command line in PowerShell

我知道有很多关于此的帖子,但没有一个对我有用。

我正在尝试 运行 PowerShell 中的这个命令行:

C:/Program Files (x86)/ClamWin/bin/clamd.exe --install

我在 PowerShell 中有这个:

&"C:/Program Files (x86)/ClamWin/bin/clamd.exe --install"

但这一切所做的只是执行clamd.exe,忽略--install参数

如何获得 运行 的完整命令行?

Josef Z's问题的评论提供了解决方案:

& "C:/Program Files (x86)/ClamWin/bin/clamd.exe" --install # double-quoted exe path

或者,假定可执行路径是 文字 (不包含变量引用或子表达式),使用 verbatim (single-quoted) string ('...'):

& 'C:/Program Files (x86)/ClamWin/bin/clamd.exe' --install # single-quoted exe path

至于您自己的解决方案尝试失败的原因:呼叫操作员 & 只期望 命令 name/path 作为参数,不是完整的命令行.
Invoke-Expression 接受整个命令行,但这会使事情进一步复杂化,并且可以是 security risk.

至于为什么这是解决办法:

  • 需要引用是有道理的:你需要告诉 PowerShell C:/Program Files (x86)/ClamWin/bin/clamd.exe单个标记(路径),尽管包含嵌入的空格.

  • &, the so-called call operator, 是必需的,因为 PowerShell 有两种基本的解析模式:

    • 参数模式传统shell,其中第一个标记是命令名称,后续标记表示参数,仅当它们包含 shell 元字符时才需要引用 (对 PowerShell 具有特殊含义的字符,例如分隔标记的空格);
      这就是为什么 --install 不需要 ,但 可以 被引用(PowerShell 将在将参数传递给目标可执行文件。)

    • 表达式模式类似于编程语言中的表达式.

PowerShell 根据语句的 first 标记决定应用何种解析模式:

如果第一个标记是 带引号的字符串 - 由于可执行路径中的嵌入空格,我们在这里需要它 - 变量引用 (例如 $var ...),PowerShell 默认以 表达式模式 解析
带引号的字符串或变量引用作为表达式只会 输出 字符串/变量值。

但是,鉴于我们想要执行路径存储在带引号的字符串中的可执行文件,我们需要强制参数模式,这是 & 运算符确保的 .


通常,重要的是要了解 PowerShell 在调用目标可执行文件之前对命令行执行重要的预处理,所以命令行看起来像什么 在PowerShell代码中通常不是直接目标可执行文件所见。

  • 如果您在命令行上引用 PowerShell 变量 并且该 变量包含嵌入的空格,PowerShell 将隐式地将变量的值包含在双引号 在传递之前 - 这在 this answer 链接问题中讨论。

  • PowerShell 的 元字符 cmd.exe 的元字符不同,数量更多(值得注意的是,, 在 PowerShell(数组构造函数)中有特殊含义,但 cmd.exe 没有 - 请参阅 ).

  • 为了简化现有的基于 cmd.exe 的命令行的重用,PowerShell v3 引入了特殊的 停止解析符号 , --%, 这会关闭 PowerShell 对命令行其余部分的正常解析,并仅插入 cmd.exe 样式的环境变量引用(例如 %USERNAME%)。