包含来自另一个文件的枚举
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.
在我的 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.