Как добавить числовой переключатель в сценарий PowerShell

Я знаю, как добавить параметры переключателя в сценарии PowerShell, но имя переключателя всегда является (действительным) идентификатором, например -Enable, поскольку имя генерируется из резервной переменной PowerShell.

[CmdletBinding()]
param(
  [switch] $Enable = $false
)

Некоторые инструменты имеют такие переключатели, как -2008. Обычно переключатель называют $2008, но это недопустимый идентификатор.

Как я могу реализовать такой переключатель как логическое значение в PowerShell? Или, другими словами: как указать другое имя параметра, чем вспомогательная переменная?


Изменить 1

Я не знал о числовых переменных (что очень странно для языка программирования...). Во всяком случае, я создал этот пример:

function foo
{ [CmdletBinding()]
  param(
    [switch] $2008
  )
  Write-Host "2008=$2008"
}

Для этого кода, который считается действительным PowerShell, я получаю автодополнение, как и хотел. Но при предоставлении этого параметра я получаю это сообщение об ошибке:

foo : Es wurde kein Positionsparameter gefunden, der das Argument "-2008" akzeptiert.
In Zeile:1 Zeichen:1
+ foo -2008
+ ~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [foo], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,foo

Перевод: Не найден позиционный параметр, принимающий аргумент "-2008".

Цель скрипта — предоставить переводы/обертки для интерфейсов командной строки.

Вот набор стандартизированных исполняемых файлов с параметрами:

vcom.exe -2008 design.vhdl
vsim.exe -2008 design

Перевод:

ghdl.exe -a --std=2008 design.vhdl
ghdl.exe -e --std=2008 design
ghdl.exe -r --std=2008 design

Я хотел бы сохранить функцию автодополнения для параметров, иначе я мог бы обрабатывать все остальные параметры и переводить их вручную.


person Paebbels    schedule 08.09.2017    source источник
comment
я не понимаю, вы хотите, чтобы имя коммутатора было именно $true?   -  person 4c74356b41    schedule 08.09.2017
comment
Обычно вы бы назвали переключатель $2008, но это недопустимый идентификатор. Итак, как указать другое имя параметра, а не вспомогательную переменную?   -  person Paebbels    schedule 08.09.2017
comment
Хотя вы можете использовать число в качестве имени переменной, оно не интерпретируется как допустимое имя параметра (даже если указано как псевдоним). Я не думаю, что это возможно (или особенно разумно).   -  person Mark Wragg    schedule 08.09.2017
comment
@Paebbels ${2008}   -  person Mathias R. Jessen    schedule 08.09.2017
comment
это была моя мысль, но у меня это не работает @MathiasR.Jessen   -  person 4c74356b41    schedule 08.09.2017
comment
Этого нельзя допустить, потому что это создает неоднозначность при синтаксическом анализе отрицательных целых чисел — является ли -2008 значением безымянного параметра или переключателя с именем 2008? Я не недоволен, что PowerShell допускает только первое. Если эти переключатели имеют смысл в вашем контексте, подумайте о том, чтобы просто настроить их так, чтобы они были действительными — например, -Y2008, если это должно быть годом, -W2008, если это должно включать предупреждение, и так далее.   -  person Jeroen Mostert    schedule 08.09.2017
comment
@ 4c74356b41 любопытно, синтаксический анализатор справляется как с определением, так и с выполнением, но в конечном итоге, похоже, игнорирует наличие -2008. Есть ли в OP пример командлета с числовым переключателем?   -  person Mathias R. Jessen    schedule 08.09.2017
comment
довольно забавно, это работает, если вы $p=@{2008=$true}, function @p, вам даже не нужно ${2008}, $2008 тоже работает   -  person 4c74356b41    schedule 08.09.2017
comment
@JeroenMostert, конечно, это имеет смысл. Я бы, вероятно, выбрал параметр string (или string[], если значения не являются взаимоисключающими) с ограниченным атрибутом ValidateSet. Вы должны добавить ответ кстати   -  person Mathias R. Jessen    schedule 08.09.2017
comment
В некоторых инструментах есть такие переключатели, как -2008: было бы интересно увидеть пример этого. По крайней мере, внутри PowerShell это кажется маловероятным.   -  person Mark Wragg    schedule 08.09.2017
comment
Пожалуйста, смотрите мой расширенный вопрос.   -  person Paebbels    schedule 09.09.2017


Ответы (1)


PowerShell не поддерживает числовые параметры (см. этот ответ).

Может ли набор валидации быть приемлемым решением вашей проблемы?

Validate set выигрывает от функции автозаполнения, и, на мой взгляд, это следующая лучшая вещь из того, что вы хотели.

ValidateSet и автозаполнение

Foo и Foos — оба одинаковы, за исключением того, что Foos принимает несколько параметров.

foo -std 2008
foos -std 2008,2009,2010





    function foo
{ [CmdletBinding()]
  param(
    [ValidateSet("2008",
                 "2009",
                 "2010",
                 "2011","2012")][INT]$std
  )
  Write-Host "std:$std"
}

function foos
{ [CmdletBinding()]
  param(
    [ValidateSet("2008",
                 "2009",
                 "2010",
                 "2011","2012")][INT[]]$std
  )
  $std | foreach {Write-Host "std: $_"}
}





foo -std 2008
foos -std 2008,2009,2010
person Sage Pourpre    schedule 09.09.2017
comment
Оригинальная программа, например. vcom не имеет переключателя -std перед номером версии. Более того, - отсутствует. Поэтому я думаю, что мне нужно использовать другое решение, такое как скрипт Python с ArgParse. - person Paebbels; 09.09.2017
comment
Если это оболочка для реального исполняемого файла, разве вы не можете просто вызвать его позже, используя &YourWrappedapp.exe -$std, чтобы вы эффективно использовали foo -std 2008 для вызова YourWrappedApp.exe -2008 ? или я что-то пропустил?. - person Sage Pourpre; 09.09.2017
comment
Оболочка (написанная на PowerShell) должна эмулировать интерфейс vcom, поэтому она должна предоставлять переключатель -2008. внутренне он вызовет ghdl.exe с переключателем --std=2008, если -2008 был установлен на оболочке. Цель состоит в том, чтобы существующие сценарии симулятора для вызовов vcom/vlib/vsim можно было повторно использовать для симулятора GHDL, который использует другой интерфейс командной строки, но предлагает те же самые команды (анализ, разработка, запуск моделирования). - person Paebbels; 10.09.2017