主題
    about_Functions_Advanced_Parameters

簡短描述
    說明如何將靜態和動態參數新增至宣告 CmdletBinding 屬性的函數。

完整描述
    當您撰寫函數時可以自行宣告參數,也可以撰寫函數,使其可以存取編譯的 Cmdlet 
    所能使用的一般參數。如需 Windows PowerShell 一般參數的詳細資訊,
    請參閱 about_CommonParameters。

靜態參數
    下列範例示範如何宣告定義 ComputerName 參數的參數。此參數具有下列特性:

        - 是必要項。
        - 使用來自管線的輸入。
        - 使用字串陣列做為輸入。

        Param
          (
            [parameter(Mandatory=$true,
            ValueFromPipeline=$true)]
            [String[]]
            $ComputerName
          ) 
  

    Parameter 屬性是您在宣告參數時唯一必須使用的屬性。不過,您也可以宣告 Alias
    屬性和數個驗證引數。可新增到參數宣告的屬性數目沒有限制。


  Parameter 屬性

      Parameter 屬性可用來宣告函數的參數。
      這個屬性具有下列的具名引數,可用來定義參數的特性,例如該參數是必要項或選
      擇項。


    Mandatory 具名引數

        Mandatory 引數指出參數在函數在執行時為必要項。如果未指定這個引數,參數
        就是選擇性的參數。下列範例示範如何宣告函數執行時必要的參數。

        Param
          (
            [parameter(Mandatory=$true)]
            [String[]]
            $ComputerName
          ) 


    Position 具名引數

        Position 引數會指定參數的位置。如果未指定此引數,則必須在設定參數時明
        確地指定參數名稱或其別名。此外,如果函數的參數中沒有一個具有位置,則
        Windows PowerShell 執行階段會根據接收。

        下列範例示範如何宣告參數,在 cmdlet 執行時,此參數的值必須指定為第一個
        引數。請注意,不論是否指定了參數的名稱,這個函數都可以執行。

        Param
          (
            [parameter(Position=0)]
            [String[]]
            $ComputerName
          ) 


    ParameterSetName 具名引數

        ParameterSetName 引數會指定參數所屬的參數集。如果沒有指定任何參數集,
        則此參數會屬於函數所定義的所有參數集。這項行為代表每個參數集都必須具
        有一個唯一的參數,且該參數並非任何其他參數集的成員。下列範例示範如何
        宣告兩個分屬不同參數集的參數。

        Param
          (
            [parameter(Mandatory=$true,
                      ParameterSetName=”電腦”)] [String[]]
            $ComputerName
          ) 

        Param
          (
            [parameter(Mandatory=$true,
                      ParameterSetName=”使用者”)] [String[]]
            $UserName
          ) 

        如需參數集的詳細資訊,請參閱 MSDN 文件庫中的<Cmdlet 參數集>
        (https://go.microsoft.com/fwlink/?LinkId=142183)(英文)。


    ValueFromPipeline 具名引數

        ValueFromPipeline 引數會指定參數接受來自管線物件的輸入。如果 Cmdlet 存
        取完整的物件,而不只是物件的屬性,請指定這個引數。下列範例示範如何宣告
        ComputerName 強制參數,此參數會接受從管線傳遞到函數的輸入物件。

        Param
          (
            [parameter(Mandatory=$true,
                      ValueFromPipeline=$true)] [String[]]
            $ComputerName
          ) 


    ValueFromPipelineByPropertyName 具名引數

        valueFromPipelineByPropertyName 引數會指定參數接受來自管線物件屬性的輸
        入。如果下列條件為 true,請指定這個屬性:

            - 參數會存取管線物件的屬性。

            - 該屬性的名稱與參數相同,或者別名與參數相同。

        例如,如果函數具有 ComputerName 參數,而管線物件具有 ComputerName 屬
        性,則 ComputerName 屬性的值會指派給函數的 ComputerName 參數。

        下列範例示範如何宣告 ComputerName 參數,此參數會接受傳遞到 Cmdlet 之
        輸入物件 ComputerName 屬性的輸入。

        Param
          (
            [parameter(Mandatory=$true,
                      ValueFromPipelineByPropertyName=$true)] [String[]]
            $ComputerName
          ) 


    ValueFromRemainingArguments 具名引數

        ValueFromRemainingArguments 引數會指定參數接受所有未繫結到函數參數的剩
        餘引數。下列範例示範如何宣告 ComputerName 參數,此參數會接受傳遞到函數
        之輸入物件的所有剩餘引數。

        Param
          (
            [parameter(Mandatory=$true,
                      ValueFromRemainingArguments=$true)] [String[]]
            $ComputerName
          ) 


    HelpMessage 具名引數

        HelpMessage 引數會指定包含參數簡短描述的訊息。下列範例示範如何宣告提供
        參數描述的參數。

        Param
          (
            [parameter(Mandatory=$true,
                      HelpMessage=”電腦名稱的陣列。”)] [String[]]
            $ComputerName
          ) 


  Alias 屬性

      Alias 屬性會為參數指定另一個名稱。可指派給參數的別名數目沒有限制。下列範
      例示範如何宣告強制參數,以將 "CN" 別名新增至 ComputerName 參數。

        Param
          (
            [parameter(Mandatory=$true)]
            [alias(“CN”)]
            [String[]]
            $ComputerName
          ) 


  參數驗證屬性

      這些屬性定義 Windows PowerShell 執行階段如何驗證進階函數的引數。


    AllowNull 驗證屬性

        AllowNull 屬性允許 Cmdlet 強制參數的引數可設定為 Null。在下列範例中,
        即使這個參數是強制參數,ComputerName 參數也可以包含 Null 的值。

        Param
          (
            [parameter(Mandatory=$true)]
            [String]
            [AllowNull()]
            $ComputerName
          ) 


    AllowEmptyString 驗證屬性

        AllowEmptyString 屬性允許 Cmdlet 強制參數的引數可以是空字串。在下列範
        例中,即使這個參數是強制參數,ComputerName 參數也可以包含空字串 ("")。

        Param
          (
            [parameter(Mandatory=$true)]
            [String]
            [AllowEmptyString()]
            $ComputerName
          ) 


    AllowEmptyCollection 驗證屬性

        AllowEmptyCollection 屬性允許強制參數的引數可以是空集合。

        Param
          (
            [parameter(Mandatory=$true)]
            [String[]]
            [AllowEmptyCollection()]
            $ComputerName
          ) 


    ValidateCount 驗證屬性

        ValidateCount 屬性會指定參數可接受的引數數目上下限。如果引數的數目超出
        該範圍,Windows PowerShell 執行階段就會產生錯誤。下列範例中,
        ComputerName 參數可以具有一到五個引數。

        Param
          (
            [parameter(Mandatory=$true)]
            [String[]]
            [ValidateCount(1,5)]
            $ComputerName
          ) 


    ValidateLength 驗證屬性

        ValidateLength 屬性會指定參數引數的長度上下限。如果參數引數的長度超出
        該範圍,Windows PowerShell 執行階段就會產生錯誤。
        下列範例中,指定的電腦名稱必須具有一到十個字元。

        Param
          (
            [parameter(Mandatory=$true)]
            [String[]]
            [ValidateLength(1,10)]
            $ComputerName
          ) 


    ValidatePattern 驗證屬性

        ValidatePattern 屬性會指定規則運算式以驗證參數引數的模式。如果參數引數
        不符合此模式,Windows PowerShell 執行階段就會產生錯誤。在下列範例中,
        參數的引數必須為四位數的數目,而每個數字都必須為 0 到 9 的數目。

        Param
          (
            [parameter(Mandatory=$true)]
            [String[]]
            [ValidatePattern("[0-9][0-9][0-9][0-9]")] $ComputerName
          ) 


    ValidateRange 驗證屬性

        ValidateRange 屬性會指定參數引數的最大值及最小值。如果參數引數超出該範
        圍,Windows PowerShell 執行階段就會產生錯誤。在下列範例中,參數的引數
        不能小於 0 或大於 10。


        Param
          (
            [parameter(Mandatory=$true)]
            [Int[]]
            [ValidateRange(0,10)]
            $Count
          ) 


    ValidateScript 驗證屬性

        ValidateScript 屬性會指定用來驗證參數引數的指令碼。如果指令碼結果為
        false 或擲回例外狀況,Windows PowerShell 執行階段就會產生錯誤。在下
        列範例中,Count 參數的值必須小於 4。

        Param
          (
            [parameter()]
            [Int]
            [ValidateScript({$_ -lt 4})]
            $Count
          ) 


    ValidateSet 屬性

        ValidateSet 屬性會針對參數引數指定一組有效值。如果參數引數不符合此組中
        的值,Windows PowerShell 執行階段就會產生錯誤。
        在下列範例中,參數的引數只能包含 Steve、Mary 和 Carl 等名稱。

        Param
          (
            [parameter(Mandatory=$true)]
            [String[]]
            [ValidateRange(“Steve”, “Mary”, “Carl”)] $UserName
          ) 


    ValidateNotNull 驗證屬性


        ValidateNotNull 屬性指定參數的引數不能設定為 Null。如果參數值為 Null,
        Windows PowerShell 執行階段就會產生錯誤。

        Param
          (
            [parameter(Mandatory=$true)]
            [String[]]
            [ValidateNotNull()]
            $UserName
          ) 


    ValidateNotNullOrEmpty 驗證屬性

        ValidateNotNullOrEmpty 屬性指定參數的引數不能設定為 Null 或不能是空的。
        如果指定了參數,但其值是 Null、空字串或空陣列,Windows PowerShell 
       執行階段就會產生錯誤。

        Param
          (
            [parameter(Mandatory=$true)]
            [String[]]
            [ValidateNotNullOrEmpty()]
            $UserName
          ) 


動態參數
    動態參數為 cmdlet、函數或指令碼的參數,只有在特定情況下才能使用。

    例如,一些提供者 Cmdlet 的參數只有提供者路徑中的 Cmdlet 方可使用。
    Set-Item Cmdlet 的 Encoding 參數是大家熟悉的動態參數之一,只有 FileSystem
    提供者路徑中的 Set-Item Cmdlet 方可使用。

    若要為函數或指令碼建立動態函數,請使用 DynamicParam 關鍵字。

    語法如下所示。

      DynamicParam {<陳述式-清單>}

    在陳述式清單中,使用 If 陳述式指定在何種情況下可在函數中使用參數。

    使用 New-Object Cmdlet 建立 
    System.Management.Automation.RuntimeDefinedParameter 物件以代表參
    數並指定其名稱。

    您也可以使用 New-Object 命令建立 
    System.Management.Automation.ParameterAttribute 物件以代表參數的屬
    性,例如 Mandatory、Position 或 ValueFromPipeline,或是其參數集。

    下列範例說明 Sample 函數,其中包含名為 Name 和 Path 的標準參數,以及名
    為 DP1 動態參數 (選用)。DP1 參數位於 PSet1 參數集中,型別為 Int32。只有
    當 Path 參數值包含 "HKLM:" (表示其目前用於 HKEY_LOCAL_MACHINE 登錄磁碟
    機) 時才能在 Sample 函數中使用 DP1 參數。


    function Sample {
      Param ([String]$Name, [String]$Path)

      DynamicParam
      {
	if ($path -match "*HKLM*:")
        {
          $dynParam1 = new-object
            System.Management.Automation.RuntimeDefinedParameter("dp1",
            [Int32], $attributeCollection)       
          $attributes = new-object System.Management.Automation.ParameterAttribute
          $attributes.ParameterSetName = 'pset1' 
          $attributes.Mandatory = $false 
          $attributeCollection = new-object
            –Type System.Collections.ObjectModel.Collection``1[System.Attribute]
          $attributeCollection.Add($attributes)

          $paramDictionary = new-object	
            System.Management.Automation.RuntimeDefinedParameterDictionary
          $paramDictionary.Add("dp1", $dynParam1)

		return $paramDictionary
        } End if
      }
    }

    如需詳細資訊,請參閱 MSDN (Microsoft Developer Network) 文件庫中的
    <RuntimeDefinedParameter 類別>(英文),
    網址為:https://go.microsoft.com/fwlink/?LinkID=145130。

請參閱
    about_Advanced_Functions
    about_Functions_CmdletBindingAttribute
    about_Functions_Advanced_Methods  




目錄