Могу ли я создать параметр script с параметром [alias ( "db" )] в Powershell?

Если я определяю следующее

[parameter(Mandatory = $true)]
[alias("db")]
[string]$database,

то я получаю сообщение об ошибке

Parameter alias cannot be specified because an alias with the name 'db'
was defined multiple times for the command.

Это верно, поскольку db уже является псевдонимом для универсального параметра -Debug.
Можно ли определить этот псевдоним без переименования параметра?

Ответ 1

Извините, вы не можете. -Debug является общим параметром, поэтому -Debug и -db являются переключателями, которые доступны практически во всем, включая функции, которые вы пишете сами. Как сообщает вам ошибка, она уже определена.

Даже если бы можно было обходить неопределенные встроенные псевдонимы, это неожиданно меняет смысл вызова типа test-db -db для кого-то другого, который часто использует -db вместо -Debug. Они ожидают, что он включит вывод отладки, не указывая другой параметр.

Рассмотрим эту функцию:

function test-db{
  param(
    [parameter(mandatory=$true)]
    [string]$database)
  write-host 'database' $database
  write-debug 'debugging output'
}

Теперь назовите его test-db server, test-db -db server и test-db server -db. Первый не делает write-debug, а остальные 2 - независимо от того, где -db. Вы также не можете определить отдельный параметр [string]$db (или переименовать $database в $db), потому что Powershell выдаст вам эту ошибку:

Параметр "db" не может быть указан, поскольку он конфликтует с псевдонимом параметра с тем же именем для параметра "Debug".

Подробнее об этом, за MSDN:

В дополнение к использованию атрибута AliasAttribute Windows Среда исполнения PowerShell выполняет частичное совпадение имен, даже если никакие псевдонимы указаны. Например, если ваш командлет имеет параметр FileName и это единственный параметр, который начинается с F, пользователь может введите имя файла, Filenam, файл, Fi или F и все еще распознайте запись как параметр FileName.

Ответ 2

function test-db {
  param(
     [parameter(Mandatory = $true)]
     [string]$database=[string]$db
  )
  $PSBoundParameters["database"]
}

PS> test-db -database srv
PS> test-db -db srv