如何在 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
在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