Могу ли я создать сценарий с параметром, который имеет [alias ("db")] в Powershell? - PullRequest
10 голосов
/ 29 июля 2011

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

[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.
Можно ли определить этот псевдоним без переименования параметра?

Ответы [ 2 ]

9 голосов
/ 29 июля 2011

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

Даже если бы можно было обходить неопределенные встроенные псевдонимы, это неожиданно меняет значение вызова, например test-db -db, для кого-то, кто часто использует * 1007.* вместо -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' не может быть указан, поскольку он конфликтуетс псевдонимом параметра с тем же именем для параметра «Отладка».

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

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

0 голосов
/ 29 июля 2011
function test-db {
  param(
     [parameter(Mandatory = $true)]
     [string]$database=[string]$db
  )
  $PSBoundParameters["database"]
}

PS> test-db -database srv
PS> test-db -db srv
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...