2015-05-12 32 views
8

我正在構建一個函數,它將有3個不同的參數集,其中2個將與第三個參數集重疊。該方案是這樣的:Powershell:多個參數集

A B 
A C 
A (D E F) 
A B (D E F) 
A C (D E F) 

爲了讓更多一點清楚,這裏是一個部分完成版本的功能:

function Move-AccountOut { 

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

     [Parameter(ParameterSetName='RetainGroups')] 
     [switch]$RetainGroups, 

     [Parameter(ParameterSetName='RemoveFromAllGroups')] 
     [switch]$RemoveFromAllGroups, 

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

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

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

該功能的目的是自動轉移的過程將AD賬戶轉出到公司內的其他地點。 RetainGroups會在設置時自動保留用戶組,RemoveFromAllGroups會自動將用戶從他們的組中刪除。兩臺交換機不能一起使用。另外,如果TransferHomeDrive已設置,它將調用一個函數來使用內部工具安排傳輸。

換句話說,RetainGroupsRemoveFromAllGroups應該是所有參數集(類似於Username)的成員,但不能一起使用。

我試過兩種方法。第一:

function Move-AccountOut { 

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

     [Parameter(ParameterSetName='RetainGroups')] 
     [switch]$RetainGroups, 

     [Parameter(ParameterSetName='RemoveFromAllGroups')] 
     [switch]$RemoveFromAllGroups, 

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

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

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

使用這種技術,保留和刪除不能一起使用,但OldServerNewServer不再是強制性的。如果我將其更改爲:

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

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

他們將是強制性的,但它不再關心TransferHomeDrive是否設置。

如果我把它相反的方式:

function Move-AccountOut { 

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

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

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

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

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

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

然後OldServerNewServer將是強制性的,但RetainGroupsRemoveFromAllGroups可以一起使用。此外,如果我使用保留並一起刪除,則OldServerNewServer將成爲強制性的,但不會在它們單獨使用時使用。

關於如何使這項工作的任何建議?

+0

我目前解析了這一切,但真正幫助使用參數集是用'GET-Help'你的功能向您展示PowerShell是如何解釋您的參數集。如果你可以爲你嘗試的每一種配置都做到這一點,然後編輯輸出到你的答案中,這將是非常有用的。 – briantist

+0

偉大的問題,謝謝! –

回答

12

好吧,我想我明白這一點。你想可能的組合有:

  1. -RetainGroups
  2. -RemoveFromAllGroups
  3. -RetainGroups-TransferHomeDrive
  4. -RemoveFromAllGroups-TransferHomeDrive
  5. 只有-UserName
  6. -UserName-TransferHomeDrive

我假設-OldServer-NewServer只適用於移動家庭驅動器,所以無論何時移動家庭驅動器,他們是強制性的。如果情況並非如此,請告訴我。

所以你在這裏有什麼6參數集。像PowerShell的參數集魔術一樣強大,沒有一種好的方式來說「這兩個開關是互斥的,但也應該可用於所有參數集」,因此您必須對其進行多路複用並重復每個參數集其他。

function Move-AccountOut { 
[CmdletBinding(DefaultParameterSetName='OnlyUser')] 
Param( 
    [Parameter(
     Mandatory=$True, 
     ValueFromPipeline=$True, 
     ValueFromPipelineByPropertyName=$True 
    )] 
    [string] 
    $Username, 

    [Parameter(
     Mandatory=$True, 
     ParameterSetName='RetainOnly' 
    )] 
    [Parameter(
     Mandatory=$True, 
     ParameterSetName='RetainAndTransfer' 
    )] 
    [switch] 
    $RetainGroups, 

    [Parameter(
     Mandatory=$True, 
     ParameterSetName='RemoveOnly' 
    )] 
    [Parameter(
     Mandatory=$True, 
     ParameterSetName='RemoveAndTransfer' 
    )] 
    [switch] 
    $RemoveFromAllGroups, 

    [Parameter(
     Mandatory=$True, 
     ParameterSetName='RetainAndTransfer' 
    )] 
    [Parameter(
     Mandatory=$True, 
     ParameterSetName='RemoveAndTransfer' 
    )] 
    [Parameter(
     Mandatory=$True, 
     ParameterSetName='TransferOnly' 
    )] 
    [switch] 
    $TransferHomeDrive, 

    [Parameter(
     Mandatory=$True, 
     ParameterSetName='RetainAndTransfer' 
    )] 
    [Parameter(
     Mandatory=$True, 
     ParameterSetName='RemoveAndTransfer' 
    )] 
    [Parameter(
     Mandatory=$True, 
     ParameterSetName='TransferOnly' 
    )] 
    [string] 
    $OldServer, 

    [Parameter(
     Mandatory=$True, 
     ParameterSetName='RetainAndTransfer' 
    )] 
    [Parameter(
     Mandatory=$True, 
     ParameterSetName='RemoveAndTransfer' 
    )] 
    [Parameter(
     Mandatory=$True, 
     ParameterSetName='TransferOnly' 
    )] 
    [string] 
    $NewServer 
) 

} 

Get-Help Move-AccountOut輸出:

Move-AccountOut -Username <string> [<CommonParameters>] 

Move-AccountOut -Username <string> -RetainGroups -TransferHomeDrive -OldServer <string> -NewServer <string> [<CommonParameters>] 

Move-AccountOut -Username <string> -RetainGroups [<CommonParameters>] 

Move-AccountOut -Username <string> -RemoveFromAllGroups -TransferHomeDrive -OldServer <string> -NewServer <string> [<CommonParameters>] 

Move-AccountOut -Username <string> -RemoveFromAllGroups [<CommonParameters>] 

Move-AccountOut -Username <string> -TransferHomeDrive -OldServer <string> -NewServer <string> [<CommonParameters>] 

簡化IT

如果你想讓它不那麼困難了,你可能會考慮鞏固取出並保留交換機成一個參數,如下所示:

[Parameter(
    Mandatory=$false # you can leave this out 
)] 
[ValidateSet(
    'None', 
    'Retain', 
    'RemoveAll' 
)] 
[String] 
$GroupAction = 'None' 

這將降低減少你的參數設置爲2,讓你的整個定義是這樣的:

function Move-AccountOut { 
[CmdletBinding(DefaultParameterSetName='OnlyUser')] 
Param( 
    [Parameter(
     Mandatory=$True, 
     ValueFromPipeline=$True, 
     ValueFromPipelineByPropertyName=$True 
    )] 
    [string] 
    $Username, 

    [ValidateSet(
     'None', 
     'Retain', 
     'RemoveAll' 
    )] 
    [String] 
    $GroupAction = 'None' , 

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

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

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

} 

用下面Get-Help輸出:

Move-AccountOut -Username <string> [-GroupAction <string> {None | Retain | RemoveAll}] [<CommonParameters>] 

Move-AccountOut -Username <string> -TransferHomeDrive -OldServer <string> -NewServer <string> [-GroupAction <string> {None | Retain | RemoveAll}] [<CommonParameters>] 

我確實要指出的是,儘管定義爲更簡單,但這並不意味着它是bett呃。您可能希望優化調用者的參數集,如果這是您計劃在shell中交互使用很多功能的函數,而不是從其他腳本調用(而且這看起來像這樣是這樣)。

因此,在定義中增加一些複雜性以使其更易於使用可能是正確的做法。

+0

現在我不會看起來很傻,你幾乎在我45分鐘前寫了與我相同的答案(加上更多)。希望我在提交答案之前看到了這一點。 – TheMadTechnician

+0

呃,它發生在我們所有人的某個時候,@TheMadTechnician。:) – briantist

+2

這是我在網上看到的PowerShell參數集的最佳解釋。這個答案比標準的MSDN頁面好得多。 –

7

通過添加兩個更多的參數集,你可以做你想做的。這是必要的,因爲你現在有3套,加上一個非設置參數(如果我沒有記錯的話,技術上將它放在__AllParameterSets集合中)。所以這是4種方式。如果我正確地閱讀你的問題,你需要6種方法。你希望所有的下列選項:

Move-AccountOut -Username <string> [<CommonParameters>] 
Move-AccountOut -Username <string> [-RetainGroups] [-TransferHomeDrive] [-OldServer <string>] [-NewServer <string>] [<CommonParameters>] 
Move-AccountOut -Username <string> [-RetainGroups] [<CommonParameters>] 
Move-AccountOut -Username <string> [-RemoveFromAllGroups] [-TransferHomeDrive] [-OldServer <string>] [-NewServer <string>] [<CommonParameters>] 
Move-AccountOut -Username <string> [-RemoveFromAllGroups] [<CommonParameters>] 
Move-AccountOut -Username <string> -OldServer <string> -NewServer <string> [-TransferHomeDrive] [<CommonParameters>] 

所以我們將添加RemoveFromAllGroupsWTranRetainGroupsWTran參數集,他們都添加到​​,$OldServer$NewServer(去除其中的其他相關集名稱),然後將每個添加到其各自的開關參數。它結束了看起來像這樣:

function Move-AccountOut { 

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

     [Parameter(ParameterSetName='RetainGroups')] 
     [Parameter(ParameterSetName='RetainGroupsWTran')] 
     [switch]$RetainGroups, 

     [Parameter(ParameterSetName='RemoveFromAllGroups')] 
     [Parameter(ParameterSetName='RemoveFromAllGroupsWTran')] 
     [switch]$RemoveFromAllGroups, 

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

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

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