about_Splatting

업데이트 날짜: 2014년 5월

적용 대상: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

항목

about_Splatting

간단한 설명

스플랫(splat)을 사용하여 Windows PowerShell®에서 명령에 매개 변수를 전달하는 방법을 설명합니다.

자세한 설명

[이 항목은 시스템 관리자이자 2012 Scripting Games의 Advanced Division 수상자인 Rohn Edwards(Gulfport, Mississippi)가 제공한 것입니다. Windows PowerShell 3.0용으로 수정되었습니다.]

스플랫(splat)은 매개 변수 값의 컬렉션을 단위로 명령에 전달하는 방법입니다. Windows PowerShell에서는 컬렉션의 각 값을 명령 매개 변수에 연결합니다. 스플랫(splat)된 매개 변수 값은 표준 변수처럼 표시되는 명명된 스플랫(splat) 변수에 저장되지만 달러 기호($) 대신 앳 기호(@)로 시작됩니다. 앳 기호는 단일 값이 아닌 값 컬렉션을 전달하고 있음을 Windows PowerShell에 알립니다.

스플랫(splat)을 사용하면 명령이 더 짧아지고 명령을 더 쉽게 읽을 수 있습니다. 스플랫(splat) 값은 서로 다른 명령 호출에서 다시 사용할 수 있으며 스플랫(splat)을 사용하여 매개 변수 값을 $PSBoundParameters 자동 변수에서 다른 스크립트 및 함수로 전달할 수 있습니다.

Windows PowerShell 3.0부터는 스플랫(splat)을 사용하여 명령의 모든 매개 변수를 나타낼 수도 있습니다.

구문

    <CommandName> <optional parameters> @<HashTable> <optional parameters>

    <CommandName> <optional parameters> @<Array> <optional parameters>

매개 변수 이름이 필요 없는 위치 매개 변수에 매개 변수 값을 제공하려면 배열 구문을 사용합니다. 매개 변수 이름 및 값 쌍을 제공하려면 해시 테이블 구문을 사용합니다. 스플랫(splat)된 값은 매개 변수 목록의 어디에나 나타날 수 있습니다.

스플랫(splat)하면 모든 매개 변수를 전달하기 위해 해시 테이블이나 배열을 사용할 필요가 없습니다. 스플랫(splat)을 사용하여 일부 매개 변수를 전달하고 위치나 매개 변수 이름으로 일부를 전달할 수 있습니다. 또한 단일 명령으로 여러 개체를 스플랫(splat)할 수 있으므로 각 매개 변수에 대해 하나 이상의 값을 전달할 수 없습니다.

해시 테이블로 스플랫(splat)

해시 테이블을 사용하여 매개 변수 이름 및 값 쌍을 스플랫(splat)합니다. 위치 및 명명된 매개 변수, 스위치 매개 변수를 포함한 모든 매개 변수 유형에 이 형식을 사용할 수 있습니다.

다음 예제에서는 같은 디렉터리에 있는 Test2.txt 파일에 Test.txt 파일을 복사하는 두 개의 Copy-Item 명령을 비교합니다.

첫 번째 예제에서는 매개 변수 이름이 포함된 기존 형식을 사용합니다.

        Copy-Item -Path "test.txt" -Destination "test2.txt" -WhatIf

두 번째 예제에서는 해시 테이블 스플랫(splat)을 사용합니다. 첫 번째 명령은 매개 변수 이름과 매개 변수 값 쌍의 해시 테이블을 만들고 $HashArguments 변수에 저장합니다. 두 번째 명령은 명령의 $HashArguments 변수를 스플랫(splat)에서 사용합니다. 앳 기호(@HashArguments)가 명령의 달러 기호($HashArguments)를 대체합니다.

WhatIf 스위치 매개 변수에 대한 값을 제공하려면 $True 또는 $False를 사용합니다.

       PS C:\>$HashArguments = @{ Path = "test.txt"; Destination = "test2.txt"; WhatIf = $true }
       PS C:\>Copy-Item @HashArguments

참고: 첫 번째 명령에서 앳 기호(@)는 스플랫(splat)된 값이 아닌 해시 테이블을 나타냅니다. Windows PowerShell에서 해시 테이블에 대한 구문은 다음과 같습니다. @{ <name>=<value>; <name>=<value>; …}

배열로 스플랫(splat)

배열을 사용하여 매개 변수 이름이 필요 없는 위치 매개 변수에 대한 값을 스플랫(splat)합니다. 값은 배열에서 위치-번호 순서여야 합니다.

다음 예제에서는 같은 디렉터리에 있는 Test2.txt 파일에 Test.txt 파일을 복사하는 두 개의 Copy-Item 명령을 비교합니다.

첫 번째 예제에서는 매개 변수 이름이 생략된 기존 형식을 사용합니다. 매개 변수 값은 명령의 위치 순서로 표시됩니다.

        Copy-Item "test.txt" "test2.txt" -WhatIf

두 번째 예제에서는 배열 스플랫(splat)을 사용합니다. 첫 번째 명령은 매개 변수 값의 배열을 만들고 $ArrayArguments 변수에 저장합니다. 값은 배열의 위치 순서입니다. 두 번째 명령은 명령의 $ArrayArguments 변수를 스플랫(splat)에서 사용합니다. 앳 기호(@ArrayArguments)가 명령의 달러 기호($ArrayArguments)를 대체합니다.

        PS C:\>$ArrayArguments = "test.txt", "test2.txt"
        PS C:\>Copy-Item @ArrayArguments -WhatIf

