2011-09-14 8 views
7

Estoy intentando escribir una función de envoltura en PowerShell que básicamente evalúa el primer parámetro y en función de que ejecuta un programa en la computadora. Todos los parámetros restantes para la función de envoltura deben pasar al programa que se ejecuta también.Función de envoltura en PowerShell: Pase los parámetros restantes

lo tanto, debe ser algo como esto:

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

Ahora sólo añadir $args no funciona, así que lo que tengo que hacer para que funcione? Otra opción sería probablemente usar Invoke-Expression, pero se siente un poco como eval, así que quiero evitarlo si es posible, y además creo que hacerlo de esa manera me limitaría a los parámetros solo de cadena ¿no? De ser posible, me gustaría tener el soporte completo para el programa envuelto/cmdlet, básicamente como un alias dinámico. ¿Es eso posible?

Respuesta

10

Este tipo de hace lo que pide. Puede tener problemas si necesita pasar las opciones con prefijo de guion al ejecutable que entra en conflicto o causa ambigüedad con los parámetros comunes de PowerShell. Pero esto puede ayudarte a comenzar.

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

lo que ha escrito (excepto por el error de sintaxis en else if - debe ser elseif) funciona. Tenga en cuenta que lo que hay allí es $args son los argumentos sin nombre que están por encima de los parámetros esperados por la función.

Así que si llamar a prueba como

test -option "A" 1 2 3 

$args tendrá 1,2,3

Tenga en cuenta que si se llama a prueba como

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

$args tendrá -other,B,1,2,3

Cuestiones relacionadas