2010-10-22 4 views
1

Je dois effectuer une série de tâches sur plusieurs serveurs Windows 2008 qui nécessitent des permissions élevées et j'ai donc dû créer une série de tâches planifiées Je cours par l'intermédiaire de psexec. Comme ils doivent fonctionner en séquence, j'ai trouvé et modifié un script PowerShell qui «stagne» jusqu'à ce que les tâches planifiées soient terminées sur des machines distantes. Le problème que j'ai est que quand je lance le script avec psexec sur la machine distante, une fois qu'il est en cours d'exécution (indiqué par un message dans la sortie de la console) PowerShell.exe ne quitte pas proprement, mais se bloque et tient l'ensemble processus. J'ai besoin de PowerShell pour quitter après que le script de délai se termine, mais même avec un mot-clé exit à la fin, il reste en mémoire et empêche le processus de finir. Je ne suis pas terriblement expérimenté avec Powershell donc je vais joindre mon script au cas où je fais quelque chose de fou dans ce:Le script PowerShell de Windows déclenché par PSExec ne tue pas le processus Powershell quand il a fini d'exécuter

while($true) { 
$status = schtasks /query /tn "AutoDeploy"| select-string -patt "AutoDeploy" 
if($status.tostring().substring(64,7) -eq "Running") { "Waiting for task to complete..." } else { break } 
start-sleep -s 5 
} 
"Task complete." 
exit 

Merci d'avance pour toute perspicacité.

Répondre

1

Cela fonctionne pour moi (en utilisant un nom de tâche différente) et ne se bloque pas psexec:

$taskName = "AutoDeploy" 
while (1) 
{ 
    $stat = schtasks /query /tn $taskName | 
       Select-String "$taskName.*?\s(\w+)\s*$" | 
       Foreach {$_.Matches[0].Groups[1].value} 
    if ($stat -ne 'Running') 
    { 
     "Task completed" 
     break 
    } 
    "Waiting for task to complete" 
    Start-Sleep 5 
} 
+0

Bien que cela ne corrige pas mon problème particulier, il est une solution beaucoup plus élégante et je mis en œuvre en place à moi. –

+0

J'ai eu quelques problèmes pour exécuter certains scripts PowerShell sur SSH, où PowerShell se bloquerait après avoir terminé la dernière commande (mais seulement avec certains scripts). J'ai travaillé autour du problème en accrochant stdin de powershell.exe à nul. Donc quelque chose attendait sur stdin, mais je ne sais pas quoi. – JasonMArcher

+0

Comme l'exécution à distance de powershell était dans le contexte de notre réseau et que je pouvais interroger l'état de la tâche planifiée à distance, j'ai découvert que l'exécution du script localement plutôt que via psexec aboutissait à une sortie beaucoup plus cohérente et fiable. Cela fonctionnait mieux, donc je suppose que psexec attendait quelque chose. –

Questions connexes