예제

이 예제에서는 스플랫(splat)된 값을 서로 다른 명령에서 다시 사용하는 방법을 보여 줍니다. 이 예제의 명령에서는 Write-Host cmdlet을 사용하여 호스트 프로그램 콘솔에 메시지를 기록합니다. 이 명령은 스플랫(splat)을 사용하여 전경색과 배경색을 지정합니다.

모든 명령의 색을 변경하려면 $Colors 변수의 값을 변경하면 됩니다.

첫 번째 명령은 매개 변수 이름 및 값의 해시 테이블을 만들고 $Colors 변수에 해시 테이블을 저장합니다.

               $Colors = @{ForegroundColor = "black"
                           BackgroundColor = "white"}

두 번째 및 세 번째 명령은 Write-Host 명령의 스플랫(splat)에 $Colors 변수를 사용합니다. $Colors 변수를 사용하려면 달러 기호($Colors)를 앳 기호(@Colors)로 대체합니다.

               # Write a message with the colors in $Colors
               Write-Host "This is a test." @Colors

               # Write second message with same colors. 
               # The position of splatted hash table does not matter.
               Write-Host @Colors "This is another test."

이 예제에서는 스플랫(splat) 및 $PSBoundParameters 자동 변수를 사용하여 다른 명령에 매개 변수를 전달하는 방법을 보여 줍니다.

$PSBoundParameters 자동 변수는 스크립트나 함수가 실행될 때 사용되는 모든 매개 변수 이름 및 값이 포함된 사전(System.Collections.Generic.Dictionary)입니다.

다음 예제에서는 $PSBoundParameters 변수를 사용하여 스크립트 또는 함수에 전달된 매개 변수 값을 Test2 함수에서 Test1 함수에 전달합니다. Test2에서 Test1 함수 호출 모두 스플랫(splat)을 사용합니다.

              function Test1
              {
                   param($a, $b, $c)

                   $a
                   $b
                   $c
               }              

              function Test2
              {
                   param($a, $b, $c)

                   # Call the Test1 function with $a, $b, and $c.
                   Test1 @PsBoundParameters

                   # Call the Test1 function with $b and $c, but not with $a
                   $LimitedParameters = $PSBoundParameters
                   $LimitedParameters.Remove("a") | Out-Null
                   Test1 @LimitedParameters
               }

               PS C:\> Test2 -a 1 -b 2 -c 3
               1
               2
               3
               2
               3

스플랫(SPLAT) 명령 매개 변수

스플랫(splat)을 사용하여 명령의 매개 변수를 나타낼 수 있습니다. 이 기술은 프록시 함수, 즉 또 다른 명령을 호출하는 함수를 만들려는 경우에 유용합니다. 이 기능은 Windows PowerShell 3.0에서 도입되었습니다.

명령의 매개 변수를 스플랫(splat)하려면 @Args를 사용하여 명령 매개 변수를 나타냅니다. 이 기술은 명령 매개 변수를 열거하는 것보다 쉬우며 호출된 명령의 매개 변수가 변경된 경우에도 수정 없이 작동합니다.

이 기능에서는 $Args 자동 변수를 사용하며, 이 변수에는 할당되지 않은 매개 변수 값이 모두 포함되어 있습니다. 여기에 섹션 본문을 삽입합니다.

예를 들어 다음 함수는 Get-Process cmdlet을 호출합니다. 이 함수에서 @Args는 Get-Process cmdlet의 모든 매개 변수를 나타냅니다.

        function Get-MyProcess { Get-Process @Args }

Get-MyProcess 함수를 사용하면 다음 명령과 같이 할당되지 않은 매개 변수 및 매개 변수 값이 모두 @Args에 전달됩니다.

        PS C:\> Get-MyProcess -Name PowerShell  

        Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
        -------  ------    -----      ----- -----   ------     -- -----------
            463      46   225484     237196   719    15.86   3228 powershell


        PS C:\> Get-MyProcess -Name PowerShell_Ise -FileVersionInfo 

        ProductVersion   FileVersion      FileName
        --------------   -----------      --------
        6.2.9200.16384   6.2.9200.1638... C:\Windows\system32\WindowsPowerShell\v1.0\PowerShell_ISE.exe

@Args는 매개 변수를 명시적으로 선언한 함수에서 사용할 수 있습니다. 이 변수는 한 함수에서 두 번 이상 사용할 수 있지만 다음 예제와 같이 입력하는 모든 매개 변수가 @Args의 모든 인스턴스에 전달됩니다.

        function Get-MyCommand 
        { 
            Param ([switch]$P, [switch]$C)
            if ($P) { Get-Process @Args }
            if ($C) { Get-Command @Args }
        }        

        PS C:\> Get-MyCommand -P -C -Name PowerShell

        Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
        -------  ------    -----      ----- -----   ------     -- -----------
            408      28    75568      83176   620     1.33   1692 powershell

        Path               : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
        Extension          : .exe
        Definition         : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
        Visibility         : Public
        OutputType         : {System.String}
        Name               : powershell.exe
        CommandType        : Application
        ModuleName         :
        Module             :
        RemotingCapability : PowerShell
        Parameters         :
        ParameterSets      :
        HelpUri            :
        FileVersionInfo    : File:             C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

참고 항목

about_arrays

about_Automatic_Variables

about_Hash_Tables

about_Parameters