【发布时间】:2019-04-08 08:42:35
【问题描述】:
假设我是passing a function as a parameter,有没有办法通过powershell中的自省找出传递函数的名称?还是我只需要将它与其余参数一起传递?
(不调用相关函数)
【问题讨论】:
标签: function powershell introspection
假设我是passing a function as a parameter,有没有办法通过powershell中的自省找出传递函数的名称?还是我只需要将它与其余参数一起传递?
(不调用相关函数)
【问题讨论】:
标签: function powershell introspection
链接的问题试图通过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.
【讨论】: