Cra*_*ste 5 powershell powershell-2.0
我在文件中有一些PowerShell帮助函数.我想让它们可用于我正在编写的另一个文件的范围,但不会污染全局范围.
Helpers.ps1
function global:Helper1
{
# this function pollutes the global scope
}
function Helper2
{
# this function is not visible to the Utility.ps1 file.
}
Run Code Online (Sandbox Code Playgroud)
Utilities.ps1
&{
./Helpers.ps1
function global:Utility1
{
Helper1
}
function global:Utility2
{
Helper2
}
}
Run Code Online (Sandbox Code Playgroud)
我发现了这个问题: 如何动态创建父作用域中可访问的函数?但答案讨论了将功能添加到全局范围.我真正想做的是将Helper函数从一个PS1文件提供给调用的PS1文件,而不会使用帮助程序污染全局范围.
我想避免将函数定义为变量,这可以使用Set-Variable和-Scope参数.我见过的最接近的(来自链接线程)在函数:drive中使用Set-Item.
任何帮助,将不胜感激!
编辑:这是从迈克的答案扩展的解决方案
Helpers.ps1
function Helper
{
}
Run Code Online (Sandbox Code Playgroud)
Utilities.ps1
&{
function global:Utility
{
. ./Helpers.ps1
Helper1
}
}
Run Code Online (Sandbox Code Playgroud)
使用点源语法加载Helpers.ps1将其内容放在Utility函数的范围内.将Helpers.ps1放在Utility函数之外会使它位于&{...}范围内,但是一旦定义了函数,该范围就会结束.
您可以在Utilities.ps1文件中使用此代码段.我们所做的就是获得所有当前的功能,然后我们点源助手.然后我们对前后函数进行区分.从diff我们重新创建全局范围中的函数.
$beforeFunctions = ls function:
. .\helpers.ps1
$afterFunctions = ls function:
$functionDiff = @(Compare-Object $beforeFunctions $afterFunctions)
foreach($diffEntry in $functionDiff){
$func = $diffEntry.InputObject
invoke-expression "function global:$($func.Name) { $($func.definition) }"
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4692 次 |
| 最近记录: |