从模块导出Powershell 5枚举声明

kiayqfof  于 2023-04-21  发布在  Shell
关注(0)|答案(5)|浏览(187)

我在一个模块中定义了一个枚举类型。一旦模块被加载,我如何导出它以便从外部访问?

enum fruits {
 apple
 pie
}

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

我的高级函数采用枚举而不是ValidateSet,如果枚举可用,则该函数工作,但如果枚举不可用,则该函数失败。

**更新:**将其分离为ps1和点源(ScriptsToProcess)工作,但我希望有一个更干净的方法。

gv8xihay

gv8xihay1#

尝试从5.0.x上的嵌套模块(.psm1)使用/导出枚举时遇到了相同的问题。
通过使用Add-Type来使其工作:

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

然后您应该能够使用

[fruits]::apple
bqf10yzr

bqf10yzr2#

您可以在加载模块后使用using module ...命令访问枚举。
例如:
MyModule.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
5jvtdoz2

5jvtdoz23#

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

hl0ma9xz

hl0ma9xz4#

我看到你的问题说你正在寻找一种比点源脚本或使用ScriptsToProcess更干净的方法,但这对我来说很有效。

第一步:

  • 在你的模块中创建一个.PS1文件。我调用了我的Enumerations.ps1,并将该文件放在我的模块的根文件夹中。
  • 在这个新文件中放置枚举语句
ENUM DeathStarPlans {
     Reactor = 0
     Trench  = 1
     SuperSecretExhaustPort = 2
     }

第二步

  • 更新.PSD1清单文件以包含ScriptsToProcess选项
  • 参考枚举文件的路径。此路径相对于.psd1文件所在的位置。
ScriptsToProcess = @(".\Enumerations.ps1")

第三步

  • 导入你的模块,这可能需要关闭powershell并重新打开,如果你有类或其他类型创建。
Import-Module "module name" -force

第四步

  • 使用枚举
[DeathStarPlans]::SuperSecretExhaustPort
mm9b1k5b

mm9b1k5b5#

这似乎是PowerShell 5.0.x版本中的一个问题。
我的问题是5.0.10105.0
但是,这在5.1.x版本中工作正常。

相关问题