간단한 설명
스플래팅을 사용하여 PowerShell의 명령에 매개 변수를 전달하는 방법을 설명합니다.
자세한 설명
[이 항목은 시스템 관리자이자 2012 Scripting Games의 고급 부문 우승자인 Rohn Edwards가 미시시피주 걸프포트에서 제공한 것입니다. Windows PowerShell 3.0에 맞게 수정되었습니다.]
Splatting은 매개 변수 값 컬렉션을 명령에 단위로 전달하는 방법입니다. PowerShell은 컬렉션의 각 값을 명령 매개 변수와 연결합니다. 스플래팅된 매개 변수 값은 표준 변수처럼 보이지만 달러 기호(@) 대신 At 기호($)로 시작하는 명명된 스플래팅 변수에 저장됩니다. At 기호는 단일 값 대신 값 컬렉션을 전달한다는 것을 PowerShell에 알려줍니다.
스플래팅을 사용하면 명령을 더 짧고 읽기 쉽게 만들 수 있습니다. 다른 명령 호출에서 스플래팅 값을 다시 사용하고 스플래팅을 사용하여 자동 변수의 매개 변수 값을 $PSBoundParameters 다른 스크립트 및 함수로 전달할 수 있습니다.
Windows PowerShell 3.0부터는 스플래팅을 사용하여 명령의 모든 매개 변수를 나타낼 수도 있습니다.
통사론
<CommandName> <optional parameters> @<HashTable> <optional parameters>
<CommandName> <optional parameters> @<Array> <optional parameters>
매개 변수 이름이 필요하지 않은 위치 매개 변수에 대한 매개 변수 값을 제공하려면 배열 구문을 사용합니다. 매개 변수 이름 및 값 쌍을 제공하려면 해시 테이블 구문을 사용합니다. 스플래트된 값은 매개 변수 목록의 아무 곳에나 나타날 수 있습니다.
스플래팅할 때는 해시 테이블 또는 배열을 사용하여 모든 매개 변수를 전달할 필요가 없습니다. 스플래팅을 사용하여 일부 매개 변수를 전달하고 위치 또는 매개 변수 이름으로 다른 매개 변수를 전달할 수 있습니다. 또한 단일 명령에서 여러 개체를 분할하여 각 매개 변수에 대해 두 개 이상의 값을 전달하지 않을 수 있습니다.
해시 테이블을 사용한 스플래팅
해시 테이블을 사용하여 매개 변수 이름 및 값 쌍을 스플래트합니다. 위치 및 스위치 매개 변수를 포함하여 모든 매개 변수 형식에 이 형식을 사용할 수 있습니다. 위치 매개 변수는 이름으로 할당해야 합니다.
다음 예제에서는 Test.txt 파일을 동일한 디렉터리의 Test2.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\>; ...}*
배열을 사용한 스플래팅
배열을 사용하여 매개 변수 이름이 필요하지 않은 위치 매개 변수의 값을 스플래트합니다. 값은 배열의 위치 번호 순서여야 합니다.
다음 예제에서는 Test.txt 파일을 동일한 디렉터리의 Test2.txt 파일에 복사하는 두 개의 Copy-Item 명령을 비교합니다.
첫 번째 예제에서는 매개 변수 이름을 생략하는 기존 형식을 사용합니다. 매개 변수 값은 명령의 위치 순서로 표시됩니다.
Copy-Item "test.txt" "test2.txt" -WhatIf
두 번째 예제에서는 배열 스플래팅을 사용합니다. 첫 번째 명령은 매개 변수 값의 배열을 만들고 $ArrayArguments 변수에 저장합니다. 값은 배열의 위치 순서에 있습니다. 두 번째 명령은 스플래팅의 명령에서 $ArrayArguments 변수를 사용합니다. At 기호(@ArrayArguments)는 명령의 달러 기호($ArrayArguments)를 바꿉니다.
$ArrayArguments = "test.txt", "test2.txt"
Copy-Item @ArrayArguments -WhatIf
예제
이 예제에서는 다른 명령에서 스플래팅된 값을 다시 사용하는 방법을 보여 줍니다. 이 예제의 명령은 Write-Host cmdlet을 사용하여 호스트 프로그램 콘솔에 메시지를 씁니다. 스플래팅을 사용하여 전경색과 배경색을 지정합니다.
모든 명령의 색을 변경하려면 $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."
이 예제에서는 splatting 및 $PSBoundParameters automatic 변수를 사용하여 매개 변수를 다른 명령으로 전달하는 방법을 보여 줍니다.
$PSBoundParameters 자동 변수는 스크립트 또는 함수를 실행할 때 사용되는 모든 매개 변수 이름과 값을 포함하는 사전 개체(System.Collections.Generic.Dictionary)입니다.
다음 예제에서는 $PSBoundParameters 변수를 사용하여 스크립트 또는 함수에 전달된 매개 변수 값을 Test2 함수에서 Test1 함수로 전달합니다.
Test1에서 Test2 함수로의 두 호출 모두 스플래팅 기술을 사용하고 있습니다.
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
스플래팅 명령 매개변수
스플래팅을 사용하여 명령의 매개 변수를 나타낼 수 있습니다. 이 기술은 프록시 함수, 즉 다른 명령을 호출하는 함수를 만들 때 유용합니다. 이 기능은 Windows PowerShell 3.0에서 도입되었습니다.
명령의 매개 변수를 스플래트하려면 @Args 사용하여 명령 매개 변수를 나타냅니다. 이 기술은 명령 매개 변수를 열거하는 것보다 쉬우며 호출된 명령의 매개 변수가 변경되더라도 수정 없이 작동합니다.
이 기능은 할당되지 않은 모든 매개 변수 값을 포함하는 $Args 자동 변수를 사용합니다.
예를 들어 다음 함수는 Get-Process cmdlet을 호출합니다. 이 함수에서 @ArgsGet-Process cmdlet의 모든 매개 변수를 나타냅니다.
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 DSC(필요한 상태 구성)는 스플래팅을 사용하도록 설계되지 않았습니다. 스플래팅을 사용하여 DSC 리소스에 값을 전달할 수 없습니다. 자세한 내용은 DSC 리소스 Pseudo-Splatting Gael Colas의 문서를 참조하세요.