2015-05-12 26 views
8

3 ayrı parametre kümesine sahip olacak bir işlev yapıyorum, bu kümelerden 2'si üçüncü ile çakışacak. seçenekler şu şekilde görünecektir:Powershell: Birden çok parametre kümesi

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 
    ) 
} 

fonksiyonun amacı aktarılması işlemini otomatik şudur:

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

biraz daha net, burada fonksiyon kısmen tamamlanmış versiyonu yapmak için şirket içinde başka bir yere bir AD hesabı. RetainGroups, ayarlandığında kullanıcı gruplarını otomatik olarak saklar, RemoveFromAllGroups, kullanıcıyı gruplarından otomatik olarak kaldırır. İki anahtar birlikte kullanılmamalıdır. Ayrıca, TransferHomeDrive ayarlanmışsa, dahili bir araç kullanarak aktarımı zamanlamak için bir işlev çağırır.

RetainGroups ve RemoveFromAllGroups ( Username benzer) tüm parametre setlerinin bir üyesi olması gerektiğini Diğer bir deyişle, ancak birlikte kullanılmak üzere mümkün olmamalıdır.

İki yolu denedim. İlk:

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 
    ) 
} 

Bu tekniği kullanarak, muhafaza ve birlikte kullanılamaz kaldırmak, ancak OldServer ve NewServer artık zorunludur. Ben bunları değiştirirseniz:

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

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

Onlar zorunlu olacak, ama artık TransferHomeDrive ayarlanmış olup olmadığını umursamıyor.

Ters yönde kurmak ise:

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 
    ) 
} 

Sonra OldServer ve NewServer zorunlu olacak, ancak RetainGroups ve RemoveFromAllGroups birlikte kullanılabilir. Ayrıca, birlikte tutup kaldırmayı kullanırsam OldServer ve NewServer zorunludur, ancak kendi başlarına kullanılmadıklarında olmaz.

Bu işin nasıl yapıldığına dair herhangi bir öneriniz var mı?

+0

Şu anda tüm bu ayrıştırma, ama gerçekten parametre kümeleri kullanarak yardımcı olur PowerShell Parametreniz setleri nasıl yorumladığı konusunda size göstermek için fonksiyonları üzerine 'Get-Help' kullanmaktır am . Bunu yaptığınız yapılandırmaların her biri için yapabilir ve çıktıyı cevabınıza göre düzenleyebilirseniz, bu gerçekten yardımcı olacaktır. – briantist

+0

Harika bir soru, teşekkürler! –

cevap

12

Tamam, sanırım bunu anlıyorum. İstediğiniz olası kombinasyonlar şunlardır:

  1. -RetainGroups
  2. -RemoveFromAllGroups
  3. -RetainGroups artı -TransferHomeDrive
  4. -RemoveFromAllGroups artı -TransferHomeDrive
  5. Sadece -UserName
  6. -UserName artı -TransferHomeDrive

-OldServer ve -NewServer'un yalnızca ev sürücüsünü taşırken geçerli olduğunu varsayıyorum, bu nedenle ev sürücüsünü hareket ettirdiğinizde bunlar zorunludur. Bu durumda değilse, bana bildirin.

Burada neyiniz var 6 parametre setleri. Powershell'in parametre seti büyüsü kadar güçlü olduğu için, "bu 2 anahtar birbirini dışlayan, ancak tüm parametre setlerinde de mevcut olmalıdır" demek için iyi bir yol yoktur, bu yüzden her bir parametre setini bir veya daha fazla ile tekrarlayın. diğer.

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 çıktısı: Eğer daha az korkutucu olmak için

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>] 

sen kaldır birleştirmeyi düşünün ve içine anahtarları muhafaza edebilecek, It

Basitleştirme Tek bir parametre, böyle bir şey:

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

Bu 2'ye aşağı parametreyi kümelerini azaltmak ve bunun gibi tüm tanım göz yapacak: Aşağıdaki Get-Help çıkışı ile

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 
) 

} 

:

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>] 

ben tanımını tanımlamasının daha kolay olmasına rağmen, bunun bett anlamına gelmediğini belirtmek isterim er. Bu, arayanın arayanın parametre kümelerini optimize etmek isteyebilirsiniz; bu, eğer bu, kabuktan çok etkileşimli olarak kullanmayı planladığınız bir işlevse, özellikle önemli olabilir. durum böyle).

Bu nedenle, tanımlamayı kolaylaştırmak için bazı karmaşıklık eklemek, yapılacak en doğru şey olabilir.

+0

Şimdi aptalca görünmüyor, benden neredeyse 45 dakika önce benimle aynı cevabı yazdınız (artı daha fazlası). Cevabımı sunmadan önce bunu görseydim. – TheMadTechnician

+0

Eh, hepimiz bir noktada, TheTheMadTechnician.:) – briantist

+2

Bu, web'de gördüğüm PowerShell parametre kümelerinin en iyi açıklaması. Bu cevap standart MSDN sayfalarından çok daha iyi. –

7

İki tane daha Parametre Seti ekleyerek istediğinizi yapabilirsiniz. Bu, şu anda 3 setiniz olduğu için ayarlanmamış bir parametreye sahip olduğunuz için gereklidir (doğru hatırlamıyorsam teknik olarak __AllParameterSets setine koyar). Yani bunu yapmanın 4 yolu. Sorunuzu doğru okuduğumda 6 yolu kullanmanız gerekiyor. Daha sonra,

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>] 

yüzden $TransferHomeDrive, $OldServer ve $NewServer onları hem ekleyin (onlardan diğer ilgili kümesi adlarını kaldırma), RemoveFromAllGroupsWTran ve RetainGroupsWTran Parametre Setleri katacak: Aşağıdaki seçeneklerden hepsini istiyorum her birini ilgili anahtar parametresine ekleyin. Bu gibi bakıyor biter:

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 
    ) 
} 
İlgili konular