(Faire quelques suppositions où les détails sont absents de votre question)
Dans CMD, Lorsqu'un script batch modifie l'environnement, le comportement par défaut est qu'il modifie l'environnement du processus CMD qui l'exécute. Maintenant, si vous avez un script de traitement par lots qui appelle un autre script de traitement par lots, il y a 3 façons de le faire.
exécuter le fichier batch directement:
REM call q.bat
q.bat
REM this line never runs
Habituellement vous ne voulez pas, car il ne reviendra pas au script batch d'appel. C'est plus comme goto
que gosub
. Le processus CMD passe juste d'un script à l'autre.
avec execute call
:
REM call q.bat
CALL q.bat
REM changes that q.bat affects will appear here.
C'est la façon la plus courante pour un fichier batch pour appeler un autre. Lorsque q.bat
se termine, le contrôle revient à l'appelant. Comme il s'agit du même processus CMD, les modifications apportées à l'environnement seront toujours présentes.
Remarque: Si q.bat
utilise l'instruction EXIT
, le processus CMD peut s'arrêter, sans que le contrôle du script appelant ne soit renvoyé.
Remarque 2: Si q.bat
utilise EXIT /B
, le processus CMD ne se terminera pas. Ceci est utile pour définir ERRORLEVEL
.
Exécuter dans un nouveau processus CMD.
REM call q.bat
CMD /C q.bat
REM environment changes in q.bat don't affect me
Depuis run q.bat ins un nouveau processus CMD, il affecte l'environnement de ce processus, et non le CMD que l'appelant est en cours d'exécution dans
Remarque : Si q.bat
utilise EXIT
, il ne mettra pas fin au processus de l'appelant.
La SETLOCAL
commande CMD va créer un nouvel environnement pour le script en cours. Les modifications dans cet environnement n'affecteront pas l'appelant. En général, SETLOCAL
est une bonne pratique, pour éviter les fuites d'environnement par accident.
Pour utiliser SETLOCAL
et encore pousser des changements d'environnement au script appelant, mettre fin au script avec:
ENDLOCAL && SET X=%X% && SET Y=%Y%
Cela va pousser les valeurs de X et Y à l'environnement parent.
Si d'autre part vous voulez exécuter un autre processus (pas un script CMD) et avoir une incidence sur l'environnement du script actuel, que d'avoir l'outil génère un fichier de commandes qui rend les changements que vous voulez, puis exécutez ce fichier batch.
REM q.exe will write %TEMP%\runme.cmd, which looks like:
REM set X=Y
q.exe
call "%TEMP%\runme.cmd"
Veuillez préciser la coque que vous utilisez. CMD est ma meilleure estimation, mais peut-être que vous voulez dire PowerShell ou un port Windows de CSH. –