Как добавить числовой переключатель в скрипт 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
Я хотел бы сохранить функцию автоматического завершения для параметров, в противном случае я мог бы обработать все оставшиеся параметры и перевести их вручную.
1 ответ
PowerShell не поддерживает числовые параметры (см. Этот ответ).
Может ли 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