Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

durée entre "net stop spooler" et "net start spooler"

8 réponses
Avatar
Jean-Claude
Bonjour,

sous Windows XP, j'ai un script qui permet d'installer des imprimantes, il
fonctionne bien, mais utilise des "sleep" de plusieurs secondes entre les
"net stop spooler" et "net start spooler".
Est-ce nécessaire ? Quand la commande "net stop spooler" se termine, est-il
nécessaire d'attendr avant de réactiver le spouleur ?
Si je les supprime ou les réduis, je crains qu'un jour l'installation ne se
passe pas bien, et de ne pas m'en apercevoir.

Exemple :

' Ajout des Drivers
Set sh = CreateObject("Wscript.Shell")
Set driver = CreateObject("Driver.Driver.1")
Set master = CreateObject("PrintMaster.PrintMaster.1")
...
master.DriverAdd driver

sh.Run "net stop spooler /Y",0,TRUE
WScript.Sleep 10000
sh.Run "net start spooler",0,TRUE
WScript.Sleep 10000

' Ajout de l'imprimante
Set printer = CreateObject("Printer.Printer.1")
...
master.PrinterAdd printer

sh.Run "net stop spooler /Y",0,TRUE
WScript.Sleep 10000
sh.Run "net start spooler",0,TRUE
WScript.Sleep 10000
...


Merci bien.
Jean-Claude

8 réponses

Avatar
Gloops
Jean-Claude a écrit, le 06/10/2011 20:02 :
Bonjour,

sous Windows XP, j'ai un script qui permet d'installer des imprimantes, il
fonctionne bien, mais utilise des "sleep" de plusieurs secondes entre l es
"net stop spooler" et "net start spooler".
Est-ce nécessaire ? Quand la commande "net stop spooler" se termine, est-il
nécessaire d'attendr avant de réactiver le spouleur ?
Si je les supprime ou les réduis, je crains qu'un jour l'installation ne se
passe pas bien, et de ne pas m'en apercevoir.

Exemple :

' Ajout des Drivers
Set sh = CreateObject("Wscript.Shell")
Set driver = CreateObject("Driver.Driver.1")
Set master = CreateObject("PrintMaster.PrintMaster.1")
...
master.DriverAdd driver

sh.Run "net stop spooler /Y",0,TRUE
WScript.Sleep 10000
sh.Run "net start spooler",0,TRUE
WScript.Sleep 10000

' Ajout de l'imprimante
Set printer = CreateObject("Printer.Printer.1")
...
master.PrinterAdd printer

sh.Run "net stop spooler /Y",0,TRUE
WScript.Sleep 10000
sh.Run "net start spooler",0,TRUE
WScript.Sleep 10000
...


Merci bien.
Jean-Claude





Bonjour,

Fais ça dans une fenêtre de ligne de commandes : tu vas bien
t'apercevoir qu'il faut un peu de temps pour que la commande s'exécute.

Si tu lances la commande de démarrage alors que la commande d'arrêt n 'a
pas fini de s'exécuter, elle risque tout simplement d'être ignorée.

Je ne saurais pas te dire si en script on peut ajuster le délai. Avec l a
plateforme .Net on a un objet ServiceController qui permet une maîtrise
un peu plus fine, et si un jour le service met un peu plus de temps à
répondre (fragmentation, encombrement mémoire ...), le programme
attendra un peu plus, au contraire si ça répond tout de suite on
n'attend pas.

En C# ça peut ressembler à ça :

if (serviceController1.Status ==
System.ServiceProcess.ServiceControllerStatus.Running)
{
label2.Text = "---";
this.Refresh();
serviceController1.Stop();
}
serviceController1.Refresh();
label2.Text = serviceController1.Status.ToString();
this.Refresh();
while (serviceController1.Status !=
System.ServiceProcess.ServiceControllerStatus.Stopped)
{
this.Refresh();
serviceController1.Refresh();
}
serviceController1.Refresh();

label2.Text = serviceController1.Status.ToString();
this.Refresh();
Avatar
Jean-Claude
Merci de la réponse.
Mais les commandes d'arrêt et de redémarrage s'exécute en séquence, pas en
simultané.
Il me semble donc que quand "net stop spooler" est fini (donc rend la main),
c'est que le spooler est bien arrêté et que cette commande est finie.
C'est le sens de ma question : est-ce bien le cas ?

Jean-Claude
Avatar
Sergio
Le 08/10/2011 18:03, Jean-Claude a écrit :
Merci de la réponse.
Mais les commandes d'arrêt et de redémarrage s'exécute en séquence, pas en
simultané.
Il me semble donc que quand "net stop spooler" est fini (donc rend la main),
c'est que le spooler est bien arrêté et que cette commande est finie.
C'est le sens de ma question : est-ce bien le cas ?



Oui mais...

Si tu les lances dans un .BAT :
@echo off
net stop spooler /Y
net start spooler

C'est exécuté en séquence. Rien à dire.
Mais par vbscript :
sh.Run "net stop spooler /Y",0,TRUE
WScript.Sleep 10000
sh.Run "net start spooler",0,TRUE

Il est possible qu'ils soient lancés dans des threads différents. Je ne connais pas assez vbscript pour l'affirmer, mais c'est une
piste...

--
Serge http://leserged.online.fr/
Mon blog: http://cahierdesergio.free.fr/
Soutenez le libre: http://www.framasoft.org
Avatar
JP
Il est possible qu'ils soient lancés dans des threads différents. Je ne
connais pas assez vbscript pour l'affirmer, mais c'est une


piste...

