14

我在模块中定义了一个枚举类型。加载模块后,如何将其导出为可从外部访问?

enum fruits {
 apple
 pie
}

function new-fruit {
    Param(
        [fruits]$myfruit
    )
    write-host $myfruit
}

如果枚举可用,我的高级功能将使用枚举而不是ValidateSet使用枚举,但如果不可用则失败。

更新: 将其分离为 ps1 并对其进行点源(ScriptsToProcess)是可行的,但是我希望有一种更清洁的方法。

4

4 回答 4

10

尝试从 5.0.x 上的嵌套模块 (.psm1) 使用/导出枚举时遇到了同样的问题。

设法通过使用Add-Type来使其工作:

Add-Type @'
public enum fruits {
    apple,
    pie
}
'@

然后你应该可以使用

[fruits]::apple
于 2019-01-10T16:37:54.057 回答
8

using module ...您可以在使用命令加载模块后访问枚举。

例如:

我的模块.psm1

enum MyPriority {
    Low = 0
    Medium = 1
    high = 2
}
function Set-Priority {
  param(
    [Parameter(HelpMessage = 'Priority')] [MyPriority] $priority
  )
  Write-Host $Priority
}  
Export-ModuleMember -function Set-Priority

制作:

New-ModuleManifest MyModule.psd1 -RootModule 'MyModule.psm1' -FunctionsToExport '*' 

然后在Powershell中...

Import-Module .\MyModule\MyModule.psd1
PS C:\Scripts\MyModule> [MyPriority] $p = [MyPriority ]::High
Unable to find type [MyPriority].
At line:1 char:1
+ [MyPriority] $p = [MyPriority ]::High
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (MyPriority:TypeName) [], RuntimeException
    + FullyQualifiedErrorId : TypeNotFound

PS C:\Scripts\MyModule> using module .\MyModule.psd1
PS C:\Scripts\MyModule> [MyPriority] $p = [MyPriority ]::High
PS C:\Scripts\MyModule> $p
high
于 2016-11-01T16:37:40.777 回答
2

当您在模块中获取类、枚举或任何 .Net 类型并且想要导出它们时,您必须using在要导入它的脚本中使用关键字,否则只会cmlet被导入。

于 2018-12-13T16:56:59.933 回答
-2

这似乎是 PowerShell 5.0.x 版本中的某个问题。

我在 5.0.10105.0 上遇到了问题

但是,这在 5.1.x 版本中运行良好。

于 2018-05-23T10:00:56.617 回答