about_Splatting
간단한 설명
스플래팅을 사용하여 PowerShell의 명령에 매개 변수를 전달하는 방법을 설명합니다.
자세한 설명
스플래팅은 매개 변수 값 컬렉션을 단위로 명령에 전달하는 방법입니다. PowerShell은 컬렉션의 각 값을 명령 매개 변수와 연결합니다. 스플래팅된 매개 변수 값은 표준 변수처럼 보이지만 달러 기호$
()가 아닌 At 기호(@
)로 시작하는 명명된 스플래팅 변수에 저장됩니다. At 기호는 단일 값 대신 값 컬렉션을 전달한다는 것을 PowerShell에 알려줍니다.
스플래팅을 사용하면 명령을 더 짧고 읽기 쉽게 만들 수 있습니다. 여러 명령 호출에서 스플래팅 값을 다시 사용하고 스플래팅을 사용하여 자동 변수의 $PSBoundParameters
매개 변수 값을 다른 스크립트 및 함수로 전달할 수 있습니다.
Windows PowerShell 3.0부터는 스플래팅을 사용하여 명령의 모든 매개 변수를 나타낼 수도 있습니다.
구문
<CommandName> <optional parameters> @<HashTable> <optional parameters>
<CommandName> <optional parameters> @<Array> <optional parameters>
매개 변수 이름이 필요하지 않은 위치 매개 변수에 대한 매개 변수 값을 제공하려면 배열 구문을 사용합니다. 매개 변수 이름 및 값 쌍을 제공하려면 해시 테이블 구문을 사용합니다. 스플래트된 값은 매개 변수 목록의 아무 곳에나 나타날 수 있습니다.
스플래팅할 때는 해시 테이블 또는 배열을 사용하여 모든 매개 변수를 전달할 필요가 없습니다. 스플래팅을 사용하여 일부 매개 변수를 전달하고 위치 또는 매개 변수 이름으로 다른 매개 변수를 전달할 수 있습니다. 또한 각 매개 변수에 대해 둘 이상의 값을 전달하지 않도록 단일 명령으로 여러 개체를 스플래트할 수 있습니다.
해시 테이블을 사용하여 스플래팅
해시 테이블을 사용하여 매개 변수 이름 및 값 쌍을 스플래트합니다. 위치 및 스위치 매개 변수를 포함하여 모든 매개 변수 형식에 이 형식을 사용할 수 있습니다. 위치 매개 변수는 이름으로 할당해야 합니다.
다음 예제에서는 동일한 디렉터리의 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: 단일 명령에서 여러 스플래트된 개체 사용
단일 명령에서 여러 스플래트된 개체를 사용할 수 있습니다. 이 예제에서는 서로 다른 매개 변수가 별도의 해시 테이블로 정의됩니다. 해시 테이블은 단일 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
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
830 50 115840 95524 16.75 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® Windows® 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 리소스 문서를 참조하세요.
참고 항목
PowerShell