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'
——如果需要在字符串中构建函数体,最好使用调用表达式
。