gpt4 book ai didi

powershell - 从文件到函数内部的全局范围的点源函​​数

转载 作者:行者123 更新时间:2023-12-03 07:03:10 25 4
gpt4 key购买 nike

我想从文件导入外部函数,而不是将其转换为模块(每个函数有数百个文件,因此将它们全部视为模块是多余的)。

这里是代码解释。请注意,我在 Import-Function 中有一些额外的逻辑,例如添加脚本根文件夹以及检查文件是否存在并引发特殊错误,以避免在需要此类导入的每个脚本中重复此代码。

C:\Repository\Foo.ps1:

Function Foo {
Write-Host 'Hello world!'
}

C:\InitationTest.ps1:

# Wrapper func
Function Import-Function ($Name) {
# Checks and exception throwing are omitted
. "C:\Repository\$name.ps1"

# Foo function can be invoked in this scope
}

# Wrapped import
Import-Function -Name 'Foo'
Foo # Exception: The term 'Foo' is not recognized

# Direct import
. "C:\Repository\Foo.ps1"
Foo # 'Hello world!'

有什么技巧可以将源代码点到全局范围吗?

最佳答案

您无法使脚本在父作用域中运行,但您可以通过显式确定作用域来在全局作用域中创建函数。

这样的东西对你有用吗?

# Wrapper func
Function Import-Function ($Path) {
# Checks and exception throwing are omitted
$script = Get-Content $Path
$Script -replace '^function\s+((?!global[:]|local[:]|script[:]|private[:])[\w-]+)', 'function Global:$1'
.([scriptblock]::Create($script))

}

The above regex仅针对根函数(函数左对齐;单词 function 左侧没有空格)。为了定位所有函数,无论间距如何(包括子函数),请将 $Script -replace 行更改为:

$Script -replace '^\s*function\s+((?!global[:]|local[:]|script[:]|private[:])[\w-]+)','function Global:$1'

关于powershell - 从文件到函数内部的全局范围的点源函​​数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15187510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com