Supponendo che sia presente un file batch (chiamante) che esegue un altro file batch (chiamato), è necessario utilizzare il comando call
per tornare al chiamante dopo che il destinatario ha terminato l'esecuzione. Ecco un esempio:Perché non c'è bisogno che `call` ritorni dallo script batch chiamato che è coinvolto in una pipe?
caller.bat
:
echo Calling another script...
call callee.bat
echo Returned from callee...
callee.bat
(nella stessa posizione) :
echo Being called from caller...
L'uscita sarà presente (omettendo gli echi di comando) , mostrando che l'esecuzione è tornata come previsto:
Calling another script... Being called from caller... Returned from callee...
Se il comando call
è stato respinto nel chiamante, l'output sarà:
Calling another script... Being called from caller...
Ma non appena il chiamato è coinvolto in un tubo (|
), non vi è alcuna differenza nel fatto che venga utilizzato o meno il comando call
. Per esempio:
caller.bat
(il chiamato rimane invariato) :
echo Calling another script...
break | callee.bat
echo Returned from callee...
l'uscita sarà presente, anche se non c'è alcun comando call
.
Calling another script... Being called from caller... Returned from callee...
Qual è il motivo di questo comportamento, ciò che provoca l'esecuzione per tornare al chiamante qui?
La domanda per me c'è qualche differenza tra 'break | command' e' call command'? Controlla anche questo 'set a = b'; 'set b = c'; 'break | echo %%% a %%%'. E ... l'output è 'c'. In entrambi i casi si crea un nuovo sotto-contesto del cmd. Possono essere alcuni stati del cmd conservati quando si usa 'call'? – npocmaka
Oh. 'REM',' SE' e 'FOR' si comportano in modo diverso quando vengono convogliati e quando vengono richiamati, ma questo è rahter die al parsing. – npocmaka
Hmm ... oltre al trasferimento dati da _STDOUT_ a _STDIN_ di tubi, sembra che non ci sia alcuna differenza; anche 'cmd/C callee.bat' ritorna al chiamante; sì, 'rem',' if' e 'for' sono speciali, perché ricordo che sono riconosciuti prima di altri comandi durante il processo di analisi ... – aschipfl