PSExec complète jamais quand courir à l'intérieur démarrage travail
-
01-10-2019 - |
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).
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
$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
}