我有以下运行良好的ps1
脚本:
function Get-ScriptDirectory {
$Invocation = (Get-Variable MyInvocation -Scope 1).Value
Split-Path $Invocation.MyCommand.Path
}
$currentDir = Get-ScriptDirectory
node $currentDir/yarn.js $args
我想消除$currentDir
变量。我正在尝试跑步:
function Get-ScriptDirectory {
$Invocation = (Get-Variable MyInvocation -Scope 1).Value
Split-Path $Invocation.MyCommand.Path
}
node (Get-ScriptDirectory)/yarn.js $args
但是这失败了-看来Get-ScriptDirectory
输出成为第一个参数。我已经尝试使用引号,但也不起作用-括号不再扩展。
如何使用函数的输出运行命令?
答案 0 :(得分:1)
根据过去的经验,尽管{@ 3}}的指针总是受到赞赏,但没有必要等待PetSerAl发表答案。
您的选项为:
其中之一:使用 expression 构造路径:
node ((Get-ScriptDirectory) + '/yarn.js') $Args
或:使用可扩展字符串(字符串插值):
node "$(Get-ScriptDirectory)/yarn.js" $Args
背景:
(...)
需要在期望 command自变量或 subexpression 的上下文中包含单个表达式或命令(可能是一个 command 调用本身需要包装在(...)
或需要明确评估优先级的嵌入式表达式中。)
$(...)
是-更加灵活,但速度较慢的子表达式运算符:
要将表达式或命令嵌入到可扩展字符串("..."
)中,您必须使用{{1} }-$(...)
无法正常工作。
之外,虽然(...)
通常 也可以,但是通常不需要使用它,除非您需要执行< em>多个语句。
$(...)
不仅足够,而且性能更好。其他信息:
要了解 PowerShell的基本解析模式,请参阅Get-Help about_Parsing
要了解 PowerShell的字符串扩展(字符串插值)规则,请参阅我的this answer。
有关如何在参数模式下(作为命令参数)解析未加引号的命令行标记的全面讨论,请参见我的this answer。