包括另一个文件中的枚举



在我的Powershell项目中;我想有所有共同的枚举在一个文件,然后从各种其他脚本引用该文件。

我试过点源文件,我试过将Enum文件转换为psm1(导入模块),但到目前为止我所尝试的都没有成功。

例如Enum文件数据类型。Ps1看起来像这样:

Enum DataType { String, Integer, Boolean }

我试着像这样包含它:

. ".datatypes.ps1"
class MyClass {
[DataType]$Type = [DataType]::String
}

当我运行上面的代码时,我得到了错误信息:

无法找到类型[DataType].

我以前使用点源来包含变量和函数,这些总是有效的。但现在Enum拒绝工作:

点包工作吗?模块方法是否有效?或必须枚举位于同一文件/脚本?

编辑:

我想我可能已经发现了问题,似乎在包含之前脚本正在被完全解析,这可能是问题吗?

我认为Import-Module不起作用,因为它将项加载到不同的上下文中。您可以使用点源或using module语句。如果使用后者,则需要提供文件的完整路径,或者将其放在$env:PSModulePath路径之一中。

如果您想将枚举或类导入到模块中,我发现下面的方法效果最好,即点源模块psm1文件中的完整文件名。

假设一个基本的项目布局:

- MyModule
|- Classes
|- MyClasses.ps1
|- Enums
|- MyEnums.ps1
|- MyModule.psm1
|- MyModule.psd1

MyModule.psm1

if (Test-Path -Path "$PSScriptRootClasses") {
$Enums = Get-ChildItem (Join-Path $PSScriptRoot Enums) -Filter *.ps1 -ErrorAction SilentlyContinue
$Classes = Get-ChildItem (Join-Path $PSScriptRoot Classes) -Filter *.ps1 -ErrorAction SilentlyContinue
# Order imports so that Enums are before Classes
foreach ($Class in @($Enums;$Classes)) {
Try {
. $Class.FullName
Write-Verbose -Message "Imported $($Class.BaseName)"
}
Catch {
Write-Error -Message "Could not load Class [$($Class.Name)] : $($_.Message)"
}
}
}
# Import functions here if you have them, or do anything else.

最新更新