Comando CHIAMATA vs. INIZIO con l'opzione / WAIT


149

Come è il comando START con un'opzione WAIT

START /wait notepad.exe 
START /wait  notepad.exe 

... qualcosa di diverso dall'uso di un comando CALL?

CALL notepad.exe 
CALL notepad.exe 

Esiste una situazione in cui uno può comportarsi diversamente che l'altro dipende da ciò che viene eseguito?


Risposte:


183

Per i file exe , suppongo che le differenze siano quasi irrilevanti.
Ma per iniziare un exe non ti serve nemmeno CALL.

Quando si avvia un altro batch è una grande differenza,
poiché CALLlo avvierà nella stessa finestra e il batch chiamato avrà accesso allo stesso contesto variabile.
Quindi può anche cambiare le variabili che influiscono sul chiamante.

STARTcreerà un nuovo cmd.exe per il batch chiamato e senza / b aprirà una nuova finestra.
Trattandosi di un nuovo contesto, le variabili non possono essere condivise.

differenze

Utilizzostart /wait <prog>
: le modifiche alle variabili di ambiente vanno perse al <prog>termine
: il chiamante attende fino al <prog>termine

Usandocall <prog>
- Per exe può essere ommited, perché equivale a solo iniziare <prog>
- Per un exe-prog il batch chiamante attende o avvia l' exe in modo asincrono, ma il comportamento dipende dall'exe stesso.
- Per i file batch , il batch chiamante continua, al termine della chiamata <batch-file>, SENZA chiamata il controllo non tornerà al batch chiamante

Addendum:

L'uso CALLpuò modificare i parametri (per file batch ed exe), ma solo quando contengono punti di inserimento o segni di percentuale.

call myProg param1 param^^2 "param^3" %%path%%

Verrà espanso in (da un file batch)

myProg param1 param2 param^^3 <content of path>

25
Quando si esegue un file.bat utilizzando START / WAIT è necessario specificare START / WAIT cmd / c "file.bat" anziché solo START / WAIT "file.bat", altrimenti la finestra cmd creata per file.bat rimarrà aperta
FrinkTheBrave il

5
Puoi trovare il confronto tra CALL e START su: ss64.com/nt/start.html (aggiornato oggi con le sezioni "Start / Wait" e "START vs CALL")
Alfredo Capobianchi,

Il mio preferito è start /wait /b cmd /c <batchfile.bat>perché i file batch vengono eseguiti uno dopo l'altro nella stessa finestra di comando
linux64kb

@ linux64kb, Ma per i file batch non è necessario, hai solo bisognocall batchfile.bat
jeb

@jeb True. Preferisco questo perché ogni file batch verrà eseguito in un ambiente della shell dei comandi diverso, ereditando le variabili dalla shell chiamante e le modifiche ai valori iniziali andranno perse al termine del batch -> nessuna spazzatura lasciata lì dopo ogni esecuzione consecutiva. Un'altra vittoria è che non devi affrontare il ripristino delle variabili nei tuoi script.
linux64kb,

17

Penso che dovrebbero comportarsi generalmente allo stesso modo, ma ci sono alcune differenze. STARTviene generalmente utilizzato per avviare applicazioni o per avviare l'applicazione predefinita per un determinato tipo di file. In questo modo se START http://mywebsite.comnon lo fai START iexplore.exe http://mywebsite.com.

START myworddoc.docxavvia Microsoft Word e apre myworddoc.docx. CALL myworddoc.docxfa la stessa cosa ... tuttavia STARTfornisce più opzioni per lo stato della finestra e cose del genere. Consente inoltre di impostare la priorità e l'affinità del processo.

In breve, date le opzioni aggiuntive fornite da start, dovrebbe essere il tuo strumento preferito.

