powershell - 在PowerShell中运行命令行

标签 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参数

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

最佳答案

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

至于为什么这是解决方案:
  • 引用的需求是有道理的:您需要告诉PowerShell,C:/Program Files (x86)/ClamWin/bin/clamd.exe是单个 token (路径),尽管包含嵌入式空格。
  • & , the so-called call operator是必需的,因为 PowerShell具有两种基本的解析模式:
  • 参数模式,它的就像传统的shell 一样,其中第一个标记是命令名称,其后的标记代表参数,仅当它们包含 shell 元字符(对于PowerShell具有特殊含义的字符,例如作为分隔 token 的空间);
    这就是为什么--install不需要但可以加引号的原因(PowerShell会在将参数传递给目标可执行文件之前简单地为您删除引号。)
  • 表达式模式,它的作用类似于编程语言中的表达式。

  • PowerShell根据语句的第一个 token 确定要应用哪种解析模式:

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

    但是,考虑到我们要执行其路径存储在带引号的字符串中的可执行文件,我们需要强制使用参数模式,这是&运算符确保的方式。

    通常,重要的是要了解在调用目标可执行文件之前,PowerShell对命令行执行了非平凡的预处理,因此,PowerShell代码中的命令行看起来通常不是目标可执行文件直接看到的内容。
  • 如果在命令行上引用PowerShell变量,并且变量包含嵌入式空格,则PowerShell会将变量的值隐含在双引号之前,然后将其传递给他人-this answer中已对链接的问题进行了讨论。
  • 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/

    相关文章:

    bash - 如何转义 ssh/remote bash 命令中的单引号字符?

    vim - 哪些 Vim 命令可用于引用/取消引用单词?

    bash - 查看 bash 变量的确切内容? (hexdump 没有帮助)

    regex - 使用正则表达式将文本提取到新列中

    linux - 如何从 wsl 调用 powershell 来使用语音合成器

    haskell神奇的代码,这里发生了什么

    python - 第 1 行带有 print 语句的错误标记

    rest - 如何将 PowerShell 调用 webrequest 与 Windows 身份验证和用户名\密码一起使用

    arrays - Powershell —数组转换类型问题

    .net - 是否有下划线(_)行继续的相反?