如何在 Powershell 中执行相当于 $PROGPATH/program 的 bash 操作?

gkn*_*uth 5 syntax powershell command-line-arguments

在 GNU/Linux 中我会这样做:

PROGPATH=/long/and/complicated/path/to/some/bin
$PROGPATH/program args...
Run Code Online (Sandbox Code Playgroud)

但在 Powershell 中如果我尝试这样做:

$PROGPATH=\long\and\complicated\path\to\some\bin
$PROGPATH\program args...
Run Code Online (Sandbox Code Playgroud)

我得到:

At script.ps1:2 char:...
+ $PROGPATH\program args ...
+          ~~~~~~~~
Unexpected token '\program' in expression or statement.
+ CategoryInfo          : ParserError: (:) [], ParseException
+ FullyQualifiedErrorId : UnexpectedToken
Run Code Online (Sandbox Code Playgroud)

那么我该如何做这个我知道如何在 bash、Powershell 中做的简单事情呢?

mkl*_*nt0 4

js2010的有用答案显示了正确的解决方案:

因为您的命令名称/路径包含变量引用( $PROGPATH/...),所以您必须使用 来调用它&:如果使用分组表达式或涉及子表达式,& $PROGPATH\program args...
则同样适用。(...)$(...)

此外,如果命令名称/路径被引用'...'"..."[1] ,则同样适用,例如,如果路径包含空格则需要如此。

换句话说:仅当命令名称/路径是逐字的、不带引号的字符串[1]时,才支持直接调用;在所有其他情况下,&必须使用。

至于为什么

&调用运算符对于强制将语句解释为命令是必要的,即以参数模式对其进行解析(见下文),以便导致命令执行而不是表达式求值

PowerShell 有两种基本解析模式

  • 参数模式,其工作方式类似于传统的 shell,其中第一个标记是命令名称/路径,例如 cmdlet 或外部程序,后续标记表示参数,仅当它们包含 shell元字符(chars.with对 PowerShell 有特殊含义,例如分隔标记的空格)。

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

PowerShell 根据语句的第一个标记决定应用哪种解析模式:

除其他事项外,如果第一个标记以变量引用开头或者是带引号的字符串,则 PowerShell 将以表达式模式进行解析。

  • 在表达式模式下,\ 启动一个新的标记,无法识别的标记\program会导致您看到的语法错误。
  • (如果您使用了/,它将被解释为除法运算符,并且program不会是有效的除数操作数。)

[1] 请注意,如果您的可执行路径是文字字符串(不包含表达式的变量引用),您也可以使用 -转义`单个字符(空格)来代替将整个字符串包含在'...'或中"...",在这种情况下&则没有必要;例如:
C:\Program` Files\Notepad++\notepad++.exe
对于文字字符串,只要第一个标记不带引号,您甚至可以使用部分单引号或双引号;例如:
C:\"Program Files"\Notepad++\notepad++.exe