2011-09-14 96 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是什麼是未命名的參數,超過了函數所期望的參數。

所以,如果你測試的

test -option "A" 1 2 3 

$args將有1,2,3

請注意,如果你調用test作爲

test -option "A" -other "B" 1 2 3 

$args將有-other,B,1,2,3