2011-05-10 11 views
9

Estoy tratando de usar una variable como un parámetro de comando pero no puedo resolverlo. Digamos que MyCommand aceptará dos parámetros: option1 y option2 y aceptan valores booleanos. ¿Cómo usaría $ newVar para sustituir la opción 1 o 2? Por ejemplo:¿Cómo usar una variable de PowerShell como parámetro de comando?

$newVar = "option1" 
MyCommand -$newVar:$true 

me siguen dando algo a lo largo de las líneas de 'Un parámetro de posición no se puede encontrar que acepta el argumento '-System.String option1'.


Más específicamente:
En este caso, el archivo CSV es una salida de una política diferente. El ciclo pasa por cada propiedad en el archivo y establece ese valor en mi política asdf; por lo que -$_.name:$_.value debe sustituir como -AllowBluetooth:true.

Import-Csv $file | foreach-object { 
    $_.psobject.properties | where-object { 
    # for testing I'm limiting this to 'AllowBluetooth' option 
    if($_.name -eq "AllowBluetooth"){ 
    Set-ActiveSyncMailboxPolicy -Identity "asdf" -$_.name:$_.value 
    }} 
} 
+0

¿Quiere decir 'newVar' pero lo puso erróneamente en' myVar'? – manojlds

+0

Eso es correcto, gracias. – Gary

Respuesta

19

lo general de usar una variable para rellenar los parámetros de cmdlet, tendrá que utilizar una variable de tabla hash, y splat, usando @

$newVar = @{option1 = $true} 
mycommand @newVar 

Agregado ejemplo:

$AS_policy1 = @{ 
Identity = "asdf" 
AllowBluetooth = $true 
} 

Set-ActiveSyncMailboxPolicy @AS_policy1 
+0

Gracias por la ayuda, pero eso devuelve un error "No se puede encontrar un parámetro posicional que acepte el argumento 'System.Collections.Hashtable'. Específicamente tengo un bucle para obtener propiedades de propiedades de una Csv y ejecutarlas en Set-ActiveSyncMailboxPolicy. una instancia específica, diré $ _. name = "AllowBluetooth" y $ _. value = $ true (escribí estas variables para confirmar los valores correctos. Sin embargo, no puedo resumir todo 'Set-ActiveSyncMailboxPolicy - Identidad "asdf" @ {$ _. Nombre = $ _. Valor} 'o' - $ _. Nombre: $ _. Valor'. Sin embargo, toma $ _. Valor muy bien. – Gary

+0

Ver edición. Si planeas los parámetros , deberías incluirlos a todos en la tabla hash. – mjolinor

2

A ver si esto funciona para usted:

iex "MyCommand -$($newVar):$true" 
+0

Gracias manojlds, esto me unió un poco más. Literalmente, $ newVar es $ _. Name y $ true es $ _. Value (que equivale a "Allow"). La forma en que lo estaba haciendo, aceptaba $ _. Value para el valor pero no $ _. Name como parámetro. El uso de su método acepta $ _. Name como mi parámetro pero no $ _. Value como el valor ... Saying no puede convertir el valor "System.String" para escribir [type]. Sin embargo, seguiré probando otras cosas. – Gary

+0

Tengo su método para trabajar cuando - $ ($ newVar) quiere una cadena, pero falla en valores booleanos porque cree que es una cadena. Creo que es porque todo el comando está entre comillas. ¿Alguna sugerencia? – Gary

+0

@Fantabulum: 'iex" MyCommand - $ ($ _. Name): $ ($ _. Value) "' debería funcionar entonces, por la razón que expliqué en mi respuesta. +1 @manojlds. –

1

me gustaría probar con:

 
$mycmd = "MyCommand -$($newVar):$true" 
& $mycmd 

resultado

no puede trabajar debido a que el operador de signo solo ejecuta comandos individuales sin prameters, o bloques de script

+0

Gracias por la sugerencia de empo, pero parece que se comporta de la misma manera que mi original. Puedo publicar un extracto de mi script real si eso ayuda, pero implica varios bucles y comandos de Exchange, así que creo que solo causaría confusión. – Gary

+0

@ Fantabulum: Creo que @manojlds es el camino correcto a seguir. –

0

que tenía la misma Problema y acaba de descubrir cómo resolverlo. La solución es usar invoke-Expression: invoke-Expression $ mycmd Esto usa $ mycmd-string, reemplaza variables y lo ejecuta como cmdlet con los parámetros dados

Cuestiones relacionadas