about_Splatting

간단한 설명

스플래팅을 사용하여 PowerShell의 명령에 매개 변수를 전달하는 방법을 설명합니다.

자세한 설명

스플래팅은 매개 변수 값 컬렉션을 단위로 명령에 전달하는 방법입니다. PowerShell은 컬렉션의 각 값을 명령 매개 변수와 연결합니다. 스플래팅된 매개 변수 값은 표준 변수처럼 보이지만 달러 기호$()가 아닌 At 기호(@)로 시작하는 명명된 스플래팅 변수에 저장됩니다. At 기호는 단일 값 대신 값 컬렉션을 전달한다는 것을 PowerShell에 알려줍니다.

스플래팅을 사용하면 명령을 더 짧고 읽기 쉽게 만들 수 있습니다. 여러 명령 호출에서 스플래팅 값을 다시 사용하고 스플래팅을 사용하여 자동 변수의 $PSBoundParameters 매개 변수 값을 다른 스크립트 및 함수로 전달할 수 있습니다.

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

구문

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

매개 변수 이름이 필요하지 않은 위치 매개 변수에 대한 매개 변수 값을 제공하려면 배열 구문을 사용합니다. 매개 변수 이름 및 값 쌍을 제공하려면 해시 테이블 구문을 사용합니다. 스플래트된 값은 매개 변수 목록의 아무 곳에나 나타날 수 있습니다.

스플래팅할 때는 해시 테이블 또는 배열을 사용하여 모든 매개 변수를 전달할 필요가 없습니다. 스플래팅을 사용하여 일부 매개 변수를 전달하고 위치 또는 매개 변수 이름으로 다른 매개 변수를 전달할 수 있습니다. 또한 각 매개 변수에 대해 둘 이상의 값을 전달하지 않도록 단일 명령으로 여러 개체를 스플래트할 수 있습니다.

PowerShell 7.1을 기준으로 명령에서 매개 변수를 명시적으로 정의하여 스플래팅된 매개 변수를 재정의할 수 있습니다.

해시 테이블을 사용하여 스플래팅

해시 테이블을 사용하여 매개 변수 이름 및 값 쌍을 스플래트합니다. 위치 및 스위치 매개 변수를 포함하여 모든 매개 변수 형식에 이 형식을 사용할 수 있습니다. 위치 매개 변수는 이름으로 할당해야 합니다.

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

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

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

두 번째 예제에서는 해시 테이블 스플래팅을 사용합니다. 첫 번째 명령은 매개 변수 이름 및 매개 변수-값 쌍의 해시 테이블을 만들고 변수에 $HashArguments 저장합니다. 두 번째 명령은 스플래팅이 있는 명령의 변수를 사용합니다 $HashArguments . At 기호(@HashArguments)는 명령의 달러 기호($HashArguments)를 바꿉니다.

WhatIf 스위치 매개 변수에 대한 값을 제공하려면 사용 $True 하거나 $False.

$HashArguments = @{
  Path = "test.txt"
  Destination = "test2.txt"
  WhatIf = $true
}
Copy-Item @HashArguments

참고 항목

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

배열을 사용하여 스플래팅

배열을 사용하여 매개 변수 이름이 필요하지 않은 위치 매개 변수의 값을 스플래트합니다. 값은 배열의 위치 번호 순서여야 합니다.

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

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

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

두 번째 예제에서는 배열 스플래팅을 사용합니다. 첫 번째 명령은 매개 변수 값의 배열을 만들고 변수에 $ArrayArguments 저장합니다. 값은 배열의 위치 순서에 있습니다. 두 번째 명령은 스플래팅의 명령에서 변수를 사용합니다 $ArrayArguments . At 기호(@ArrayArguments)는 명령의 달러 기호($ArrayArguments)를 바꿉니다.

$ArrayArguments = "test.txt", "test2.txt"
Copy-Item @ArrayArguments -WhatIf

ArgumentList 매개 변수 사용

여러 cmdlet에는 cmdlet에서 실행되는 스크립트 블록에 매개 변수 값을 전달하는 데 사용되는 ArgumentList 매개 변수가 있습니다. ArgumentList 매개 변수는 스크립트 블록에 전달되는 값 배열을 사용합니다. PowerShell은 배열 스플래팅을 효과적으로 사용하여 스크립트 블록의 매개 변수에 값을 바인딩합니다. ArgumentList를 사용하는 경우 배열을 단일 매개 변수에 바인딩된 단일 개체로 전달해야 하는 경우 배열을 다른 배열의 유일한 요소로 래핑해야 합니다.

다음 예제에는 문자열 배열인 단일 매개 변수를 사용하는 스크립트 블록이 있습니다.

$array = 'Hello', 'World!'
Invoke-Command -ScriptBlock {
  param([string[]]$words) $words -join ' '
  } -ArgumentList $array

이 예제에서는 첫 번째 항목 $array 만 스크립트 블록에 전달됩니다.

Hello
$array = 'Hello', 'World!'
Invoke-Command -ScriptBlock {
  param([string[]]$words) $words -join ' '
} -ArgumentList (,$array)

이 예제 $array 에서는 전체 배열이 단일 개체로 스크립트 블록에 전달되도록 배열에 래핑됩니다.

Hello World!

예제

예제 1: 여러 명령에서 스플래트된 매개 변수 다시 사용

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

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

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

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

