Batch start n'attend pas la fin d'installation

Résolu/Fermé
adgm1 Messages postés 289 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 1 décembre 2024 - 28 nov. 2021 à 22:26
brucine Messages postés 18277 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 16 décembre 2024 - 20 juin 2022 à 12:09
bonjour
j'ai des commandes a lancer en batch, la première est le lancement d'un exécutable pour installer un logiciel puis d'autres commandes servent à bloquer le parefeu et copier des fichiers.
Mon pb c'est que je dois mettre un timeout sinon le batch exécute tout de suite les autres commande sans attendre la fin de l'installation du logiciel. Or selon le pc le timeout peut etre plus ou moins précis, dès fois le pc est plus lent que prévu pour installer et donc les commandes suivantes se lance trop tot. Comment forcer l'attente après la commande start?

start V:\softwares\Prog.exe
timeout /t 260
netsh advfirewall firewall add rule name="Prog" program="C:\Program Files\Prog.exe" dir=out action=block profile=any
xcopy /s "\\serv\wpkg\softwares\Xx.ini" "%programfiles%\Prog\" /Y
A voir également:

8 réponses

barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024 4 918
Modifié le 28 nov. 2021 à 22:29
Bonjour,

Essaie de remplacer la commande START par la commande CALL

Ou bien tu peux rajouter le commutateur /WAIT à la commande START.


0
adgm1 Messages postés 289 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 1 décembre 2024 10
29 nov. 2021 à 00:30
le call à bien fonctionné
merci !
0
adgm1 Messages postés 289 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 1 décembre 2024 10
6 juin 2022 à 15:58
bonjour. Je reviens sur mon post car je vois un nouveau pb lorsque je désinstalle un prog avec la commande wmic product where name ="<PROGRAM NAME HERE>" call uninstall /nointeractive

le call fonctionne bien si je veux lancer un prog .exe par exemple puis lancer d'autres commande ensuite, cela attend bien la fin de la première pour déclencher l'autre.

Mais avec wmic rien à faire je suis obligé de mettre un délai avec timeout /t avant le call sinon il lance tout de suite le .bat suivant. aucun pb entre 2 commande wmic, ça attend bien.

voici mon batch ;

wmic product where "name like 'application1'" call uninstall /nointeractive

wmic product where "name like 'application2'" call uninstall /nointeractive

timeout /t 300

call C:\install_app3.bat



une idée?
0
brucine Messages postés 18277 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 16 décembre 2024 2 702
6 juin 2022 à 18:22
Bonjour,

en attendant que barnabe qui est plus compétent que moi en la matière passe par là, quelques commentaires.

Si la commande call ne fonctionne pas comme souhaité à l'intérieur de wmic, on peut comme suggéré utiliser
START /WAIT mais le comportement souhaité repose sur CMD /C, autrement dit en appelant un batch secondaire pour chaque commande wmic:

https://ss64.com/nt/start.html

On peut aussi tenter de piper la sortie wmic, reposant sur la lecture de ses Exit Codes, je n'y crois pas trop, avec quelque chose du style, mais bon:


wmic product where "name like 'application1'" call uninstall /nointeractive && wmic product where "name like 'application2'" call uninstall /nointeractive && call :INSTALL

:INSTALL
C:\install_app3.bat


Après, et hors PowerShell plus tolérant à cet égard, ça devient plus compliqué.

Nous avons ici la solution avec START /WAIT, une autre en bouclant un test SLEEP en fonction de ERRORLEVEL du nom de processus de désinstallation (à identifier dans le gestionnaire des tâches) correspondant à la commande à terminer (ie, pour qu'elle le soit, il faut qu'il vaille 1):

https://superuser.com/questions/1152521/how-do-i-make-a-batch-file-that-started-a-process-to-wait-for-the-process-to-ter

La même chose doit pouvoir s'obtenir en testant après les 2 commandes wmic réelles 2 autres testant l'existence du ProcessID du processus de désinstallation; ce n'est pas très simple puisque ce PID numérique doit être obtenu à partir du nom du processus:
https://www.developpez.net/forums/d1669516/general-developpement/programmation-systeme/windows/scripts-batch/recuperer-pid-d-processus-variable/
puis vérifier ci ce processus est encore actif:
https://stackoverflow.com/questions/34590331/how-to-get-process-id-of-a-specific-process-using-wmic-and-check-on-error

Les autres solutions passent aussi par tester si la tâche ou le processus lancé par la commande wmic est encore actif:

Voir ici en 26, 2 et 1: https://stackoverflow.com/questions/8177695/how-to-wait-for-a-process-to-terminate-to-execute-another-process-in-batch-file

