在 PowerShell 中函数没有重载。最后一个定义覆盖同一范围内的前一个或隐藏父范围内的前一个。因此,您应该创建一个函数并提供一种通过参数来区分其调用模式的方法。
在 V2 中,您可以使用高级功能,请参阅 help about_Functions_Advanced_Parameters 并避免在解决参数集歧义时进行一些手动编码:
# advanced function with 3 parameter sets
function Backup-UsersData
(
[Parameter(Position=0, ParameterSetName="user")]
[string]$user,
[Parameter(Position=0, ParameterSetName="array")]
[object[]]$array,
[Parameter(Position=0, ParameterSetName="all")]
[switch]$all
)
{
# use this to get the parameter set name
$PSCmdlet.ParameterSetName
}
# test
Backup-UsersData -user 'John'
Backup-UsersData 1, 2
Backup-UsersData -all
# OUTPUT:
# user
# array
# all
请注意,这种机制有时很奇怪。例如,在第一个测试中,我们必须明确指定参数名称-user。否则:
Backup-UsersData : Parameter set cannot be resolved using the specified named parameters.
At C:\TEMP\_101015_110059\try2.ps1:21 char:17
+ Backup-UsersData <<<< 'John'
+ CategoryInfo : InvalidArgument: (:) [Backup-UsersData], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : AmbiguousParameterSet,Backup-UsersData
在许多情况下,标准而非高级的混合参数函数可以:
function Backup-UsersData
(
[string]$user,
[object[]]$array,
[switch]$all
)
{
if ($user) {'user'}
elseif ($array) {'array'}
elseif ($all) {'all'}
else {'may be'}
}
Backup-UsersData -user 'John'
Backup-UsersData -array 1, 2
Backup-UsersData -all
Backup-UsersData
但在这种情况下,您应该解决(或接受并忽略)歧义,例如决定做什么,如果说:
Backup-UsersData -user 'John' -array 1, 2 -all