代码之家  ›  专栏  ›  技术社区  ›  mikemaccana

如何使用PowerShell中其他函数的输出运行命令?

  •  1
  • mikemaccana  · 技术社区  · 7 年前

    我有以下几点,非常好用 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 回复  |  直到 7 年前
        1
  •  1
  •   mklement0    7 年前

    根据过去的经验,没有必要等待 PetSerAl 尽管他的指点总是受到赞赏,但他还是给出了一个答案。

    您的 选项 是:

    • 任选其一:使用 表达 要构建路径:

      node  ((Get-ScriptDirectory) + '/yarn.js') $Args
      
    • 或:使用 可展开字符串 (字符串插值):

      node  "$(Get-ScriptDirectory)/yarn.js" $Args
      

    背景 以下内容:

    • (...) 需要将单个表达式或命令括在 命令参数 子表达式 应为(可能是 命令 需要包装自身的调用 (…) 或嵌入表达式,其评估优先级需要澄清)。

    • $(...) 是-更灵活但较慢的-子表达式运算符:

      • 为了将表达式或命令嵌入到 可展开字符串 ( "..." )你 必须 使用 美元(…) - (…) 不会工作的。

      • 外部 一个可扩展的字符串,而 美元(…) 通常地 有效,通常不需要使用它,除非您需要执行 倍数 声明。

        • 对于单个表达式/命令, (…) 不仅足够,而且 性能更好 .

    附加信息 以下内容:

    • 了解 PowerShell的基本分析模式 ,请参见 Get-Help about_Parsing

    • 了解 PowerShell的字符串扩展(字符串插值)规则 ,请参见 this answer 我的。

    • 全面讨论 如何在参数模式(作为命令参数)中解析未引用的命令行标记 ,请参见 this answer 我的。

    推荐文章