如何在 Powershell 中执行等同于 $PROGPATH/program 的 bash?

How do I do the bash equivalent of $PROGPATH/program in Powershell?

在GNU/Linux我会做:

PROGPATH=/long/and/complicated/path/to/some/bin
$PROGPATH/program args...

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

$PROGPATH=\long\and\complicated\path\to\some\bin
$PROGPATH\program args...

我得到:

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

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

使用调用运算符“&”。 https://ss64.com/ps/call.html

相关:Executing a command stored in a variable from PowerShell

$progpath = 'c:\windows\system32'
& $progpath\notepad somefile.txt

带有 space 的东西:

 & 'C:\Program Files\internet explorer\iexplore' yahoo.com

其他选项,加入路径:

$env:path += ';C:\Program Files\internet explorer'
iexplore yahoo.com

并反引用 spaces:

C:\Program` Files\internet` explorer\iexplore yahoo.com

显示正确的解决方案:

因为您的命令 name/path 包含一个 变量引用 ($PROGPATH/...),您必须使用 & 调用它.
如果涉及 grouping expression, (...) is used, or a subexpression, $(...),同样适用。

此外,如果命令 name/path 被 引用'...'"..."[1],如果路径包含 空格 ,则需要。

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

至于为什么:

&, the call operator 是强制将语句解释为 命令 所必需的,即将其解析为 参数模式(见下文),以便导致命令执行而不是表达式求值.

PowerShell 有两个基础 parsing modes:

  • 参数模式传统shell,其中第一个标记是 命令 name/path,例如cmdlet 或外部程序,后续标记表示参数,仅当它们包含 shell 元字符 时才需要引用(字符。对 PowerShell 具有特殊含义,例如用于分隔的空格代币)。

  • 表达式模式类似于编程语言中的表达式.

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

如果第一个标记以 变量引用 开头或者是 引用字符串 , PowerShell 以 表达式模式 .

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

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