Diversi modi per chiamare un file batch di Windows da un altro o dal prompt. Quale in questo caso?


92

Un file batch di Windows ( called.bato called.cmd) può essere chiamato da un altro file batch ( caller.bato caller.cmd) o da un prompt cmd.exe interattivo in diversi modi:

  1. chiamata diretta: called.bat
  2. utilizzando il comando di chiamata: call called.bat
  3. utilizzando il comando cmd: cmd /c called.bat
  4. utilizzando il comando di avvio: start called.bat

Sono piuttosto in difficoltà a differenziare il loro utilizzo previsto in base al loro testo di aiuto: quando usare quale? es. perché potrei usare il comando "call" invece della chiamata diretta. Cosa c'è di diverso?

Sono interessato ad alcuni report di riepilogo che analizzano tutte e 4 le possibilità (e altre se mancano) da vari punti di vista: casi d'uso consigliati per i quali sono progettati per adattarsi, generazione del processo, contesto di esecuzione, ambiente, elaborazione del codice di ritorno.

Nota: sto utilizzando Windows XP SP3.

Risposte:


101
  1. Il file batch verrà eseguito dall'istanza corrente di cmd.exe (o da una nuova istanza di cmd.exe se, ad esempio, si fa doppio clic in Esplora risorse).

  2. Come il n. 1, ha effetto solo se utilizzato all'interno di un file batch / cmd. In un file batch, senza "chiamata", il file batch principale termina e il controllo passa al file batch chiamato; with 'call' esegue il file batch figlio e il file batch padre continua con le istruzioni che seguono la chiamata.

  3. Esegue il file batch in una nuova istanza di cmd.exe.

  4. Start eseguirà il file batch in una nuova istanza di cmd.exe in una nuova finestra e il chiamante non attenderà il completamento.


7
Nota per l'opzione 4, il comando di avvio dovrebbe essere sempre seguito da un 'titolo' , quindi se non hai bisogno di un titolo dovresti avere virgolette vuote, ad esempiostart "" [options] command
Daryn

@Daryn quel collegamento menziona semplicemente che dovresti sempre averne uno, ma dice anche che Microsoft descrive il parametro come opzionale. Non riescono a dirmi perché dovrebbe essere "richiesto". Anche molti dei loro esempi in basso omettono il parametro title.
Adam Plocher

5

Una cosa non è chiara dai commenti qui: quando chiami un file batch da un altro usando solo il suo nome (caso # 1 nella domanda originale), l'esecuzione si interrompe dal file batch chiamante. Ad esempio, in queste righe:

called.bat
echo Hello

La riga "echo Hello" (e tutto ciò che la segue) non verrà chiamata. Se utilizzi la parola chiave "call", l'esecuzione riprende dopo la chiamata. Quindi in questo caso:

call called.bat
echo Hello

Verrà chiamata la riga "echo Hello".

Inoltre, anche tutte le variabili impostate nel file named.bat verranno restituite al processo chiamante.

Immagina un file 'called.bat' che avesse questa riga:

set MYVAR=hello

Quindi,% MYVAR% sarebbe disponibile per il file batch chiamante se utilizzato:

call called.bat

Ma non userebbe

REM starts a new cmd.exe process
start called.bat   

REM stops and replaces current cmd.exe process with a new one
called.bat        
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.