Comment attendez-vous qu'un exe se termine dans un fichier batch?


43

J'essaie de créer un script pour exécuter un fichier exe à l'arrêt afin d'installer sp1. mon script va quelque chose comme (pas script de batte réelle).

If installed GOTO END
    Install.exe
END:

Mon problème est que, quand il fonctionne, il lance le programme d'installation, puis termine le script car le processus de l'installateur est différent, puis poursuit en arrêtant le processus d'installation car l'ordinateur ferme et ferme le système (du moins, c'est ce que je pense ça fait.)

Y a-t-il un moyen de lui dire d'attendre que le processus qu'il a démarré se termine, puis se ferme?

Réponses:



23

Un moyen plus court:

Install.exe|more

Également

install|rem

pourrait être utilisé, mais avec plus, vous pourrez attraper une sortie de la console. Et c’est la raison pour laquelle cela fonctionne: la commande piped attend l’entrée jusqu’à ce que le fichier .exe soit terminé.


et pourquoi est le downlvote?
npocmaka

C'est excellent! Je te vote.
Changwang Zhang

2
cela gagne clairement
Fnord

Et si l'exe prend des paramètres? comment cela fonctionnerait-il?
m4l490n le

@ m4l490n - cela fonctionnera bien. La redirection et les opérateurs d' exécution conditionnelle ont la plus grande priorité dans les scripts de traitement par lots ( <, >, >>, &, &&, ||, |)
npocmaka

13

Appeler le fichier exe directement à partir du fichier de commandes, ou utiliser start /waitcela fonctionnera, mais il y a une mise en garde.

Si l'exe que vous appelez crée alors un autre processus, tel que l'appel d'un autre exe, puis quitte le fichier de commandes, le traitement du fichier de commandes se poursuivra une fois que l'exe appelé est terminé, car il n'a pas connaissance des autres processus qu'il a démarrés.

Dans votre cas, il s’agit d’un véritable problème, car les installateurs extraient normalement les fichiers à partir d’une forme de conteneur compressé, qui peut être incorporé dans le fichier exe lui-même, puis déclenchent l’un des fichiers extraits et se terminent. Certains installateurs fournissent des paramètres de ligne de commande qui indiquent à l'exe d'origine de ne pas quitter l'ordinateur avant la fin de l'installation complète. Autre que cela, il n'y a pas de véritable solution à ce problème avec les fichiers de commandes seuls et prendrait une solution programmatique à résoudre.


Vous pouvez toujours ajouter une boucle à la routine d'arrêt pour vérifier si msiexec.exe (ou quoi que ce soit d'autre) est en cours d'exécution, puis patientez et bouclez à nouveau.
Mfinni

@mfinni, pour compliquer encore les choses, msiexecdéclenche souvent d'autres processus. :(
John Gardeniers

1
En fait, pourquoi avez-vous besoin start /waitde tout? J'ai moi-même pensé qu'il était nécessaire d'utiliser start /waitpour bloquer les fichiers de commandes jusqu'à la fin de l'application à interface graphique (contrairement à une console). Mais en le testant à présent, je constate que les fichiers de commandes attendent même les applications à interface graphique. J'ai posté la question correspondante: Pourquoi l'application graphique bloque-t-elle un fichier de commandes?
Martin Prikryl

J'ai eu ce problème, ajouté ma solution comme une réponse.
FreeSoftwareServers

5

Voici un exemple d'utilisation de MATLAB! J'ai supposé que la configuration du chemin d'accès pour MATLAB est terminée et que l'exit MATLAB est assuré par le fichier FileName.m (ou l'utilisateur l'a spécifié en interne).

echo off
matlab -nosplash /r "FileName.m"
:loop
tasklist /fi "imagename eq MATLAB.exe" |find ":" > nul
if errorlevel 1 goto loop
exit

2
Assumer Matlab me semble un peu étrange, surtout ici sur serverfault.
Erik

Cela peut fonctionner pour des choses autres que MATLAB. Il suffit de remplacer "MATLAB.exe" par quelque chose d'autre. Et peut-être corrigez-vous cette seconde "recherche" pour rechercher l'exécutable à nouveau dans la sortie filtrée.
Oliver Bock

1

J'avais le problème @John Gardeniers Avait ou avait décrit, où mon exe a appelé un autre exe et s'est terminé, donc début / attente n'a pas fonctionné. J'ai créé une "boucle while" pour vérifier si elle est en cours d'exécution, puis passer à la fin de l'opération. Les temps peuvent être modifiés pour répondre à vos besoins.

TIMEOUT /T 60

SETLOCAL EnableExtensions
set EXE=MYEXETOCHECK.exe
:LOOPSTART
FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF %%x == %EXE% goto FOUND
goto FIN
:FOUND
TIMEOUT /T 30
goto LOOPSTART
:FIN

0

Vous pouvez utiliser la commande start / wait. Cela démarre une application et attend sa fin.

Ou, si vous savez combien de temps cela prend pour s'exécuter, consultez la commande de mise en veille fournie par les outils du Kit de ressources Windows Server 2003 . Sleep.exe peut être utilisé pour mettre en pause votre lot pendant un nombre quelconque de secondes afin de permettre au programme de s'installer complètement avant que le fichier de traitement par lot ne procède à une autre installation. Certains programmes ignorent la syntaxe "start / wait", car le programme lui-même lance un autre processus. Le fichier sleep.exe est donc très utile.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.