我有一个带2个开关的功能,如果另一个有,只需要一个。目前,如果第二个开关本身运行,没有任何反应,这很好,但我认为我可以做得更好。我想设置它,以便第二个参数只有在第一个参数也存在时才能出现。我试过制作第一个必需的,技术上有用,但没有给出我期待的结果(模糊的参数设置错误)。
这是我的参数声明:
[CmdletBinding(DefaultParameterSetName='NoTransferMDrive')]
Param(
[Parameter(Mandatory=$True, ValueFromPipeline=$True, ValueFromPipelineByPropertyName=$True)]
[string]$Username,
[switch]$RemoveFromAllGroups,
[switch]$NoConfirmationPrompt,
[Parameter(ParameterSetName='TransferMDrive')]
[switch]$TransferMDrive,
[Parameter(ParameterSetName='TransferMDrive', Mandatory=$True)]
[string]$OldServer,
[Parameter(ParameterSetName='TransferMDrive', Mandatory=$True)]
[string]$NewServer
)
我修改了param语句,如下所示:
[CmdletBinding(DefaultParameterSetName='NoTransferMDrive')]
Param(
[Parameter(Mandatory=$True, ValueFromPipeline=$True, ValueFromPipelineByPropertyName=$True)]
[string]$Username,
[Parameter(ParameterSetName='RemoveFromGroups',Mandatory=$True)]
[switch]$RemoveFromAllGroups,
[Parameter(ParameterSetName='RemoveFromGroups')]
[switch]$NoConfirmationPrompt,
[Parameter(ParameterSetName='RemoveFromGroups')]
[Parameter(ParameterSetName='TransferMDrive')]
[switch]$TransferMDrive,
[Parameter(ParameterSetName='RemoveFromGroups')]
[Parameter(ParameterSetName='TransferMDrive', Mandatory=$True)]
[string]$OldServer,
[Parameter(ParameterSetName='RemoveFromGroups')]
[Parameter(ParameterSetName='TransferMDrive', Mandatory=$True)]
[string]$NewServer
)
它会提示我输入-RemoveFromAllGroups
的值,但如果我将其留空,我会得到以下内容:
Do-Something : Cannot process argument transformation on parameter 'RemoveFromAllGroups'. Cannot convert value "System.String" to type "System.Management.Automation.SwitchParameter".
Boolean parameters accept only Boolean values and numbers, such as $True, $False, 1 or 0.
At line:27 char:1
+ Do-Something -NoConfirmationPrompt
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidData: (:) [Do-Something], ParameterBindingArgumentTransformationException
+ FullyQualifiedErrorId : ParameterArgumentTransformationError,Do-Something
如果可能,我希望它立即失败,如果-RemoveFromAllGroups
自己通过,则不会提示-NoPromptForConfirmation
的值。我可以改变什么来使这项工作?
答案 0 :(得分:4)
通常情况下,我会告诉您,您正在通过避免让它提示强制参数来反对PowerShell。但PowerShell不能很好地处理强制切换参数的提示。这是获得您要求的方式:
function test {
[CmdletBinding(DefaultParameterSetName='NoTransferMDrive')]
Param(
[Parameter(Mandatory=$True, ValueFromPipeline=$True, ValueFromPipelineByPropertyName=$True)]
[string]$Username,
[Parameter(ParameterSetName='RemoveFromGroups')]
[switch]$RemoveFromAllGroups,
[Parameter(ParameterSetName='RemoveFromGroups')]
[switch]$NoConfirmationPrompt,
[Parameter(ParameterSetName='RemoveFromGroups')]
[Parameter(ParameterSetName='TransferMDrive')]
[switch]$TransferMDrive,
[Parameter(ParameterSetName='RemoveFromGroups')]
[Parameter(ParameterSetName='TransferMDrive', Mandatory=$True)]
[string]$OldServer,
[Parameter(ParameterSetName='RemoveFromGroups')]
[Parameter(ParameterSetName='TransferMDrive', Mandatory=$True)]
[string]$NewServer
)
begin {
if ($NoConfirmationPrompt -and !$RemoveFromAllGroups) {
throw "If -NoConfirmationPrompt is specified, you must also specify -RemoveAllGroups"
}
"Username is $username, RemoveFromAllGroups is $RemoveFromAllGroups"
}
}
test -Username johndoe -OldServer foo -NewServer bar -NoConfirmationPrompt
但是如果没有传递-NoConfirmationPrompt
,那么期望的行为是什么? -RemoveFromAllGroups
仍然需要吗?也许不是。如果您没有传入此开关,那么它将使用TransferMDrive参数集。如果PowerShell看到-RemoveFromAllGroups
,那么它知道它正在使用RemoveFromGroups参数集。