如果你真的必须这样做,有一种方法,但它涉及通过抽象语法树进行搜索。这可能有点复杂,但它可以完成工作。
所以你有这样定义的功能:
Function Outer {
Function Inner {
# ...
}
# ...
}
你可以找到如下scriptblock
的函数:Inner
$outerCommandInfo = Get-Command -Name 'Outer'
$innerDefinition = $outerCommandInfo.ScriptBlock.Ast.FindAll( { param($ast) $ast -is [System.Management.Automation.Language.FunctionDefinitionAst] }, $true) | ? Name -eq 'Inner'
$innerScriptBlock = $innerDefinition.Body.GetScriptBlock()
现在,在$innerScriptBlock
变量中你有Inner
函数的定义。您可以使用调用运算符调用它,或者简单地调用它$innerScriptBlock.Invoke()
传递参数和测试它会有点棘手。
Describe "A" {
BeforeAll {
# the code above
}
It "A" { Outer } | Should -be $null # OK
It "B" { & $innerScriptBlock } | Should -be $null # OK?
}