Я знаю, как добавить параметры переключателя в сценарии 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
Я хотел бы сохранить функцию автодополнения для параметров, иначе я мог бы обрабатывать все остальные параметры и переводить их вручную.
$true
? - person 4c74356b41   schedule 08.09.2017$2008
, но это недопустимый идентификатор. Итак, как указать другое имя параметра, а не вспомогательную переменную? - person Paebbels   schedule 08.09.2017${2008}
- person Mathias R. Jessen   schedule 08.09.2017-2008
значением безымянного параметра или переключателя с именем2008
? Я не недоволен, что PowerShell допускает только первое. Если эти переключатели имеют смысл в вашем контексте, подумайте о том, чтобы просто настроить их так, чтобы они были действительными — например,-Y2008
, если это должно быть годом,-W2008
, если это должно включать предупреждение, и так далее. - person Jeroen Mostert   schedule 08.09.2017-2008
. Есть ли в OP пример командлета с числовым переключателем? - person Mathias R. Jessen   schedule 08.09.2017$p=@{2008=$true}, function @p
, вам даже не нужно ${2008}, $2008 тоже работает - person 4c74356b41   schedule 08.09.2017string
(илиstring[]
, если значения не являются взаимоисключающими) с ограниченным атрибутомValidateSet
. Вы должны добавить ответ кстати - person Mathias R. Jessen   schedule 08.09.2017