Экспорт объявления перечисления Powershell 5 из модуля

У меня есть тип перечисления, определенный в модуле. Как экспортировать его, чтобы он был доступен извне после загрузки модуля?

enum fruits {
 apple
 pie
}

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

Моя расширенная функция принимает перечисление вместо ValidateSet, которое работает, если перечисление доступно, но терпит неудачу, если это не так.

Обновление: разделение его на ps1 и точечный поиск (ScriptsToProcess) работает, однако я бы хотел, чтобы был более чистый способ.


person Joel    schedule 31.10.2016    source источник
comment
См. как экспортировать класс в модуль powershell v5 — добавьте using module moduleName после импорта   -  person wOxxOm    schedule 01.11.2016
comment
@wOxxOm The using module command imports the module and also loads the class definitions docs.microsoft.com/en-us/powershell/module/   -  person metablaster    schedule 17.12.2020


Ответы (4)


Столкнулся с той же проблемой при попытке использовать/экспортировать перечисление из вложенного модуля (.psm1) в 5.0.x.

Удалось заставить его работать, используя вместо этого Add-Type:

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

Затем вы сможете использовать

[fruits]::apple
person Will    schedule 10.01.2019
comment
+1, потому что это лучший метод, если вы зависите от функции автозагрузки модуля, иначе нам пришлось бы вручную делать using module ... - person metablaster; 17.12.2020

Вы можете получить доступ к перечислениям после загрузки модуля с помощью команды 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
person Christopher G. Lewis    schedule 01.11.2016

Когда вы получаете классы, enum или любой тип .Net в модуле и хотите их экспортировать, вы должны использовать ключевое слово using в скрипте, куда вы хотите его импортировать, иначе будут импортированы только cmlet.

person Aquiles Toruño    schedule 13.12.2018

Похоже, это проблема где-то в выпуске PowerShell 5.0.x.

У меня была проблема на 5.0.10105.0

Однако в версии 5.1.x это работает нормально.

person Dustin    schedule 23.05.2018