【问题标题】:Using Powershell introspection to find the name of a function passed as a parameter?使用Powershell自省查找作为参数传递的函数的名称?
【发布时间】:2019-04-08 08:42:35
【问题描述】:

假设我是passing a function as a parameter,有没有办法通过powershell中的自省找出传递函数的名称?还是我只需要将它与其余参数一起传递?

(不调用相关函数)

【问题讨论】:

    标签: function powershell introspection


    【解决方案1】:

    链接的问题试图通过name传递一个函数,作为一个string,在这种情况下答案很明显:参数本身就是函数名。

    如果改为传递 脚本块,您可以使用以下技术:

    function get-ScriptBlockCommandName {
    
      param(
       [scriptblock] $ScriptBlock,
       [switch] $Expand 
      )
    
      # Using the script block's AST, extract the first command name / path token.
      $commandName = $ScriptBlock.Ast.EndBlock.
        Statements[0].PipelineElements.CommandElements[0].Extent.Text
    
      # Expand (interpolate) the raw name, if requested.
      if ($Expand) {
        $commandName = $ExecutionContext.InvokeCommand.ExpandString($commandName) 
      }
    
      # Remove outer quoting, if present.
      if ($commandName -match '^([''"])(.+)\1$') {
        $commandName = $Matches[2]
        if ($Matches[1] -eq "'") { $commandName = $commandName -replace "''", "'" }
      } 
    
      # Output
      $commandName
    
    }
    

    该函数返回从脚本块内部调用的(第一个)命令名称/路径。

    注意事项

    • 如果您将 表达式(例如,1 + 2)作为脚本块内的第一条语句传递,则会发生错误。

    • 仅分析 first 命令(并返回其命令名称/路径),而脚本块中可以放置的语句数量没有限制。

    • 默认情况下,如果命令名称/路径是由变量/其他命令构造的,则它们不会扩展(插值),因为这样做会导致命令执行;要选择扩展,请使用-Expand 开关。

    示例调用:

    PS> get-ScriptBlockCommandName { foo -bar baz -more stuff }
    foo
    

    这也适用于 引用 名称/路径(注意必须如何使用 & 来调用命令):

    PS> get-ScriptBlockCommandName { & '/dir name/foo' -bar baz -more stuff }
    /dir name/foo
    

    但是,为了避免潜在的不想要的命令执行,返回的命令名称/路径原样,带有变量引用和子表达式未扩展
    您可以选择通过传递 -Expand 来扩展这些内容:

    PS> get-ScriptBlockCommandName { & "$HOME/scripts/foo.ps1" -bar baz  } -Expand
    C:/Users/jdoe/scripts.ps1  # e.g.
    

    【讨论】:

      猜你喜欢
      • 2015-07-06
      • 1970-01-01
      • 1970-01-01
      • 2016-11-04
      • 1970-01-01
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      • 2020-01-05
      相关资源
      最近更新 更多