항목
    about_Functions_Advanced_Parameters

간단한 설명
    CmdletBinding 특성을 선언하는 함수에 정적 및 동적 매개 변수를 추가하는 방법을 설명합니다.

자세한 설명
    함수를 작성할 때 매개 변수를 직접 선언할 수 있으며, 컴파일된 cmdlet에 사용할 수 있는 일반 매개 변수에 
    액세스할 수 있도록 함수를 작성할 수 있습니다. Windows PowerShell 일반 매개 변수에 대한 자세한 
    내용은 about_CommonParameters를 참조하십시오.



정적 매개 변수

    다음 예에서는 ComputerName 매개 변수를 정의하는 매개 변수 선언을 보여 줍니다. 이 매개 변수는 
    다음과 같은 특징이 있습니다.

        - 필수 매개 변수입니다.
        - 파이프라인으로부터 입력을 받습니다.
        - 문자열 배열을 입력으로 받습니다.

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

    매개 변수를 선언할 때 반드시 사용해야 하는 유일한 필수 특성은 Parameter 특성입니다. 그러나 Alias 
    특성과 여러 개의 유효성 검사 인수를 선언할 수도 있습니다. 매개 변수 선언에 추가할 수 있는 특성 수에는 
    제한이 없습니다.


  매개 변수 특성

      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="Computer")]
            [String[]]
            $ComputerName
          ) 

        Param
          (
            [parameter(Mandatory=$true,
                      ParameterSetName="User")]
            [String[]]
            $UserName
          ) 

        매개 변수 집합에 대한 자세한 내용은 MSDN 
        라이브러리(https://go.microsoft.com/fwlink/?LinkId=142183)의 "Cmdlet 
        Parameter Sets(Cmdlet 매개 변수 집합)"를 참조하십시오.


    ValueFromPipeline 명명된 인수

        ValueFromPipeline 인수는 매개 변수가 파이프라인 개체로부터 입력을 받도록 지정합니다. Cmdlet이 
        개체의 속성이 아니라 전체 개체에 액세스하는 경우 이 인수를 지정합니다. 다음 예에서는 
        파이프라인에서 함수에 전달된 입력 개체를 받는 필수 ComputerName 매개 변수의 매개 변수 선언을 보여 
        줍니다.

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


    ValueFromPipelineByPropertyName 명명된 인수

        valueFromPipelineByPropertyName 인수는 매개 변수가 파이프라인 개체의 속성으로부터 
        입력을 받도록 지정합니다. 다음 조건에 해당되는 경우 이 특성을 지정합니다.

            - 매개 변수가 파이프된 개체의 속성에 액세스할 경우

            - 속성이 매개 변수와 동일한 이름을 갖거나 매개 변수와 동일한 별칭을 가질 경우

        예를 들어 함수에 ComputerName 매개 변수가 있고 파이프된 개체에 ComputerName 속성이 있을 경우 
        ComputerName 속성 값이 함수의 ComputerName 매개 변수에 할당됩니다.

        다음 예에서는 cmdlet에 전달된 입력 개체의 ComputerName 속성으로부터 입력을 받는 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=”An array of computer names.”)]
            [String[]]
            $ComputerName
          ) 


  별칭 특성

      별칭 특성은 매개 변수에 대한 다른 이름을 지정합니다. 매개 변수에 할당할 수 있는 별칭 수에는 제한이 
      없습니다. 다음 예에서는 ComputerName 매개 변수에 "CN" 별칭을 추가하는 필수 매개 변수 선언을 
      보여 줍니다.

        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 매개 
        변수에 1 - 5개의 인수를 사용할 수 있습니다. 

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


    ValidateLength 유효성 검사 특성

        ValidateLength 특성은 매개 변수 인수의 최소 및 최대 길이를 지정합니다. 매개 변수 인수의 길이가 이 
        범위를 초과하면 Windows PowerShell 런타임에서 오류를 생성합니다.
        다음 예에서 지정된 컴퓨터 이름은 1 - 10자여야 합니다. 

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


    ValidatePattern 유효성 검사 특성

        ValidatePattern 특성은 매개 변수 인수의 패턴에 대한 유효성을 검사하는 정규식을 지정합니다. 매개 변수 
        인수가 이 패턴과 일치하지 않으면 Windows PowerShell 런타임에서 오류를 생성합니다. 다음 예에서는 
        매개 변수의 인수가 4자리 숫자여야 하고, 각 자리는 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이거나 스크립트가 예외를 throw하면 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을 사용하는 경우에만 사용할 수 있는 
    매개 변수가 있습니다. 친숙한 동적 매개 변수 중 하나는 FileSystem 공급자 경로에서 
    Set-Item cmdlet을 사용하는 경우에만 사용할 수 있는 cmdlet인 Set-Item의 Encoding 매개 변수입니다. 
      
    함수 또는 스크립트에 대한 동적 매개 변수를 만들려면 DynamicParam 키워드를 사용하십시오. 
      
    구문은 다음과 같습니다. 
      
      DynamicParam {<statement-list>}  
      
    문 목록에서는 If 문을 사용하여 함수에 사용할 수 있는 매개 변수의 조건을 지정합니다. 
      
    New-Object cmdlet을 사용하여 System.Management.Automation.RuntimeDefinedParameter 개체를 
    만들어 매개 변수를 나타내고 이름을 지정합니다.  
      
    New-Object 명령을 사용하여 System.Management.Automation.ParameterAttribute 개체를 만들어 
    Mandatory, Position, ValueFromPipeline 또는 해당 매개 변수 집합과 같은 매개 변수의 특성을 
    나타낼 수도 있습니다. 
      
    다음 예제에서는 Name와 Path라는 표준 매개 변수 및 DP1이라는 선택적 동적 매개 변수를 포함하는
    Sample 함수를 보여 줍니다. DP1 매개 변수는 PSet1 매개 변수 집합에 들어 있고 Int32 유형입니다.
    DP1 매개 변수는 Path 매개 변수 값이 HKEY_LOCAL_MACHINE 레지스트리 드라이브에서 사용되고 
    있음을 나타내는 "HKLM:"을 포함하는 경우에만 Sample 함수에서 사용할 수 있습니다. 
     
      
    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 Class
    (RuntimeDefinedParameter 클래스)"(https://go.microsoft.com/fwlink/?LinkID=145130)를 참조하십시오.



참고 항목
    about_Functions_Advanced
    about_Functions_Advanced_Methods  
    about_Functions_CmdletBindingAttribute




목차