두 번째 및 세 번째 명령은 명령에서 $Colors 스플래팅에 변수를 Write-Host 사용합니다. 사용 $Colors variable하려면 달러 기호($Colors)를 At 기호(@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."

예제 2: $PSBoundParameters 사용하여 매개 변수 전달

이 예제에서는 스플래팅 및 자동 변수를 사용하여 해당 매개 변수를 다른 명령으로 $PSBoundParameters 전달하는 방법을 보여 줍니다.

$PSBoundParameters 자동 변수는 스크립트 또는 함수를 실행할 때 사용되는 모든 매개 변수 이름과 값을 포함하는 사전 개체(System.Collections.Generic.Dictionary)입니다.

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

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

    "a = $a"
    "b = $b"
    "c = $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
    Test1 -b $PSBoundParameters.b -c $PSBoundParameters.c
}

Test2 -a 1 -b 2 -c 3
a = 1
b = 2
c = 3
a =
b = 2
c = 3

예제 3: 명시적으로 정의된 매개 변수를 사용하여 스플래트된 매개 변수 재정의

이 예제에서는 명시적으로 정의된 매개 변수를 사용하여 스플래트된 매개 변수를 재정의하는 방법을 보여줍니다. 이 기능은 새 해시 테이블을 빌드하거나 splat에 사용하는 해시 테이블의 값을 변경하지 않으려는 경우에 유용합니다.

변수는 $commonParams 위치에 가상 머신을 만드는 매개 변수를 저장합니다 East US . 변수는 $allVms 만들 가상 머신의 목록입니다. 목록을 반복하고 매개 변수를 스플래팅하여 각 가상 머신을 만드는 데 사용합니다 $commonParams . 그러나 다른 가상 머신과 다른 지역에 만들려는 myVM2 경우 해시 테이블을 조정하는 $commonParams 대신 위치 매개 변수 New-AzVm 를 명시적으로 정의하여 키 $commonParams값을 Location 대체합니다.

$commonParams = @{
    ResourceGroupName = "myResourceGroup"
    Location = "East US"
    VirtualNetworkName = "myVnet"
    SubnetName = "mySubnet"
    SecurityGroupName = "myNetworkSecurityGroup"
    PublicIpAddressName = "myPublicIpAddress"
}

$allVms = @('myVM1','myVM2','myVM3',)

foreach ($vm in $allVms)
{
    if ($vm -eq 'myVM2')
    {
        New-AzVm @commonParams -Name $vm -Location "West US"
    }
    else
    {
        New-AzVm @commonParams -Name $vm
    }
}

예제 4: 단일 명령에서 여러 스플래트된 개체 사용

단일 명령에서 여러 스플래트된 개체를 사용할 수 있습니다. 이 예제에서는 서로 다른 매개 변수가 별도의 해시 테이블로 정의됩니다. 해시 테이블은 단일 Write-Host 명령으로 스플래트됩니다.

$a = @{
    Message         = 'Hello', 'World!'
}
$b = @{
    Separator       = '|'
}
$c = @{
    BackgroundColor = 'Cyan'
    ForegroundColor = 'Black'
}
Write-Host @a @b @c

Splatting 명령 매개 변수

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

명령의 매개 변수를 스플래트하려면 명령 매개 변수를 나타내는 데 사용합니다 @Args . 이 기술은 명령 매개 변수를 열거하는 것보다 쉬우며 호출된 명령의 매개 변수가 변경되더라도 수정 없이 작동합니다.

이 기능은 할당되지 않은 모든 매개 변수 값을 포함하는 자동 변수를 사용합니다 $Args .

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

function Get-MyProcess { Get-Process @Args }

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

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
Get-MyProcess -Name PowerShell_Ise -FileVersionInfo
ProductVersion   FileVersion      FileName
--------------   -----------      --------
6.2.9200.16384   6.2.9200.1638... C:\Windows\system32\WindowsPowerShell\...

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

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

Get-MyCommand -P -C -Name PowerShell
 NPM(K)    PM(M)      WS(M)     CPU(s)      Id  SI ProcessName
 ------    -----      -----     ------      --  -- -----------
     50   112.76      78.52      16.64    6880   1 powershell

Path               : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Extension          : .exe
Definition         : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Source             : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
Version            : 10.0.22621.3085
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
                     InternalName:     POWERSHELL
                     OriginalFilename: PowerShell.EXE.MUI
                     FileVersion:      10.0.22621.1 (WinBuild.160101.0800)
                     FileDescription:  Windows PowerShell
                     Product:          Microsoft&reg; Windows&reg; Operating System
                     ProductVersion:   10.0.22621.1
                     Debug:            False
                     Patched:          False
                     PreRelease:       False
                     PrivateBuild:     False
                     SpecialBuild:     False
                     Language:         English (United States)

주의

CmdletBinding 또는 매개 변수 특성을 $args 사용하여 고급 함수로 함수를 만드는 경우 함수에서 자동 변수를 더 이상 사용할 수 없습니다. 고급 함수에는 명시적 매개 변수 정의가 필요합니다.

PowerShell DSC(필요한 상태 구성)는 스플래팅을 사용하도록 설계되지 않았습니다. 스플래팅을 사용하여 DSC 리소스에 값을 전달할 수 없습니다. 자세한 내용은 게일 콜라스의 의사 스플래팅 DSC 리소스 문서를 참조하세요.

참고 항목