我可以在Powershell中创建一个带[alias(“db”)]参数的脚本吗?

时间:2011-07-29 08:13:14

标签: 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参数的别名 是否可以在不重命名参数的情况下定义此别名?

2 个答案:

答案 0 :(得分:9)

对不起,你不能。 -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 servertest-db -db servertest-db server -db进行调用。第一个不执行write-debug,而另一个执行-db,无论[string]$db在哪里。您也无法定义单独的参数$database(或将$db重命名为{{1}}),因为Powershell会为您提供此错误:

  

无法指定参数'db',因为它与参数'Debug'的同名参数别名冲突。

有关此问题的更多信息,请MSDN

  

除了使用AliasAttribute属性外,还有Windows   即使没有别名,PowerShell运行时也会执行部分名称匹配   是指定的。例如,如果您的cmdlet具有 FileName 参数   这是唯一以 F 开头的参数,用户可以   输入文件名 Filenam 文件 Fi F ,仍然可以识别条目   作为 FileName 参数。

答案 1 :(得分:-2)

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

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