在我的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.