如何在Powershell中执行类似于$PROGPATH/program的bash命令?
如何在Powershell中执行类似于$PROGPATH/program的bash命令?
在GNU/Linux中,我会这样做:\n
PROGPATH=/long/and/complicated/path/to/some/bin $PROGPATH/program args...
\n但是在Powershell中,如果我尝试这样做:\n
$PROGPATH=\long\and\complicated\path\to\some\bin $PROGPATH\program args...
\n我会得到以下错误:\n
在script.ps1的第2个字符处:... + $PROGPATH\program args ... + ~~~~~~~~ 在表达式或语句中出现意外的标记'\program'。 + CategoryInfo : ParserError: (:) [], ParseException + FullyQualifiedErrorId : UnexpectedToken
\n那么我该如何在Powershell中做我在bash中知道如何做的这个简单的事情呢?
问题的原因是用户想知道如何在PowerShell中实现类似于bash中的$PROGPATH/program的功能,即使用变量来指定程序路径。
解决方法是使用调用运算符"&"来实现。在PowerShell中,可以使用"&"运算符来调用变量中存储的命令。例如,要调用$progpath变量中存储的路径的程序,可以使用以下代码:
$progpath = 'c:\windows\system32' & $progpath\notepad somefile.txt
如果路径中包含空格,可以使用单引号将路径括起来,并使用"&"运算符来调用。例如:
& 'C:\Program Files\internet explorer\iexplore' yahoo.com
另一种选择是将路径添加到环境变量$env:path中,然后直接调用程序名称。例如:
$env:path += ';C:\Program Files\internet explorer' iexplore yahoo.com
如果路径中有空格,可以使用反引号来转义空格。例如:
C:\Program` Files\internet` explorer\iexplore yahoo.com
以上就是解决这个问题的方法。用户可以根据自己的需求选择合适的方法来实现类似于bash中的$PROGPATH/program的功能。
在PowerShell中,如果命令名/路径包含变量引用,必须使用`&`来调用它。同样的规则也适用于使用分组表达式`(...)`或子表达式`$(...)`的情况。此外,如果命令名/路径被引用('...'或"..."),也是同样的规则适用,特别是如果路径包含空格。
换句话说,只有当命令名/路径是一个直接的、未引用的字符串时,才支持直接调用;在其他情况下,必须使用`&`。
为什么要这样做呢?这是因为`&`运算符是必需的,它强制将语句解释为命令,即在“参数模式”下进行解析,以实现命令执行而不是表达式求值。
PowerShell有两种基本的解析模式:
- 参数模式,类似于传统的shell,其中第一个标记是命令名/路径,如cmdlet或外部程序,后续标记表示参数,只有在包含shell元字符(对PowerShell具有特殊含义的字符,如用于分隔标记的空格)时才需要引号。
- 表达式模式,类似于编程语言中的表达式。
根据语句的第一个标记,PowerShell决定应用哪种解析模式:
- 如果首个标记以变量引用开头或为引用字符串,则PowerShell解析为表达式模式。
- 在表达式模式下,\将开始一个新的标记,并且无法识别的标记\program会导致你看到的语法错误。
注意,如果可执行文件路径是一个字面的字符串(不包含变量引用或表达式),你还可以使用`符号来转义单个字符(例如空格),而不是将整个字符串括在引号中。在这种情况下,`&`则不是必需的。