#powershell #module #enums #parameters
Вопрос:
в сценарии я пытаюсь использовать перечисление, определенное в модуле. Вот пример сценария.ps1:
using module SampleModule
param(
[SampleEnum] $MyEnum
)
$MyEnum
а вот SampleModule.psm1:
enum SampleEnum {
A
B
C
}
Запуск Sample.ps1 из нового Powershell выдает мне следующую ошибку:
PS C:test> .Sample.ps1
Unable to find type [SampleEnum].
At C:testSample.ps1:3 char:2
[SampleEnum] $MyEnum
~~~~~~~~~~~~
CategoryInfo : InvalidOperation: (SampleEnum:TypeName) [], RuntimeException
FullyQualifiedErrorId : TypeNotFound
Я могу явно импортировать модуль из оболочки следующим образом:
PS C:test> using module SampleModule
PS C:test> .Sample.ps1
PS C:test> .Sample.ps1 A
A
…но, конечно, я хочу, чтобы сценарий был самодостаточным.
Почему возникает ошибка и как ее обойти?
Обновление, чтобы быть более конкретным: использование перечисления в теле сценария, а не в объявлении параметров, работает, как здесь:
using module SampleModule
$MyEnum = [SampleEnum]::A
$MyEnum
Использование Import-Module
не работает ни в одном из сценариев, оно просто не делает перечисление видимым (см., например, описание ссылки здесь).
Поэтому моя проблема заключается в том, чтобы использовать перечисление в параметре сценария.
Комментарии:
1. Это
SampleModuleSampleEnum
опечатка или[SampleModuleSampleEnum]
фактический литерал типа, который вы используете в сценарии?2. Извините, была опечатка (см. Также «правильное» перечисление в сообщении об ошибке), произошла при копировании/редактировании вопроса. Спасибо, что отметили. Теперь исправлено.
3. чтобы быть уверенным, что я понял, вы хотите использовать переменную, созданную и инициализированную в модуле? не могли бы вы показать полный код в своем модуле ,как вы инициализируете свою переменную в модуле?
4. Я хочу использовать тип перечисления, который определен в модуле, в качестве параметра типа в списке параметров скрипта. Выше показан полный код как сценария, так и модуля (сокращенный, конечно, для демонстрации проблемы).
5. хорошо, я лучше понимаю вашу проблему..
Ответ №1:
Я тоже столкнулся с этим (с PS v5.1.17763.2090).
Насколько я могу судить (я не разбирал, чтобы проверить, но это то, как это выглядит на основе поведения простого сценария), сначала оценивается предложение PSM param (), поэтому любые типы, которые должны быть импортированы using
оператором, на данный момент неизвестны.
Лучшим обходным путем, который я мог бы найти, было бы использовать базовые типы, а затем преобразовать их следующим образом:
using module SampleModule
param(
[UInt64] $MyEnum
)
$MyEnum = [Enum]::ToObject([SampleEnum],$MyEnum)