在 PowerShell 中运行命令行

问题描述 投票:0回答:1

我知道有很多关于此的帖子,但没有任何对我有用。

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

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

我在 PowerShell 中有这个:

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

但是这一切只是执行

clamd.exe
,忽略
--install
参数

如何才能运行完整的命令行?

powershell syntax quoting
1个回答
8
投票

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
    接受整个命令行,但这会使事情变得更加复杂,并且可能会带来 安全风险
  • 如果您想将整个命令行存储在变量中,以便以后按需执行,使用脚本块
    { ... }
    :请参阅这个答案
  • 以编程方式构造参数以调用外部程序,请使用splatting - 请参阅此答案
至于

为什么使用&

就是解决方案

  • 需要引用是有道理的:你需要告诉PowerShell,C:/Program Files (x86)/ClamWin/bin/clamd.exe

    是一个
    单个标记(路径),尽管包含嵌入的空格

  • 需要&

    ,即所谓的
    调用运算符,是由于PowerShell的两种基本解析模式

    • 参数模式,其工作方式类似于传统 shell,其中第一个标记是命令名称,后续标记代表参数,仅当它们包含 shell 元字符(chars.对 PowerShell 具有特殊含义,例如分隔标记的空格); 这就是为什么
      --install

       
      不需要,但 可以 被引用(PowerShell 将在将参数传递给目标可执行文件之前简单地为您删除引号。)

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

PowerShell 根据语句的

first 标记决定应用哪种解析模式:

如果第一个标记是带引号的字符串(由于可执行路径中嵌入空格,我们需要它)变量引用(例如,$var ...

),PowerShell 以
表达式模式进行解析默认情况下 带引号的字符串或变量引用作为表达式将简单地
输出字符串/变量值。

但是,鉴于我们想要

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

运算符所确保的


通常,重要的是要了解

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%
    )。但是,这存在基本限制 - 请参阅此答案的底部部分。

© www.soinside.com 2019 - 2024. All rights reserved.