2010-07-01 6 views
6

Ich versuche, eine cmd-Datei auf einer Liste von 48 Computern auszuführen. Ich möchte nicht ausführen und warten auf die Fertigstellung der Reihe nach, weil jeder cmd ungefähr 10 Minuten dauert, um abzuschließen. WinRM ist keine Option. WMI ist auch nicht. PSExec ist eine Option .... aber ich kann nicht scheinen es innerhalb von Start-Job arbeiten.PSExec wird nie abgeschlossen, wenn innerhalb von Start-Job ausgeführt

Ich mache so etwas wie:

$sb = { 
    param 
    (
     $computer = "serverw01", 
     $userid = "domain2\serviceid", 
     $password = 'servicepw', 
     $command = "cd /d d:\ && updateAll.cmd" 
    ) 

    d:\eps\pstools\PsExec.exe -u $userid -p $password "\\$($computer)" cmd /c $command 
} 

foreach ($computer in Get-Content "D:\Data\serverlist.txt") { 
    Start-Job $sb -ArgumentList $computer 
} 

Dies ein paar Arbeitsplätze schafft .... aber die nie abgeschlossen, und wenn ich auf einem von ihnen Receive-Job i zurück

PS> get-job | receive-job -Keep 

    + CategoryInfo   : NotSpecified: (:String) [], RemoteException 
    + FullyQualifiedErrorId : NativeCommandError 

PsExec v1.98 - Execute processes remotely 
Copyright (C) 2001-2010 Mark Russinovich 
Sysinternals - www.sysinternals.com 

es führt nur in Ordnung, wenn ich die Funktion wie laufen:

& $sb -computer "serverw01" 

Initiieren Skript ausgeführt wird in Powershell v2.0 auf Ser ver 2008r2 box Ich habe es auf einer Box in Domain2 versucht, während mit einer Domain-Admin-Benutzer-ID (dasselbe Ergebnis) angemeldet.

Antwort

4

dieses Versuchen für den psexec Befehl psexec, um sicherzustellen, Sie sind "-d" nicht auf Antwort zu warten, und den Computer setzen Variable direkt nach psexec:

d:\eps\pstools\psexec "\\$($computer)" /accepteula -u $userid -p $password -d cmd /c $command 
+1

Danke Lizz. Die Antwort scheint die Platzierung des Computerwertes zu sein. Ich habe es mit und ohne -d und/accepteula probiert (ich akzeptiere seit langem eula :)) und der Aktivierungsfaktor stellte sicher, dass der Computername-Wert der erste Wert nach PSEXEC war. –

0

bitte versuchen Sie es den -accepteula Parameter wie

d:\eps\pstools\PsExec.exe -accepteula -u $userid -p $password 

from

+0

Vielen Dank für die Antwort. Hinzufügen -accepteula Ergebnisse in der gleichen Antwort + CategoryInfo: NotSpecified: (: String) [], Remote + FullyQualifiedErrorId: NativeCommandError PsExec v1.98 - Execute Prozesse fern Copyright (C) 2001-2010 Mark Russinovich Sysinternals - www.sysinternals.com –

0
$computerList = Get-Content "D:\Data\serverlist.txt"  
$sb = 
{ 
    param($name) 
     } 
      $computer = $name 
      $userid = "domain2\serviceid" 
      $password = 'servicepw' 
      $command = "cd /d d:\ && updateAll.cmd" 
      d:\eps\pstools\PsExec.exe -u $userid -p $password \\$computer cmd /c $command 
     { 
} 
foreach ($computer in $computerLinst) { 
    Start-Job $sb -ArgumentList $computer 
} 
2

Dieses hängende Problem tritt auf Win2003- und Win2008-Servern auf.

Die meisten Leute lösen dieses Problem mit einer Problemumgehung wie Echo und Piping, so dass Powershell einige Eingaben von STDIN erhält.

Aber es gibt eine Lösung in Powershell. Starten Sie einfach Powershell mit der Option -inputformat keine wie:

powershell -inputformat none -command ...