PowerShell에서 명령 줄 인수를 처리하는 방법


494

명령 줄 인수를 처리하는 가장 좋은 방법은 무엇입니까?

"최상의"방법이 무엇인지에 대한 몇 가지 답변이있는 것처럼 보이며 결과적으로 다음과 같이 간단한 것을 처리하는 방법에 붙어 있습니다.

script.ps1 /n name /d domain

script.ps1 /d domain /n name.

더 잘 처리 할 수있는 플러그인이 있습니까? 나는 여기서 바퀴를 재발 명하고 있다는 것을 안다.

분명히 내가 이미 가지고있는 것은 예쁘지 않고 확실히 "최고"가 아니지만 효과가 있습니다. 그리고 그것은 추악합니다.

for ( $i = 0; $i -lt $args.count; $i++ ) {
    if ($args[ $i ] -eq "/n"){ $strName=$args[ $i+1 ]}
    if ($args[ $i ] -eq "-n"){ $strName=$args[ $i+1 ]}
    if ($args[ $i ] -eq "/d"){ $strDomain=$args[ $i+1 ]}
    if ($args[ $i ] -eq "-d"){ $strDomain=$args[ $i+1 ]}
}
Write-Host $strName
Write-Host $strDomain

답변:


917

당신은 바퀴를 재발 명하고 있습니다. 일반 PowerShell 스크립트에는 다음과 -같이로 시작하는 매개 변수가 있습니다.script.ps1 -server http://devserver

그런 다음 param파일 시작 부분 에서 섹션 을 처리합니다 .

매개 변수에 기본값을 할당하거나 사용할 수없는 경우 콘솔에서 기본값을 읽거나 스크립트 실행을 중지 할 수도 있습니다.

 param (
    [string]$server = "http://defaultserver",
    [Parameter(Mandatory=$true)][string]$username,
    [string]$password = $( Read-Host "Input password, please" )
 )

스크립트 안에서 간단히

write-output $server

모든 매개 변수가 스크립트 범위에서 사용 가능한 변수가되기 때문입니다.

이 예 $server에서 스크립트는 스크립트없이 호출되면 기본값을 가져오고 -username매개 변수 를 생략하면 스크립트가 중지 되고 -password생략 된 경우 터미널 입력을 요청합니다 .

업데이트 : "flag"(부울 true / false 매개 변수)를 PowerShell 스크립트에 전달할 수도 있습니다. 예를 들어, 스크립트를 사용하지 않으면 스크립트가보다 신중한 모드로 실행되는 "강제"를 사용할 수 있습니다.

해당 키워드는 [switch]매개 변수 유형입니다.

 param (
    [string]$server = "http://defaultserver",
    [string]$password = $( Read-Host "Input password, please" ),
    [switch]$force = $false
 )

스크립트 내부에서 다음과 같이 작업합니다.

if ($force) {
  //deletes a file or does something "bad"
}

이제 스크립트를 호출 할 때 switch / flag 매개 변수를 다음과 같이 설정했습니다.

.\yourscript.ps1 -server "http://otherserver" -force

플래그가 설정되어 있지 않다고 명시 적으로 나타내려면 특별한 구문이 있습니다.

.\yourscript.ps1 -server "http://otherserver" -force:$false

관련 Microsoft 설명서에 대한 링크 (PowerShell 5.0의 경우, 버전 3.0 및 4.0도 링크에서 사용 가능) :


58
실제로 PowerShell의 가장 큰 장점 중 하나는 사용하기 쉬운 표준 매개 변수 구문 분석 인프라를 제공한다는 것입니다.
Keith Hill

14
@naivists, PowerShell 2.0 대신 [string]$username = $(throw "-username is required.")필수 매개 변수에 대한 구문이 [Parameter(Mandatory=$true)][string]$username있습니다. 이러한 기술의 차이점에 대한 자세한 내용은 다음과 같습니다. blogs.technet.com/b/heyscriptingguy/archive/2011/05/22/…
v.karbovnichy 2016 년

7
인수가 제공되지 않을 때 버그에주의하십시오. 파워 쉘은 명령 줄에서 여분의 텍스트를 잡아 것입니다. \ yourscript.ps1 -server "를 SERV "-password "mypass를"이것은 마술 할당 '오타'$ 사용자 이름 것이다 오타.
sheamus

4
param 블록을 사용하면 의도하지 않은 다른 결과가있는 것 같습니다 : stackoverflow.com/questions/40940819/…
Logan

1
@ 시암 : 그것은 버그가 아닙니다! 매개 변수 이름을 사용하여 재정의하지 않는 한 Powershell은 인수를 주어진 순서대로 처리하고 할당합니다 (예 : 매개 변수 블록 목록에 $ user $ pass $ server가 있고 yourscript.ps1 abc를 실행하는 경우 특별히 사용자를 할당하지 않는 한 $ user, b를 $ pass 및 c를 $ server로 설정하십시오! 따라서 yourscript.ps1 -pass abc라고하면 $ pass가 a로 설정되고 나머지 (이름이없는) 매개 변수가 매개 변수 블록에 나열된 순서대로 누락 된 매개 변수를 채우는 데 사용되므로 $ user = b, $ 서버 = c.
페르난도 Madruga
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.