我知道有很多关于此事的帖子,但对我没什么用。
我正在尝试在PowerShell中运行此命令行:
C:/Program Files (x86)/ClamWin/bin/clamd.exe --install
我在PowerShell中有这个:
&"C:/Program Files (x86)/ClamWin/bin/clamd.exe --install"
但所有这一切都是执行clamd.exe
,忽略--install
参数
如何让完整的命令行运行?
答案 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%
)。