1

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

我已经尝试对文件进行点源,并尝试将 Enum 文件转换为 psm1(导入模块),但到目前为止我没有尝试过任何工作。

例如,枚举文件 datatypes.ps1 看起来像这样:

Enum DataType { String, Integer, Boolean }

我试图像这样包含它:

. ".\datatypes.ps1"

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

当我运行上述内容时,我收到错误消息:

找不到类型 [DataType]。

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

点源应该起作用吗?模块方法应该起作用吗?还是枚举必须位于同一个文件/脚本中?

编辑:

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

4

1 回答 1

0

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

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

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

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

我的模块.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.
于 2021-09-08T07:06:26.410 回答