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

时间:2009-07-14 05:45:16

标签: 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 exist here
DynF

我想知道你是否可以在ChildF之外“可见”的方式定义DynF。

4 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:8)

您可以使用global关键字定位该功能:

function global:DynF {...}

答案 2 :(得分:6)

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

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

# somewhere other scope
Invoke-Expression $dynfex
DynF

阅读'help about_Scopes'获取更多信息。

答案 3 :(得分:0)

更正确和实用的方法是将函数体作为脚本块返回,然后重新组合。

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