Comme tu a création d'un objet Shell, oui, normalement l'option true permet
d'attendre la fin de l'exécution du machin appelé mais amha le fait
d'arrêter un service provoque une cascade d'événements dans les reste de
Windows, et il ne me parais pas illogique d'attendre un peu, par contre 10
secondes me parait un peu exagéré.

http://msdn.microsoft.com/en-us/library/d5fk67ky%28v=VS.85%29.aspx
Avatar
Th.A.C
Le 08/10/2011 18:03, Jean-Claude a écrit :

simultané.
Il me semble donc que quand "net stop spooler" est fini (donc rend la main),
c'est que le spooler est bien arrêté et que cette commande est finie.
C'est le sens de ma question : est-ce bien le cas ?



en théorie oui, mais j'ai de nombreux scripts batchs ou j'ai du rajouter
une petite pause après le 'net stop ...' parce que justement le service
n'avait pas tout à fait fini son arrêt (il y avait encore des fichiers
ouverts).
Le problème est qu'on n'est pas sur qu'une petite pause soit suffisante,
donc il vaut mieux une pause un peu exagérée que trop courte...

Dans un script en vbscript de JCB, j'avais vu un test supplémentaire qui
semblai être destiné à bien vérifier que le service était arrêté.
De mémoire, c'était dans son script de nettoyage de Windows Update pour XP.
Avatar
Th.A.C
je n'ai pas retrouvé le script, mais regarde ca et fait quelques tests:

http://www.commentcamarche.net/forum/affich-6876513-vbscript-verifier-si-1-service-est-stop-start

-------------------------------
Christounet 13 juin 2008 à 15:19
Bonjour,

Il existe un variable appelée State qui indique l'état d'un service,
dont tu pourrais utiliser le code suivant

If (objService.State <> 'Running')
then
Reponse = objService.StartService()
end if



Les différentes valeurs de la variable State sont les suivantes:

Stopped
Start Pending
Stop Pending
Running
Continue Pending
Pause Pending
Paused
Unknown
-------------------------------
Avatar
Jean-Claude BELLAMY
Le dimanche 09/10/2011 15:26:19, Th.A.C a écrit dans le message
<news:4e91a104$0$32013$ ce qui suit :
Le 08/10/2011 18:03, Jean-Claude a écrit :

simultané.
Il me semble donc que quand "net stop spooler" est fini (donc rend la
main),
c'est que le spooler est bien arrêté et que cette commande est finie.
C'est le sens de ma question : est-ce bien le cas ?



en théorie oui, mais j'ai de nombreux scripts batchs ou j'ai du rajouter une
petite pause après le 'net stop ...' parce que justement le service n'avait
pas tout à fait fini son arrêt (il y avait encore des fichiers ouverts).
Le problème est qu'on n'est pas sur qu'une petite pause soit suffisante, donc
il vaut mieux une pause un peu exagérée que trop courte...

Dans un script en vbscript de JCB, j'avais vu un test supplémentaire qui
semblai être destiné à bien vérifier que le service était arrêté.
De mémoire, c'était dans son script de nettoyage de Windows Update pour XP.



Exact! (il y en a qui suivent!!! ;-))

c'est dans mon script "clearSD.vbs", qui sert à vider le dossier
"SoftwareDistribution"

Comme je fais directement appel dans le script à WMi et à la classe
"Win32_service", j'ai un fonctionnement SYNCHRONE.

Voici la partie du code intéressante :
(nb: afin de ne pas surcharger ce message, j'ai viré les tests
d'erreur)

-------- couper ici --------

Set net = Wscript.CreateObject("WScript.Network")
Set objLocator = CreateObject("WbemScripting.SWbemLocator")
Remote=ucase(net.ComputerName)
NameSpace="rootCIMV2"
Set ObjService = objLocator.ConnectServer(Remote, NameSpace, "", "")
ObjService.Security_.impersonationlevel = 3

' Accès à la classe "Win32_service"
Set ServiceSet=ObjService.ExecQuery("SELECT * FROM Win32_service")

' Accès ici au service Windows Update ("wuauserv")
Svcname="wuauserv"
for each Service in ServiceSet
' *** Arrêt du service Windows Update (wuauserv) s'il est démarré***
If lcase(Service.Name)=Svcname Then
DN=Service.DisplayName
If Service.started then
coderet=Service.StopService
If coderet=0 Then
msg= "Le service " & DN & " a été arrêté correctement" & VBCRLF
Else
msg= "Erreur à l'arrêt du service " & DN
msg=msg & VBCRLF & MsgFromCode(coderet)
msg=msg & VBCRLF & "Script abandonné"
End If
Wscript.echo msg
If coderet<>0 Then Wscript.quit
end if

' traitement pendant l'arrêt du service
' ...
' ...
'
' Redémarrage du service
Service.StartService
If coderet=0 Then
msg= "Le service " & DN & " a redémarré correctement."
else
msg= "Erreur au redémarrage du service " & DN
msg=msg & VBCRLF & MsgFromCode(coderet)
end if
wscript.echo VBCRLF & msg
exit for
end if
next
Wscript.quit

-------- couper ici --------


Si on veut faire la même chose avec le service "Spouleur d’impression",
il suffit de remplacer la ligne
Svcname="wuauserv"
par
Svcname="spooler"

("Spooler" est le nom court de "Spouleur d’impression")


NB: ce script doit être exécuté en tant qu'administrateur.

--

May the Force be with You!
La Connaissance s'accroît quand on la partage
----------------------------------------------------------
Jean-Claude BELLAMY [MVP Expert IT Pro]
http://www.bellamyjc.org ou http://jc.bellamy.free.fr
Avatar
Jean-Claude
Un merci un peu tardif...
Jean-Claude