Question

Je suis en train d'exécuter un fichier cmd sur une liste de 48 ordinateurs. Je ne veux pas exécuter et attendre la fin séquentielle parce que chaque cmd prend environ 10 minutes. WinRM est pas une option. Ni est WMI. PSExec une option .... mais je ne peux pas sembler le faire fonctionner à l'intérieur de Start-Job.

Je fais quelque chose comme:

$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
}

Cela crée un tas d'emplois .... mais jamais complète et si je Receive-Job sur l'un d'eux que je revienne

    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

il exécute très bien si je lance la fonction comme:

& $sb -computer "serverw01"

Script Initier est exécuté dans v2.0 Powershell sur le serveur 2008R2 boîte Je l'ai essayé sur une boîte à domain2 lorsque vous êtes connecté avec un administrateur de domaine userid (même résultat).

Était-ce utile?

La solution

Essayez ceci pour la commande psexec, en vous assurant d'inclure « -d » de ne pas attendre la réponse, et de mettre la variable d'ordinateur juste après psexec:

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

Autres conseils

Ce problème de suspension se produit sur les serveurs Win2003 et Win2008.

La plupart des gens résoudre ce problème avec une solution de contournement comme l'écho et la tuyauterie de sorte que Powershell reçoit une entrée de STDIN.

Mais il existe une solution dans Powershell. Il suffit de commencer avec l'option powershell -inputformat aucun comme:

powershell -inputformat none -command ...

S'il vous plaît essayez le paramètre -accepteula à psexec comme

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

de

$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
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top