Após alguns testes, confirmei que você pode substituir variáveis de ambiente do Windows em um prompt de comando, e seus valores serão herdados por outros processos que são lançados posteriormente a partir desse mesmo prompt de comando. Como tal, temos o seguinte arquivo em lotes:
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"
Cada prompt de comando recebe sua própria cópia das variáveis de ambiente do Windows quando aberto pela primeira vez, e esses valores podem ser alterados isoladamente de qualquer outro prompt de comando. Outro processo não é afetado por nenhuma dessas mudanças.
Por outro lado, alterações permanentes em variáveis de ambiente podem ser feitas com setx .