Как добавить числовой переключатель в скрипт 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 быть приемлемым решением вашей проблемы?

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

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
Другие вопросы по тегам