2015-05-12 9 views
8

मैं एक फ़ंक्शन का निर्माण कर रहा हूं जिसमें 3 अलग पैरामीटर सेट होंगे, उनमें से 2 सेट तीसरे के साथ ओवरलैप होंगे। विकल्प इस प्रकार दिखाई देगा:पावरहेल: एकाधिक पैरामीटर सेट

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

समारोह के प्रयोजन के हस्तांतरण की प्रक्रिया को स्वचालित करने के लिए है:

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

यह थोड़ा और अधिक स्पष्ट, यहाँ एक आंशिक रूप से पूरा संस्करण समारोह है बनाने के लिए एक एडी खाता कंपनी के भीतर किसी अन्य स्थान पर। RetainGroups स्वचालित रूप से सेट होने पर उपयोगकर्ता समूह को बनाए रखेगा, RemoveFromAllGroups स्वचालित रूप से उपयोगकर्ता को अपने समूहों से हटा देगा। दो स्विच एक साथ इस्तेमाल नहीं किया जाना चाहिए। इसके अतिरिक्त, यदि TransferHomeDrive सेट है, तो यह एक आंतरिक उपकरण का उपयोग करके स्थानांतरण शेड्यूल करने के लिए एक फ़ंक्शन को कॉल करेगा।

इसे एक और तरीका रखने के लिए, RetainGroups और RemoveFromAllGroups सभी पैरामीटर सेटों का सदस्य होना चाहिए (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 
    ) 
} 

इस तकनीक का उपयोग करना, को बनाए रखने और हटाने एक साथ नहीं किया जा सकता है, लेकिन OldServer और NewServer अब अनिवार्य हैं। अगर मैं उन्हें इनमें बदलें:

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

फिर OldServer और NewServer अनिवार्य होगा, लेकिन RetainGroups और RemoveFromAllGroups एक साथ इस्तेमाल किया जा सकता है। इसके अतिरिक्त, यदि मैं एक साथ बनाए रखने और निकालने का उपयोग करता हूं, तो OldServer और NewServer अनिवार्य हो जाता है, लेकिन जब उनका उपयोग स्वयं नहीं किया जाता है।

इस काम को कैसे करें इस पर कोई सुझाव?

+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 पैरामीटर सेट करता है। पावरहेल के पैरामीटर सेट जादू के रूप में शक्तिशाली है, यह कहने का कोई अच्छा तरीका नहीं है कि "ये 2 स्विच पारस्परिक रूप से अनन्य हैं लेकिन सभी पैरामीटर सेट में भी उपलब्ध होना चाहिए" ताकि आपको इसे मल्टीप्लेक्स करना होगा और प्रत्येक पैरामीटर सेट को एक या दोहराएं अन्य।

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

यह

सरल आप इसे कम चुनौतीपूर्ण बनाना चाहते हैं, तो आप निकालें को मजबूत बनाने पर विचार करें और में स्विच को बनाए रखने हो सकता है एक पैरामीटर, इस तरह कुछ:

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

मैं यह इंगित करना चाहते हैं कि हालांकि को परिभाषित करना आसान है, इसका मतलब यह नहीं है कि यह शर्त है एर। यह हो सकता है कि आप कॉलर के लिए अपने पैरामीटर सेट को अनुकूलित करना चाहते हैं, जो विशेष रूप से महत्वपूर्ण हो सकता है यदि यह एक ऐसा कार्य है जिसे आप शैल से इंटरैक्टिव रूप से उपयोग करने की योजना बनाते हैं, अन्य स्क्रिप्ट से कॉल करने के बजाए (और ऐसा लगता है कि ऐसा हो सकता है मामला हो)।

तो परिभाषा में कुछ जटिलता जोड़ने के लिए इसे आसान बनाने के लिए सही काम करना मुश्किल हो सकता है।

+0

ठीक है अब मैं मूर्खतापूर्ण नहीं दिखता, आपने मेरे जैसा लगभग 45 मिनट पहले (और अधिक) मेरे जैसा ही जवाब लिखा था। इच्छा है कि मैंने अपना उत्तर सबमिट करने से पहले इसे देखा होगा। – TheMadTechnician

+0

एह, यह हम सभी को किसी बिंदु पर @TheMadTechnician होता है।:) – briantist

+2

यह वेब पर देखा गया PowerShell पैरामीटर सेट का सबसे अच्छा स्पष्टीकरण है। यह उत्तर मानक एमएसडीएन पृष्ठों की तुलना में काफी बेहतर है। –

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

तो हम, RemoveFromAllGroupsWTran और RetainGroupsWTran पैरामीटर सेट जोड़ देगा उन दोनों $TransferHomeDrive, $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 
    ) 
} 
संबंधित मुद्दे