在PowerShell中运行命令行

时间:2016-06-27 22:59:23

标签: powershell syntax quoting

我知道有很多关于此事的帖子,但对我没什么用。

我正在尝试在PowerShell中运行此命令行:

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

我在PowerShell中有这个:

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

但所有这一切都是执行clamd.exe,忽略--install参数

如何让完整的命令行运行?

1 个答案:

答案 0 :(得分:5)

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

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

或者,假设可执行路径是 literal (不包含变量引用或子表达式):

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

至于您自己的解决方案尝试失败的原因:调用操作符&只需要命令名称/路径作为参数,而不是完整的命令行< / em>的。
Invoke-Expression接受整个命令行,但这会使事情进一步复杂化,可能是security risk

至于为什么这是解决方案:

  • 需要引用 有理由:您需要告诉PowerShell C:/Program Files (x86)/ClamWin/bin/clamd.exe令牌(路径),尽管包含嵌入的空格

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

    • 参数模式 的工作方式类似于传统shell ,其中第一个令牌是命令名称,后续标记表示参数,如果它们包含shell 元字符(对PowerShell具有特殊含义的字符,例如用于分隔标记的空格),则只需要引用; 这就是--install 不需要,但可以引用的原因(PowerShell只会在将参数传递给目标可执行文件之前删除引号。)

    • 表达模式 的工作方式与编程语言 中的表达式类似。

      < / LI>

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

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

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

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

  • 如果在命令行中引用PowerShell 变量并且变量包含嵌入空格,PowerShell将隐式将变量的值括在双引号中 在传递之前 - this answer讨论了相关问题。

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

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