(Изготовление некоторые предположения, где детали отсутствуют на вопрос)
В ЦМД, когда пакетный скрипт изменяет среду, поведение по умолчанию заключается в том, что оно изменяет среду процесса CMD, выполняющего его.
Теперь, если у вас есть пакетный скрипт, который вызывает другой пакетный скрипт, есть 3 способа сделать это.
выполнить пакетный файл напрямую:
REM call q.bat
q.bat
REM this line never runs
Обычно вы не хотите этого, потому что он не вернется в вызывающем пакетного сценария. Это больше похоже на goto
, чем gosub
. Процесс CMD просто переключается с одного сценария на другой.
выполнить с call
:
REM call q.bat
CALL q.bat
REM changes that q.bat affects will appear here.
Это наиболее распространенный способ для одного пакетного файла вызвать другой. Когда q.bat
выйдет, управление вернется к вызывающему абоненту. Поскольку это тот же CMD-процесс, изменения в среде все равно будут.
Примечание: Если q.bat
использует оператор EXIT
, это может привести к завершению процесса CMD, не возвращая управление вызывающему скрипту.
Примечание 2: Если q.bat
использует EXIT /B
, то процесс CMD не будет завершен. Это полезно для установки ERRORLEVEL
.
Выполнить в новом процессе CMD:.
REM call q.bat
CMD /C q.bat
REM environment changes in q.bat don't affect me
Поскольку q.bat запуск INS нового процесса CMD, это влияет на окружающую среду этого процесса, а не CMD, что абонент работает в
Примечания : Если q.bat
использует EXIT
, он не завершит процесс вызова.
SETLOCAL
команда CMD создаст новую среду для текущего сценария. Изменения в этой среде не повлияют на вызывающего абонента. В целом, SETLOCAL
является хорошей практикой, чтобы избежать случайных изменений окружающей среды.
Чтобы использовать SETLOCAL
и еще толкать изменения окружающей среды в сценарий вызова, завершение сценария с:
ENDLOCAL && SET X=%X% && SET Y=%Y%
это будет толкать значения X и Y в родительской среде.
Если с другой стороны, вы хотите, чтобы запустить другой процесс (не сценарий CMD) и он влияет на окружающую среду текущего сценария, чем у инструмента генерировать пакетный файл, который делает необходимые изменения, а затем выполнить этот пакетный файл.
REM q.exe will write %TEMP%\runme.cmd, which looks like:
REM set X=Y
q.exe
call "%TEMP%\runme.cmd"
Пожалуйста, укажите, какую оболочку вы используете. CMD - это мое лучшее предположение, но, возможно, вы имеете в виду PowerShell или порт Windows CSH. –