以下是一个例子:
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。
答案 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