После небольшого тестирования я смог подтвердить, что вы можете переопределить переменные среды Windows в командной строке, и их значения будут наследоваться другими процессами, которые впоследствии запускаются из той же командной строки. Таким образом, у нас есть следующий пакетный файл:
REM -- Path to the directory of this script (make sure to remove ending slash) set CURRENT_DIR=%~dp0 REM -- Great example from Strawberry Perl's portable shell launcher: if not "" == "%CURRENT_DIR%" if #%CURRENT_DIR:~-1%# == #\# set CURRENT_DIR=%CURRENT_DIR:~0,-1% REM -- OVERRIDE the user environment variable to point to a portable directory set USERPROFILE=%CURRENT_DIR%\Data REM -- (Optional) Some programs do not use these environment variables ::set APPDATA=%CURRENT_DIR%\Data\AppData\Roaming>nul ::set ALLUSERSPROFILE=%CURRENT_DIR%\Data\AppData\Roaming>nul ::set PROGRAMDATA=%CURRENT_DIR%\Data\AppData\Roaming>nul REM -- Start the application start "" /D"%CURRENT_DIR%\MyAppDir" "myprogram.exe" "param 1" param_2 "param 3"
Каждая командная строка получает свою собственную копию переменных среды Windows при первом открытии, и эти значения могут быть изменены отдельно от любых других командных приглашений. Другие процессы не зависят от этих изменений.
С другой стороны, постоянные изменения переменных среды могут быть сделаны с помощью setx .