包含来自另一个文件的枚举

Include Enum's from another file

在我的 Powershell“项目”中,我希望将所有常见的枚举放在一个文件中,然后从各种其他脚本中引用该文件。

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

例如,枚举文件数据类型。ps1 看起来像这样:

Enum DataType { String, Integer, Boolean }

我试着像这样包含它:

. ".\datatypes.ps1"

class MyClass {
    [DataType]$Type = [DataType]::String
}

当我 运行 以上时,我收到错误消息:

Unable to find type [DataType].

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

点源应该工作吗?模块方法应该起作用吗?或者 Enum 必须位于同一个 file/script?

编辑:

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

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

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

假设基本项目布局如下:

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

MyModule.psm1

if (Test-Path -Path "$PSScriptRoot\Classes") {
    $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.