Два пакетных файла выполняются одним и тем же процессом командного процессора Windows и поэтому совместно используют все переменные среды.
Main.bat:
@echo off
set "MyVariable="
call Function.bat hello
echo MyVariable=%MyVariable%
Function.bat:
@echo off
rem Some code ...
set "MyVariable=%~1"
Возможно, Function.bat
почему-то использует команду SETLOCAL . В этом случае все определенные переменные среды, а также все изменения, внесенные в переменные среды после команды SETLOCAL , теряются после соответствующей ENDLOCAL . Эта команда неявно вызывается командным процессором Windows при выходе из выполнения командного файла для каждого SETLOCAL , еще не завершенного с явным выполнением соответствующего ENDLOCAL . Прочитайте этот ответ для получения подробной информации о командах SETLOCAL и ENDLOCAL .
Необходимо явно установить переменную среды в той же командной строке, что и команда ENDLOCAL с использованием немедленного расширения переменной среды для передачи значения переменной среды из текущего списка переменных среды в предыдущий список переменных среды.
Function.bat:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem Some code ...
set "MyVariable=%~1"
endlocal & set "MyVariable=%MyVariable%"
Последняя командная строка сначала обрабатывается интерпретатором команд Windows до
endlocal & set "MyVariable=hello"
Таким образом, командная строка после предварительной обработки больше не содержит ссылки на переменную. Команда ENDLOCAL восстанавливает предыдущую среду, что приводит к удалению переменной среды MyVariable
. Но вторая команда SET , указанная в той же командной строке, снова устанавливает эту переменную со значением hello
в восстановленной среде.
См. Также Одна строка с несколькими командами с использованием пакетного файла Windows .