about_Parameters
about_Parameters (매개 변수)
PowerShell 명령은 대부분 매개 변수(parameter)를 받아요. 이 문서는 명령어에서 매개 변수가 어떻게 쓰이고, Get-Help가 알려주는 매개 변수 속성을 하나씩 뜯어보는 글입니다. 콘솔에서 명령어를 실행하다 보면 -Path, -Name 같은 걸 보게 되는데, 그게 실제로 어떤 규칙 아래 동작하는지 감을 잡을 수 있어요.
본문
한눈에 보기
대부분의 PowerShell 명령(cmdlet, 함수, 스크립트)은 사용자가 옵션을 고르거나 입력을 넣을 수 있도록 매개 변수에 의존해요. 매개 변수는 명령 이름 뒤에 붙고, 이런 모양을 가집니다.
-<parameter_name> <parameter_value>
-<parameter_name>:<parameter_value>
매개 변수 이름 앞에는 하이픈(-)이 붙어요. 이 하이픈이 PowerShell에게 "이 다음 단어는 매개 변수 이름이다"를 알려주는 신호죠. 매개 변수 이름과 값은 공백으로 구분하거나 콜론(:)으로 구분할 수 있어요. 어떤 매개 변수는 값을 요구하지도, 받지도 않아요. 반대로 값을 요구하지만 이름을 굳이 붙이지 않아도 되는 매개 변수도 있어요.
매개 변수의 종류와 요구 조건은 저마다 달라요. 특정 명령의 매개 변수 정보를 보려면 Get-Help cmdlet을 쓰면 돼요. 예를 들어 Get-ChildItem cmdlet의 매개 변수 정보를 보려면 이렇게 입력하면 됩니다.
Get-Help Get-ChildItem
스크립트의 매개 변수 정보를 보려면 스크립트 파일의 전체 경로를 사용해요.
Get-Help $HOME\Documents\Scripts\Get-Function.ps1
Get-Help는 명령에 대한 여러 정보를 돌려줘요. 설명, 명령 구문, 매개 변수 정보, 그리고 매개 변수를 명령에서 어떻게 쓰는지 보여주는 예시까지 포함돼요.
특정 매개 변수 하나만 알고 싶다면 Get-Help의 Parameter 매개 변수를 쓸 수도 있어요. 여기에 와일드카드 문자(*)를 값으로 주면 명령의 모든 매개 변수 정보를 한 번에 볼 수 있죠. 아래 명령은 Get-Member cmdlet의 모든 매개 변수 정보를 가져옵니다.
Get-Help Get-Member -Parameter *
기본 매개 변수 값
옵션 매개 변수(optional parameter)는 기본 값을 가져요. 명령에 해당 매개 변수를 지정하지 않았을 때 사용되거나 가정되는 값이죠.
예를 들어 많은 cmdlet의 ComputerName 매개 변수 기본 값은 로컬 컴퓨터 이름이에요. 그래서 ComputerName 매개 변수를 따로 지정하지 않으면 그 명령은 로컬 컴퓨터 이름을 사용하는 거예요.
기본 매개 변수 값을 찾으려면 해당 cmdlet의 도움말 항목을 보면 돼요. 매개 변수 설명에 기본 값이 함께 적혀 있어요.
cmdlet이나 고급 함수의 어떤 매개 변수든 사용자 지정 기본 값을 설정할 수도 있어요. 사용자 지정 기본 값 설정에 대한 자세한 내용은 about_Parameters_Default_Values를 참고하세요.
매개 변수 특성 표 (parameter attribute table)
Get-Help에서 Full, Parameter, Online 매개 변수를 쓰면, 매개 변수 특성 표가 표시돼요. 이 표에 매개 변수 사용에 필요한 상세 정보가 담겨 있습니다.
예를 들어 Get-ChildItem cmdlet의 도움말 항목에는 Path 매개 변수에 대해 이런 내용이 들어 있어요.
-Path <string[]>
Specifies a path of one or more locations. Wildcard characters are
permitted. The default location is the current directory (.).
Required? false
Position? 0
Default value Current directory
Accept pipeline input? true (ByValue, ByPropertyName)
Accept wildcard characters? true
매개 변수 정보에는 매개 변수 구문, 매개 변수 설명, 그리고 매개 변수 특성이 포함돼요. 아래 절에서 이 특성들을 하나씩 살펴볼게요.
Required (필수 여부)
이 설정은 매개 변수가 필수(mandatory) 인지, 즉 이 cmdlet을 쓰는 모든 명령이 반드시 이 매개 변수를 포함해야 하는지를 알려줘요. 값이 True인데 명령에 해당 매개 변수가 빠져 있으면, PowerShell이 그 값을 입력하라고 프롬프트를 띄워요.
Position (위치)
Position 설정이 음수가 아닌 정수면, 매개 변수 이름을 생략할 수 있어요. 이런 매개 변수를 위치 매개 변수(positional parameter) 라고 부르고, 그 숫자는 다른 위치 매개 변수와 비교해 이 매개 변수가 몇 번째 자리에 와야 하는지를 나타내요. 이름을 붙이는 명명 매개 변수(named parameter)는 cmdlet 이름 뒤 어느 위치에 두어도 돼요. 위치 매개 변수에 이름을 붙이더라도 cmdlet 이름 뒤 어느 위치에나 둘 수 있답니다.
예를 들어 Get-ChildItem cmdlet에는 Path와 Exclude 매개 변수가 있어요. Path의 Position 설정은 0이라 위치 매개 변수예요. Exclude의 Position 설정은 명명(named)이에요.
즉 Path는 매개 변수 이름을 요구하지 않지만, 이름 없는 매개 변수 값 중에서 첫 번째(또는 유일한) 값이어야 해요. 반면 Exclude는 명명 매개 변수라서 명령에서 어느 위치에 두든 상관없어요.
이 두 매개 변수의 Position 설정 덕분에 아래 명령들은 전부 사용 가능해요.
Get-ChildItem -Path C: echdocs -Exclude *.ppt
Get-ChildItem C: echdocs -Exclude *.ppt
Get-ChildItem -Exclude *.ppt -Path C: echdocs
Get-ChildItem -Exclude *.ppt C: echdocs
매개 변수 이름 없이 또 다른 위치 매개 변수를 추가하고 싶다면, 그 매개 변수는 Position 설정이 지정한 순서대로 배치해야 해요.
Type (형식)
이 설정은 매개 변수 값의 Microsoft .NET Framework 형식을 지정해요. 예를 들어 형식이 Int32면 매개 변수 값은 정수여야 해요. 형식이 string이면 값은 문자열이어야 하죠. 문자열에 공백이 포함되면 값을 따옴표로 감싸거나, 공백 앞에 이스케이프 문자(`)를 붙여야 합니다.
Default Value (기본 값)
이 설정은 다른 값을 제공하지 않았을 때 매개 변수가 가지게 될 값을 지정해요. 예를 들어 Path 매개 변수의 기본 값은 보통 현재 디렉터리예요. 필수 매개 변수는 기본 값을 절대 갖지 않아요. 많은 옵션 매개 변수는 사용하지 않으면 효과가 없기 때문에 기본 값이 없는 경우도 있어요.
Accepts Multiple Values (여러 값 허용)
이 설정은 매개 변수가 여러 매개 변수 값을 받는지 나타내요. 여러 값을 받는 매개 변수라면, 명령에서 값으로 쉼표로 구분한 목록을 입력하거나, 쉼표로 구분한 목록(배열)을 변수에 저장한 뒤 그 변수를 매개 변수 값으로 지정할 수 있어요.
예를 들어 Get-Service cmdlet의 Name 매개 변수는 여러 값을 받아요. 아래 두 명령 모두 유효합니다.
Get-Service -Name winrm, netlogon
$s = "winrm", "netlogon"
Get-Service -Name $s
Accepts Pipeline Input (파이프라인 입력 허용)
이 설정은 파이프라인 연산자(|)로 값을 매개 변수에 보낼 수 있는지를 나타내요.
Value Description
----- -----------
False Indicates that you cannot pipe a value to the
parameter.
True (by Value) Indicates that you can pipe any value to the
parameter, just so the value has the .NET
Framework type specified for the parameter or the
value can be converted to the specified .NET
Framework type.
매개 변수가 "True (by Value)"이면, PowerShell은 명령을 해석하는 다른 방법을 시도하기 전에 파이프로 들어온 값을 그 매개 변수와 연결하려고 해요.
True (by Property Name) Indicates that you can pipe a value to the
parameter, but the .NET Framework type of the
parameter must include a property with the same
name as the parameter.
예를 들어 값에 Name이라는 속성이 있을 때만 Name 매개 변수로 값을 파이프할 수 있어요.
참고 파이프라인 입력을 (by Value)나 (by PropertyName)으로 받는 형식 지정 매개 변수에서는 그 매개 변수에 지연 바인딩 스크립트블록(delay-bind scriptblock) 을 쓸 수 있어요. 지연 바인딩 스크립트블록은
ParameterBinding중에 자동으로 실행되고, 결과가 매개 변수에 바인딩돼요. 단,ScriptBlock이나System.Object형식으로 정의된 매개 변수에서는 지연 바인딩이 동작하지 않아요. 이 경우 스크립트블록은 실행되지 않은 채 그대로 전달됩니다.
지연 바인딩 스크립블록에 대한 자세한 내용은 about_Script_Blocks에서 읽을 수 있어요.
Accepts Wildcard Characters (와일드카드 문자 허용)
이 설정은 매개 변수의 값에 와일드카드 문자를 넣을 수 있는지, 즉 그 값이 대상 컨테이너에 있는 여러 항목에 일치할 수 있는지를 나타내요.
공통 매개 변수 (Common Parameters)
공통 매개 변수는 어떤 cmdlet에서든 함께 사용할 수 있는 매개 변수예요. 공통 매개 변수에 대한 자세한 내용은 about_CommonParameters를 참고하세요.