Powershell — Как использовать «перечисление», импортированное из модуля в качестве параметра сценария

#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)