如何动态地创建在父范围内使用的功能?(How do I dynamically create fun

2019-06-25 20:07发布

下面是一个例子:

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的“可见”之外。

Answer 1:

其他的解决方案是对具体问题更好的答案。 这就是说,它是很好的学习创建全局变量的最一般的方法:

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

# somewhere other scope
Invoke-Expression $dynfex
DynF

阅读“帮助参阅about_Scopes”为万吨以上信息。



Answer 2:

另一种选择是使用Set-Item -Path function:global:ChildFunction -Value {...}

使用Set-Item ,你可以通过一个字符串或脚本块函数的定义值。



Answer 3:

您可以域内具有功能global关键字:

function global:DynF {...}


Answer 4:

要做到这一点更正确和实用的方法是将函数体返回的脚本块,然后重新它。

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


文章来源: How do I dynamically create functions that are accessible in a parent scope?