我知道有很多与此相关的帖子,但对我没有任何帮助。
我正在尝试在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
接受整个命令行,但这会使事情更加复杂,可以是security risk。至于为什么这是解决方案:
C:/Program Files (x86)/ClamWin/bin/clamd.exe
是单个 token (路径),尽管包含嵌入式空格。 &
, the so-called call operator是必需的,因为 PowerShell具有两种基本的解析模式:这就是为什么
--install
不需要但可以加引号的原因(PowerShell会在将参数传递给目标可执行文件之前简单地为您删除引号。)PowerShell根据语句的第一个 token 确定要应用哪种解析模式:
如果第一个标记是带引号的字符串(由于可执行路径中包含空格,我们在这里需要它)-或变量引用(例如
$var ...
),那么PowerShell默认在表达式模式下解析。用引号引起来的字符串或变量引用作为表达式将仅输出字符串/变量值。
但是,考虑到我们要执行其路径存储在带引号的字符串中的可执行文件,我们需要强制使用参数模式,这是
&
运算符确保的方式。通常,重要的是要了解在调用目标可执行文件之前,PowerShell对命令行执行了非平凡的预处理,因此,PowerShell代码中的命令行看起来通常不是目标可执行文件直接看到的内容。
cmd.exe
的元字符不同,并且有更多的(值得注意的是,,
在PowerShell(数组构造函数)中具有特殊含义,但没有cmd.exe
-参见this answer)。 cmd.exe
的命令行的重用,PowerShell v3引入了特殊的停止分析符号--%
,它关闭了PowerShell对命令行其余部分的常规解析,并且仅对cmd.exe
风格的环境变量引用进行插值(例如%USERNAME%
)。 关于powershell - 在PowerShell中运行命令行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38064512/