Function 如何动态创建在父作用域中可访问的函数?

Function 如何动态创建在父作用域中可访问的函数?,function,powershell,dynamic,scope,Function,Powershell,Dynamic,Scope,以下是一个例子: function ChildF() { #Creating new function dynamically $DynFEx = @" function DynF() { "Hello DynF" } "@ Invoke-Expression $DynFEx #Calling in ChildF scope Works DynF } ChildF #Calling in parent scope doesn't. It doesn't

以下是一个例子:

function ChildF()
{
  #Creating new function dynamically
  $DynFEx =
@"
  function DynF()
  {
    "Hello DynF"
  }
"@
  Invoke-Expression $DynFEx
  #Calling in ChildF scope Works
  DynF 
}
ChildF
#Calling in parent scope doesn't. It doesn't exist here
DynF

我想知道您是否可以这样定义DynF,即它在ChildF之外是“可见的”。

您可以使用
global
关键字来确定函数的范围:

function global:DynF {...}

另一个选项是使用
Set Item-Path函数:global:ChildFunction-Value{…}


使用
Set Item
,您可以将字符串或脚本块传递给函数定义的值。

其他解决方案更好地回答了特定问题。也就是说,最好学习创建全局变量的最通用方法:

# inner scope
Set-Variable -name DynFEx -value 'function DynF() {"Hello DynF"}' -scope global

# somewhere other scope
Invoke-Expression $dynfex
DynF

阅读“关于作用域的帮助”了解更多信息。

更正确、更实用的方法是将函数体作为脚本块返回,然后重新编译它

function ChildF() {
    function DynF() {
        "Hello DynF"
    }
    return ${function:DynF}
}
$DynFEx = ChildF
Invoke-Expression -Command "function DynF { $DynFEx }"
DynF

在上面给定的代码中,
函数global:DynF{…}
可能更有意义;-。将脚本块传递给
-Value
效果很好,但传递字符串并没有达到预期效果:虽然
Set Item
接受它,但调用该函数只会回显带花括号的定义字符串。你可以用
&
来解决这个问题,但这很麻烦,而且我不确定它是否有副作用(例如,
设置项函数:foo“&{arg 0:'+
$args[0]}
@args;foo'hi'
——如果需要在字符串中构建函数体,最好使用
调用表达式