2010-08-16 19 views
0

Je suis en train d'écrire un script Powershell qui prendra une liste de commandes puis les exécuter sur une machine distante, j'ai le code suivant:Liste des processus de commandes sur la machine distante avec Invoke-Command

foreach($command in $commands) 
{ 
    Invoke-Command -computer "BNEBAK" -scriptblock{"$command"} 
} 

Ce qui ne génère aucune erreur mais n'exécute pas la commande (par exemple stop-service servicename). $ commands est lu à partir d'un fichier texte passé en argument lors de l'appel du script, je sais que le reste de ce script fonctionne parce que je l'utilise pour faire des commandes locales avec Invoke-Expression depuis un certain temps.

Toute aide serait fantastique.

+0

Ok j'ai trouvé le problème sur celui-ci, il doit faire avec une portée variable, la bonne façon de contourner cela est de construire un scriptblock séparément, puis le transmettre à la Invoke-Command cmdlet comme ceci: pour (commande $ dans les commandes $) { $ scriptblock = $ ExecutionContext.InvokeCommand.NewScriptBlock (commande $) Invoke-Command -ordinateur $ ordinateur -scriptblock $ scriptblock } – bEUY

Répondre

3

Le code correct serait

$commands = @(get-content com.txt) 
for($command in $commands) { 
    $scriptblock = $ExecutionContext.InvokeCommand.NewScriptBlock($command) 
    Invoke-Command -computer $computer -scriptblock $scriptblock 
} 
+0

La raison pour cela, un scriptblock {"$ Command"} sera évalué à l'exécution temps, ce qui signifie qu'il sera sur la machine de destination et $ Command n'existera pas. – JasonMArcher