START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
  [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
  [/NODE <NUMA node>] [/AFFINITY <hex affinity mask>] [/WAIT] [/B]
  [command/program] [parameters]

"title"     Title to display in window title bar.
path        Starting directory.
B           Start application without creating a new window. The
            application has ^C handling ignored. Unless the application
            enables ^C processing, ^Break is the only way to interrupt
            the application.
I           The new environment will be the original environment passed
            to the cmd.exe and not the current environment.
MIN         Start window minimized.
MAX         Start window maximized.
SEPARATE    Start 16-bit Windows program in separate memory space.
SHARED      Start 16-bit Windows program in shared memory space.
LOW         Start application in the IDLE priority class.
NORMAL      Start application in the NORMAL priority class.
HIGH        Start application in the HIGH priority class.
REALTIME    Start application in the REALTIME priority class.
ABOVENORMAL Start application in the ABOVENORMAL priority class.
BELOWNORMAL Start application in the BELOWNORMAL priority class.
NODE        Specifies the preferred Non-Uniform Memory Architecture (NUMA)
            node as a decimal integer.
AFFINITY    Specifies the processor affinity mask as a hexadecimal number.
            The process is restricted to running on these processors.

            The affinity mask is interpreted differently when /AFFINITY and
            /NODE are combined.  Specify the affinity mask as if the NUMA
            node's processor mask is right shifted to begin at bit zero.
            The process is restricted to running on those processors in
            common between the specified affinity mask and the NUMA node.
            If no processors are in common, the process is restricted to
            running on the specified NUMA node.
WAIT        Start application and wait for it to terminate.


8

Questo è quello che ho trovato durante l'esecuzione di file batch in parallelo (più istanze dello stesso file bat contemporaneamente con parametri di input diversi):

Diciamo che hai un file exe che esegue un'attività lunga chiamata LongRunningTask.exe

Se chiami exe direttamente dal file bat, solo la prima chiamata a LongRunningTask avrà successo, mentre il resto riceverà un errore del sistema operativo "Il file è già in uso dal processo"

Se si utilizza questo comando:

start / B / WAIT "" "LongRunningTask.exe" "parametri"

Sarai in grado di eseguire più istanze di bat ed exe, mentre attendi ancora che l'attività finisca prima che la bat continui ad eseguire i comandi rimanenti. L'opzione / B è per evitare di creare un'altra finestra, le virgolette vuote sono necessarie per il funzionamento del comando, vedere il riferimento di seguito.

Si noti che se non si utilizza / WAIT all'inizio, LongRunningTask verrà eseguito contemporaneamente ai restanti comandi nel file batch, quindi potrebbe creare problemi se uno di questi comandi richiede l'output di LongRunningTask

Ripresa:

Questo non può funzionare in parallelo:

  • chiamare LongRunningTask.exe

Questo funzionerà in parallelo e andrà bene fino a quando non ci saranno dipendenze di dati tra l'output del comando e il resto del file bat:

  • start / B "" "LongRunningTask.exe" "parametri"

Questo verrà eseguito in parallelo e attenderà il completamento dell'attività, quindi è possibile utilizzare l'output:

  • start / B / WAIT "" "LongRunningTask.exe" "parametri"

Riferimento per il comando di avvio: come posso eseguire un programma da un file batch senza lasciare la console aperta dopo l'avvio del programma?


6

Chiamata

Chiama un programma batch da un altro senza arrestare il programma batch padre. Il comando call accetta le etichette come destinazione della chiamata. La chiamata non ha alcun effetto sulla riga di comando se utilizzata al di fuori di uno script o di un file batch. https://technet.microsoft.com/en-us/library/bb490873.aspx

Inizio

Avvia una finestra del prompt dei comandi separata per eseguire un programma o un comando specificato. Utilizzato senza parametri, start apre una seconda finestra del prompt dei comandi. https://technet.microsoft.com/en-us/library/bb491005.aspx


-1

Questo è un vecchio thread, ma ho appena incontrato questa situazione e ho scoperto un modo pulito per aggirare. Stavo cercando di eseguire un setup.exe, ma il focus tornava alla riga successiva dello script senza attendere il completamento di setup.exe. Ho provato le soluzioni di cui sopra senza fortuna.

Alla fine, reindirizzare il comando in più ha fatto il trucco.

setup.exe {argomenti} | Di Più

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.