如果我定义以下
[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
参数的别名
是否可以在不重命名参数的情况下定义此别名?
答案 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 server
,test-db -db server
和test-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