Come aspetti che un exe venga completato in un file batch?


43

Sto cercando di creare uno script per eseguire un exe allo spegnimento per installare sp1. la mia sceneggiatura ha qualcosa di simile (non una vera e propria sceneggiatura a pipistrello).

If installed GOTO END
    Install.exe
END:

Il mio problema è che quando viene eseguito, avvia il programma di installazione, quindi termina lo script perché il programma di installazione è un processo diverso e fa seguito chiudendo il processo di installazione perché il computer si sta spegnendo e spegnendo il sistema (almeno, questo è quello che penso sta facendo.)

Esiste un modo per dirgli di attendere fino al completamento del processo avviato e quindi l'arresto?

Risposte:



23

Un modo più breve:

Install.exe|more

Anche

install|rem

potrebbe essere usato, anche se con più alla fine sarai in grado di catturare alcuni output della console. E questo è il motivo per cui funziona: il comando piped attende l'input fino al termine di .exe


e perché è il downlvote?
npocmaka,

Questo è eccellente! Ti voto io.
Changwang Zhang,

2
questo vince chiaramente
Fnord,

cosa succede se l'exe accetta parametri? come funzionerebbe?
m4l490n,

@ m4l490n - funzionerà bene. Gli operatori di reindirizzamento ed esecuzione condizionale hanno la priorità maggiore negli script batch ( <, >, >>, &, &&, ||, |)
npocmaka

13

Chiamare l'exe direttamente dal file batch o usare start /waitfunzionerà ma c'è un avvertimento.

Se l'exe che chiami crea quindi un altro processo, come chiamare un altro exe, quindi esce il file batch continuerà l'elaborazione dopo che l'exe chiamato è terminato, poiché non ha conoscenza di altri processi avviati da esso.

Nel tuo caso questo è un vero problema perché gli installatori normalmente estraggono i file da una qualche forma di contenitore compresso, che può essere incorporato nell'esempio stesso, quindi spegne uno dei file estratti ed esce. Alcuni programmi di installazione forniscono parametri della riga di comando che indicano all'exe originale di non uscire fino al completamento dell'intera installazione, quindi è qualcosa che potresti voler esaminare. A parte questo, non esiste un vero modo per aggirare questo con i soli file batch e richiederebbe una soluzione programmatica per risolvere.


È sempre possibile aggiungere un ciclo alla routine di arresto per verificare se msiexec.exe (o qualunque diavolo sia) sia in esecuzione e quindi attendere e ripetere il ciclo.
mfinni,

@mfinni, solo per complicare ulteriormente le cose, msiexecspesso spegne anche altri processi. :(
John Gardeniers,

1
In realtà, perché ne hai bisogno start /wait? Personalmente credevo che fosse necessario utilizzare start /waitper bloccare il file batch fino al termine dell'applicazione GUI (come opposta a una console). Ma provandolo ora, vedo che i file batch in realtà aspettano anche le applicazioni della GUI. Ho pubblicato la domanda corrispondente: Perché l'applicazione GUI blocca un file batch?
Martin Prikryl,

Ho avuto questo problema, ho aggiunto la mia soluzione come risposta.
FreeSoftwareServers

5

Ecco un esempio usando MATLAB! Ho ipotizzato che l'impostazione del percorso per MATLAB sia stata completata e che l'uscita MATLAB sia garantita dal file FileName.m (o l'utente l'ha specificato internamente).

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

2
Supponendo che Matlab mi sembri un po 'strano, specialmente qui su serverfault.
Erik,

Questo può funzionare per cose diverse da MATLAB. Basta cambiare "MATLAB.exe" in qualcos'altro. E forse correggere quel secondo 'trova' per cercare di nuovo l'exe nell'output filtrato.
Oliver Bock,

1

Ho avuto il problema che John Gardeniers aveva o aveva descritto, in cui il mio exe chiamava un altro exe e terminava, quindi start / wait non funzionava. Ho creato un "ciclo while" per verificare se è in esecuzione e quindi passare una volta terminato. I tempi possono essere modificati in base alle proprie esigenze.

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

È possibile utilizzare il comando start / wait. Questo avvia un'applicazione e attende che finisca.

Oppure, se sai quanto tempo impiega l'esecuzione, puoi dare un'occhiata al comando sleep, fornito dagli strumenti del Resource Kit di Windows Server 2003 . Sleep.exe può essere utilizzato per mettere in pausa il batch per un numero qualsiasi di secondi per consentire al programma di installarsi completamente prima che il file batch continui a installare qualsiasi altra cosa. Ci sono alcuni programmi che ignorano la sintassi "start / wait", a causa del programma stesso che avvia un altro processo, quindi sleep.exe è molto utile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.