当另一个参数出现时,在PowerShell中需要参数

时间:2015-05-06 21:03:12

标签: powershell

到目前为止我读过的所有内容都告诉我这应该有效。这是一个用于自动转出AD帐户的脚本。我希望它能如何工作,如果设置了-TransferHomeDrive开关,那么它将需要旧服务器和新服务器的名称。

我相信我应该可以使用参数集来执行此操作,但是如果我只有单个参数集,加上默认参数,它将始终提示我输入旧的和新的服务器。这是我的param声明:

Param( 
    [Parameter(Mandatory=$True, ValueFromPipeline=$True, ValueFromPipelineByPropertyName=$True)]
    [string]$Username,

    [switch]$RetainGroups,

    [Parameter(ParameterSetName='TransferHomeDrive', Mandatory=$False)]
    [switch]$TransferHomeDrive,

    [Parameter(ParameterSetName='TransferHomeDrive', Mandatory=$True)]
    [string]$OldServer,

    [Parameter(ParameterSetName='TransferHomeDrive', Mandatory=$True)]
    [string]$NewServer
)

所以,如果它正常工作,你可以运行

Move-AccountOut -Username JohnSmith -RetainGroups

它不会安排家庭驱动器转移。但是,如果你要运行

Move-AccountOut -Username JohnSmith -RetainGroups -TransferHomeDrive 

它会提示OldServerNewServer

我发现了类似的问题,包括这些问题,但它仍无效:

PowerShell mandatory parameter depend on other parameter

Having a optional parameter that requires another parameter to be present

我相信如果我创建了第二个参数集,包括所有参数,包括UsernameRetainGroups,它会起作用,但似乎根据其他帖子,我应该能够让它按照我写的方式工作,其中UsernameRetainGroups是"全球"参数以及OldServerNewServer仅在设置TransferHomeDrive时才需要

1 个答案:

答案 0 :(得分:1)

在您的代码中,您只有一个参数集TransferHomeDrive,您没有设置其他默认参数。您应该让PowerShell知道,存在另一个命名参数集,方法是在CmdletBindingParameter属性中明确声明它。

[CmdletBinding(DefaultParameterSetName='NoTransferHomeDrive')]
Param( 
    [Parameter(Mandatory=$True, ValueFromPipeline=$True, ValueFromPipelineByPropertyName=$True)]
    [string]$Username,

    [switch]$RetainGroups,

    [Parameter(ParameterSetName='TransferHomeDrive', Mandatory=$False)]
    [switch]$TransferHomeDrive,

    [Parameter(ParameterSetName='TransferHomeDrive', Mandatory=$True)]
    [string]$OldServer,

    [Parameter(ParameterSetName='TransferHomeDrive', Mandatory=$True)]
    [string]$NewServer
)