我知道有很多关于此的帖子,但没有任何对我有用。
我正在尝试在 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
或者,假设可执行路径是文字(不包含变量引用或子表达式),使用逐字(单引号)字符串(
'...'
):
& 'C:/Program Files (x86)/ClamWin/bin/clamd.exe' --install # single-quoted exe path
至于为什么你自己的解决方案尝试失败:
&
仅需要一个命令名称/路径作为参数,而不是完整的命令行。Invoke-Expression
接受整个命令行,但这会使事情变得更加复杂,并且可能会带来 安全风险。{ ... }
):请参阅这个答案为什么使用&
就是解决方案:
需要引用是有道理的:你需要告诉PowerShell,C:/Program Files (x86)/ClamWin/bin/clamd.exe
是一个单个标记(路径),尽管包含嵌入的空格。
,即所谓的调用运算符,是由于PowerShell的两种基本解析模式:
参数模式,其工作方式类似于传统 shell,其中第一个标记是命令名称,后续标记代表参数,仅当它们包含 shell 元字符(chars.对 PowerShell 具有特殊含义,例如分隔标记的空格);
这就是为什么 --install
不需要,但 可以 被引用(PowerShell 将在将参数传递给目标可执行文件之前简单地为您删除引号。)
表达式模式,其工作方式类似于编程语言中的表达式。
first 标记决定应用哪种解析模式:
如果第一个标记是带引号的字符串(由于可执行路径中嵌入空格,我们需要它)或变量引用(例如,$var ...
),PowerShell 以表达式模式进行解析默认情况下。 带引号的字符串或变量引用作为表达式将简单地
执行其路径存储在带引号的字符串中的可执行文件,我们需要强制参数模式,这是&
运算符所确保的。
PowerShell 在调用目标可执行文件之前对命令行执行重要的预处理,因此 PowerShell 代码中的命令行通常不是直接是 目标可执行文件 看见了。
variable 并且该 variable 包含嵌入空格,则 PowerShell 将在传递变量之前将其值隐式括在 双引号中 - 这将在 this answer 中讨论链接问题。
PowerShell 的元字符与
cmd.exe
不同,并且数量更多(值得注意的是,,
在PowerShell(数组构造函数)中具有特殊含义,但cmd.exe
没有 - 请参阅这个答案)。
为了简化现有基于
cmd.exe
的命令行的重用,PowerShell v3 引入了特殊的 stop-parsing token,--%
,它会关闭 PowerShell 对命令行其余部分的正常解析,并且仅插入 cmd.exe
样式的环境变量引用(例如,%USERNAME%
)。但是,这存在基本限制 - 请参阅此答案的底部部分。