2011-05-10 6 views
9

J'essaie d'utiliser une variable comme paramètre d'une commande, mais je n'arrive pas à la comprendre. Supposons que MyCommand accepte deux paramètres: option1 et option2 et accepte les valeurs booléennes. Comment utiliser $ newVar pour remplacer l'option 1 ou 2? Par exemple:Comment utiliser une variable PowerShell comme paramètre de commande?

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

Je continue à obtenir quelque chose le long des lignes de « Un paramètre de position ne peut pas être trouvé qui accepte l'argument « -System.String option1 ».


Plus précisément:
Ici, le fichier CSV est une sortie d'une autre politique. La boucle passe par chaque propriété dans le fichier et définit cette valeur dans ma politique asdf; donc -$_.name:$_.value devrait remplacer comme -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

Vous voulez dire 'newVar' mais incorrectement mis dans' myVar'? – manojlds

+0

C'est exact, merci. – Gary

Répondre

19

En règle générale à utiliser une variable pour remplir les paramètres de l'applet de commande, vous utiliseriez une variable de table de hachage, et splat, en utilisant @

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

exemple Ajouté:

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

Set-ActiveSyncMailboxPolicy @AS_policy1 
+0

Merci pour l'aide, mais cela renvoie une erreur "Impossible de trouver un paramètre positionnel qui accepte l'argument" System.Collections.Hashtable ".En particulier, j'ai une boucle pour obtenir les propriétés d'un Csv et les exécuter dans Set-ActiveSyncMailboxPolicy. une instance spécifique je vais dire $ _. name = "AllowBluetooth" et $ _. value = $ true (j'ai écrit ces variables pour confirmer les valeurs correctes, mais je ne peux pas tout mettre ensemble 'Set-ActiveSyncMailboxPolicy - Identité "asdf" @ {$ _. Name = $ _. Value} 'ou' - $ _. Name: $ _. Value'. Cela prend $ _. Value juste bien – Gary

+0

Voir edit Si vous splatez les paramètres , vous devriez tous les inclure dans la hashtable. – mjolinor

2

Voir si cela fonctionne pour vous:

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

Merci manojlds, cela m'a un peu rapproché. Littéralement, $ newVar est $ _. Name et $ true est $ _. Value (ce qui équivaut à "Allow"). De la façon dont je le faisais, il acceptait $ _. Value pour la valeur mais pas $ _. Name comme paramètre. L'utilisation de votre méthode accepte $ _. Name comme paramètre mais pas $ _. Value comme valeur ... Saying ne peut pas convertir la valeur "System.String" en type [type]. Je vais continuer à essayer d'autres choses. – Gary

+0

J'ai votre méthode pour fonctionner quand - $ ($ newVar) veut une chaîne, mais elle échoue sur les valeurs booléennes parce qu'elle pense que c'est une chaîne. Je crois que c'est parce que tout le commandement est entre guillemets. Des pointeurs? – Gary

+0

@Fantabulum: 'iex" MyCommand - $ ($ _. Name): $ ($ _. Value) "' devrait fonctionner alors, pour la raison que j'ai expliqué dans ma réponse. +1 @manojlds. –

1

Je voudrais essayer avec:

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

résultat

Ne peut pas travailler parce que l'opérateur esperluette juste exécuter des commandes uniques sans paramètres, ou blocs de script.

+0

Merci pour la suggestion empo, mais cela semble se comporter de la même manière que mon original. Je peux poster un extrait de mon script actuel si cela peut aider, mais cela implique plusieurs boucles et commandes Exchange, donc je pense que cela ne ferait que créer de la confusion. – Gary

+0

@Fantabulum: Je pense que @manojlds est la bonne solution. –

0

J'ai eu le même Problème et juste trouvé comment le résoudre. La solution est d'utiliser invoke-Expression: invoke-Expression $ mycmd Ceci utilise la chaîne $ mycmd, remplace les variables et l'exécute comme applet de commande avec des paramètres donnés

Questions connexes