(Fare alcune ipotesi in cui i dettagli sono mancanti dalla tua domanda)
In CMD, quando uno script batch modifica l'ambiente, il comportamento predefinito è che modifica l'ambiente del processo CMD che lo sta eseguendo.
Ora, se si dispone di uno script batch che chiama un altro script batch, ci sono 3 modi per farlo.
eseguire il file batch direttamente:
REM call q.bat
q.bat
REM this line never runs
Di solito non si vuole questo, perché non tornerà allo script chiamante batch. Questo è più simile a goto
rispetto a gosub
. Il processo CMD passa semplicemente da uno script all'altro.
eseguire con call
:
REM call q.bat
CALL q.bat
REM changes that q.bat affects will appear here.
Questo è il modo più comune per un file batch per chiamare un altro. Quando si chiude q.bat
, il controllo tornerà al chiamante. Poiché questo è lo stesso processo CMD, le modifiche all'ambiente saranno ancora presenti.
Nota: se q.bat
utilizza l'istruzione EXIT
, può causare la chiusura del processo CMD, senza restituire il controllo allo script chiamante.
Nota 2: Se q.bat
utilizza EXIT /B
, il processo CMD non verrà chiuso. Questo è utile per impostare ERRORLEVEL
.
Esegui in un nuovo processo CMD:.
REM call q.bat
CMD /C q.bat
REM environment changes in q.bat don't affect me
Dal corsa Q.bat ins un nuovo processo CMD, colpisce l'ambiente di quel processo, e non il CMD che il chiamante è in esecuzione in
Nota : Se q.bat
utilizza EXIT
, non interromperà il processo del chiamante.
Il comando CMD SETLOCAL
creerà un nuovo ambiente per lo script corrente. Le modifiche in quell'ambiente non influiranno sul chiamante. In generale, SETLOCAL
è una buona pratica, per evitare perdite di ambiente in caso di incidente.
Per utilizzare SETLOCAL
ed ancora spingere cambiamenti dell'ambiente allo script chiamante, terminare lo script con:
ENDLOCAL && SET X=%X% && SET Y=%Y%
Questo spingerà i valori di X e Y per l'ambiente genitore.
Se d'altra parte si desidera eseguire un altro processo (non uno script CMD) e lo hanno influenzare l'ambiente dello script corrente, piuttosto che avere lo strumento genera un file batch che rende le modifiche desiderate, quindi eseguire quel file batch.
REM q.exe will write %TEMP%\runme.cmd, which looks like:
REM set X=Y
q.exe
call "%TEMP%\runme.cmd"
fonte
2009-07-28 17:59:08
Si prega di essere precisi su quale shell si sta utilizzando. CMD è la mia ipotesi migliore, ma forse intendi PowerShell o una porta Windows di CSH. –