2011-09-14 12 views
7

기본적으로 첫 번째 매개 변수를 평가하고 컴퓨터에서 프로그램을 실행하는 PowerShell에서 래퍼 함수를 ​​작성하려고합니다. 래퍼 함수에 대한 나머지 모든 매개 변수는 실행 된 프로그램에도 전달되어야합니다.PowerShell의 래퍼 함수 : 나머지 매개 변수 전달

그래서 모양은 다음과 같습니다

function test ([string] $option) 
{ 
    if ($option -eq 'A') 
    { 
     Write-Host $args 
    } 
    elseif ($option -eq 'B') 
    { 
     . 'C:\Program Files\some\program.exe' $args 
    } 
} 

지금은 그냥 작동하지 않습니다 $args를 추가, 그래서 내가 그것을 작동하게하려면 어떻게해야합니까? 또 다른 옵션은 아마도 Invoke-Expression을 사용하고있을 것이지만 eval과 같은 느낌이 들기 때문에 가능하면 피하고 싶습니다. 그리고 그 일을 생각하면 문자열 전용 매개 변수로 제한 될 것입니다. 가능한 경우 래핑 된 프로그램/cmdlet에 대한 완벽한 지원을 원할 것입니다. 기본적으로 동적 별칭과 같습니다. 그게 가능한가?

답변

10

이런 종류의 질문은 사용자가 묻는 것입니다. PowerShell 공통 매개 변수와 충돌하거나 모호하게 만드는 실행 파일에 대시 접두사가 붙은 옵션을 전달해야하는 경우 문제가 발생할 수 있습니다. 그러나 이것은 당신을 시작할 수 있습니다. 당신이 쓴 무엇

function Invoke-MyProgram 
{ 
    [CmdletBinding()] 
    Param 
    (
     [parameter(mandatory=$true, position=0)][string]$Option, 
     [parameter(mandatory=$false, position=1, ValueFromRemainingArguments=$true)]$Remaining 
    ) 

    if ($Option -eq 'A') 
    { 
     Write-Host $Remaining 
    } 
    elseif ($Option -eq 'B') 
    { 
     & 'C:\Program Files\some\program.exe' @Remaining # NOTE: @ not $ (splatting) 
    } 
} 
2

(else if에서 구문 오류를 제외하고 - 그것은 elseif해야한다)의 작업을 수행합니다. $args은 함수에서 예상하는 매개 변수를 초과하는 이름없는 인수입니다. 당신이 1,2,3

주의해야합니다

test -option "A" 1 2 3 

$args으로 테스트를 호출하는 경우

그래서 당신은

로 테스트 호출하면 것을
test -option "A" -other "B" 1 2 3 

$args는 것 -other,B,1,2,3