2011-09-14 55 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