如何在Powershell中使用另一个函数的输出运行命令?

时间:2018-07-12 09:35:24

标签: powershell

我有以下运行良好的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输出成为第一个参数。我已经尝试使用引号,但也不起作用-括号不再扩展。

如何使用函数的输出运行命令?

1 个答案:

答案 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