Nous devons à Dave Benham, sorcier incontesté dans le cas de figure, un batch complexe qui teste par bouclage l'existence d'un fichier de verrouillage qui disparaît quand le programme est terminé:

https://www.dostips.com/forum/viewtopic.php?p=18477
0
barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024 4 918
6 juin 2022 à 21:55
Bonjour adgm1, bonjour brucine,

brucine ( qui est aussi compétent que moi :-p ) a fait le tour du sujet et a donné des pistes très intéressantes.

Ayant fait moi-même un test avec la commande wmic product call uninstall pour désinstaller LibreOffice, je trouve étrange que ton script continue sur sa lancée alors que chez moi la commande attend (plusieurs minutes) que la désinstallation soit totalement terminée pour me repasser la main.

Si vraiment tu veux imposer que la commande soit terminée avant de passer à la suite, tu pourrais rajouter quelques lignes comme ceci :

wmic product where "name like 'application1'" call uninstall /nointeractive

wmic product where "name like 'application2'" call uninstall /nointeractive

:temporisation
timeout /t 1 /nobreak
tasklist | findstr /i "wmic.exe" >nul && goto :temporisation

call C:\install_app3.bat 

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
adgm1 Messages postés 289 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 1 décembre 2024 10
7 juin 2022 à 00:46
merci pour vos reponse. C'est un programme office que je veux désinstaller au préalable puis installer ensuite une version office x64. Sans désinstaller la x32 ca me met "nous ne pouvons pas installer la version 64bit car nous avons detecté une version 32bits..."

ca n'a pas fonctionné avec la ligne temporisation, je suppose que le wmic.exe à chercher dans la "tasklist" c'est le programme de désinstallation c'est bien ça? Car ce qui apparait dans le gestionnaire de tache c'est microsoft setup bootstrapper (32bits). Je présume qu'il faut remplacer wmic par ça dans le script pour lui indiquer de temporiser tant que ce bootstrapper est actif pour terminer la désinstallation

la version du script avec le && call :INSTALL n'a pas fonctionné non plus.
0
adgm1 Messages postés 289 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 1 décembre 2024 10
7 juin 2022 à 00:59
BINGO !! ca a marché en modifiant la partie temporisation comme suit :

:temporisation
timeout /t 3 /nobreak
tasklist | findstr /i "Microsoft Setup Bootstrapper (32bits)" >nul && goto :temporisation

j'ai mis 3 seconde de délai pour limiter toutes les lignes qui se superpose. D'ailleurs y a t'il un moyen d'éviter que les lignes s'ajoutent au fur et à mesure que la temporisation agit? en faisant par exemple un truc du type "clear screen" pour que ca ne mette pas des ligne en rallonge dans la fenetre MSDOS comme la désinstallation est assez longue
0
barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024 4 918
Modifié le 7 juin 2022 à 06:37
Bien joué !

Concernant les lignes qui s'ajoutent, tu peux rediriger la sortie de la commande TIMEOUT :
timeout /t 3 /nobreak >nul
0
adgm1 Messages postés 289 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 1 décembre 2024 10
19 juin 2022 à 20:16
j'ai parlé trop vite en fait cela n'a pas fonctionné c'est bizarre le batch continue en boucle a chercher le programme dans taskmanager mais ne parvient ni à le trouver ni à le fermer pour poursuivre. La seule fois où ça a fonctionné j'ai du faire un truc manuellement mais là ça ne fonctionne plus
une idée?
0
barnabe0057 Messages postés 14454 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 30 novembre 2024 4 918
19 juin 2022 à 20:37
il faut que je fasse des tests, il s'agit de quelle version d'Office ? 2013, 2016, 2019, 2021 ?
0
adgm1 Messages postés 289 Date d'inscription jeudi 4 octobre 2007 Statut Membre Dernière intervention 1 décembre 2024 10
20 juin 2022 à 12:02
c'est office 2007. J'ai remarqué aussi qu'à la désinstallation il y a une tache msiexec.exe qui s'execute . J'ai essayé de remplacé bootstrapper par msiexec mais maintenant j'ai un pb de redemarrage du poste dès la fin de la désinstallation de office2007
0
brucine Messages postés 18277 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 16 décembre 2024 2 702
20 juin 2022 à 12:09
Bonjour,

Bootstrapper ne fait que vérifier que msi.exec existe pour poursuivre la désinstallation; dans ces conditions, c'est probablement non pas Bootstrapper qu'il faut temporiser, mais le process suivant correspondant à msi.exec.

Je n'ai pas fait ça depuis un moment, je n'y vois pas de raison mais on sait jamais, je ne sais plus (tester hors le script) si la désinstallation de Office 2007 propose (ou impose) le redémarrage.
0