스플래팅 정보
간단한 설명
스플래팅을 사용하여 PowerShell의 명령에 매개 변수를 전달하는 방법을 설명합니다.
자세한 설명
[이 주제는 시스템 관리자이자 2012 스크립팅 게임 고급 부문의 우승자인 미시시피 걸프포트의 Rohn Edwards에 의해 기여되었습니다. Windows PowerShell 3.0에 대해 수정되었습니다.]
Splatting은 매개 변수 값 컬렉션을 단위로 명령에 전달하는 방법입니다. PowerShell은 컬렉션의 각 값을 명령 매개 변수와 연결합니다. 스플래팅된 매개 변수 값은 표준 변수처럼 보이지만 달러 기호($
) 대신 At 기호(@
)로 시작하는 명명된 스플래팅 변수에 저장됩니다. At 기호는 단일 값 대신 값 컬렉션을 전달한다는 것을 PowerShell에 알려줍니다.
스플래팅을 사용하면 명령을 더 짧고 쉽게 읽을 수 있습니다. 다른 명령 호출에서 스플래팅 값을 다시 사용하고 스플래팅을 사용하여 자동 변수의 $PSBoundParameters
매개 변수 값을 다른 스크립트 및 함수로 전달할 수 있습니다.
Windows PowerShell 3.0부터 스플래팅을 사용하여 명령의 모든 매개 변수를 나타낼 수도 있습니다.
SYNTAX
<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 스위치 매개 변수에 대한 값을 제공하려면 또는 $False
을 사용합니다$True
.
$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
예제
이 예제에서는 다른 명령에서 스플래트된 값을 다시 사용하는 방법을 보여 줍니다. 이 예제의 명령은 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."
이 예제에서는 스플래팅 및 $PSBoundParameters
자동 변수를 사용하여 매개 변수를 다른 명령으로 전달하는 방법을 보여 줍니다.
$PSBoundParameters
자동 변수는 스크립트 또는 함수를 실행할 때 사용되는 모든 매개 변수 이름과 값을 포함하는 사전 개체(System.Collections.Generic.Dictionary)입니다.
다음 예제에서는 변수를 $PSBoundParameters
사용하여 함수에서 Test2
함수 Test1
로 스크립트 또는 함수에 전달된 매개 변수 값을 전달합니다. 두 호출 모두 스플래팅을 사용하여 함수를 Test2
호출 Test1
합니다.
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
}
Test2 -a 1 -b 2 -c 3
1
2
3
2
3
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) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
408 28 75568 83176 620 1.33 1692 powershell
Path : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.e
Extension : .exe
Definition : C:\Windows\System32\WindowsPowerShell\v1.0\powershell.e
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.14393.0 (rs1_release.160715-1616
FileDescription: Windows PowerShell
Product: Microsoft Windows Operating System
ProductVersion: 10.0.14393.0
Debug: False
Patched: False
PreRelease: False
PrivateBuild: False
SpecialBuild: False
Language: English (United States)
참고
PowerShell Desired State Configuration(DSC)는 스플래팅을 사용하도록 설계되지 않았습니다. 스플래팅을 사용하여 DSC 리소스에 값을 전달할 수 없습니다. 자세한 내용은 가엘 콜라스의 의사 스플래팅 DSC 리소스 문서를 참조하세요.