我有两个.ps1
个文件。一个叫另一个。我想将一个函数名传递给另一个,以便另一个可以调用一个文件中定义的函数(依赖注入)。似乎是在调用另一个.ps1
文件时,它看不到来自调用者模块范围的函数。
这样做的原因是我可以生成一些包含这些函数的powershell实例。但是,由于这些是单独的实例,它们将无法访问调用者代码,因此我需要重新生成函数并通过声明我希望导出的函数并将这些函数转换为脚本字符串来将它们提供给新进程像这样:
Param(
[string]$Command,
[Array]$IncludeFunction = @()
)
Begin{
$Command += "`r`n"
Foreach ($functionName in $IncludeFunction)
{
$Command += "function $functionName() { ${function:$functionName} }`r`n"
}
}
我注意到可以访问调用模块范围的变量,所以我想知道这些函数是否也可以。
答案 0 :(得分:2)
在脚本中包含函数的快速而肮脏的方法是将函数写入第二个脚本,并在脚本中将dot-source写入要使用函数的脚本中:
# script1.ps1
. 'C:\path\to\script2.ps1'
SomeFunctionFromScript2 -Foo 'bar'
如果您想为多个脚本提供函数库,最好将函数包装在script module中。
# library.psm1
function FunctionA {
...
}
function FunctionB {
...
}
Export-ModuleMember -Function *
然后您可以分发库,人们可以像任何其他模块一样导入它:
# script1.ps1
Import-Module library
FunctionA ...
答案 1 :(得分:0)
问题不在于它们不可用,而是由于${function:$functionName}
不起作用。我必须使用(get-command $functionName).Definition
代替。不知道为什么会这样。