运行 bat 文件设置 exe 的环境变量
Run bat file setting env vars for exe
我正在尝试使用 'SET' 设置一些环境变量,以便它们在本地设置而不是在系统级别设置,这在使用 SETX 时会发生。但是变量似乎没有传递到正在执行的最终命令 (.exe) 我如何设置本地 env 变量并将修改后的 env 传递到 exe?
@echo off
setlocal
:: Assign all Path variables
SET STARTUP="%~dp0startup"
set ADSK_3DSMAX_STARTUPSCRIPTS_ADDON_DIR=%STARTUP%
echo ADSK_3DSMAX_STARTUPSCRIPTS_ADDON_DIR %STARTUP%
start /d "%PROGRAMW6432%\Autodeskds Max 2022\" 3dsmax.exe /i
endlocal
exit
解决方案可能是首先使用 set 在批处理文件中设置环境变量,然后直接 运行 可执行文件(无需启动)。如果有效,请告诉我!
使用 set "var1=data"
设置字符串值 - 这避免了尾随空格引起的问题。
如果你使用你的语法,你执行
set ADSK_3DSMAX_STARTUPSCRIPTS_ADDON_DIR=""%~dp0startup""
这可能不是您所期望的。
以下批处理文件适用于任何用例:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem Assign all directory path variables
set "STARTUP=%~dp0startup"
set "ADSK_3DSMAX_STARTUPSCRIPTS_ADDON_DIR=%STARTUP%"
if not exist "%ProgramFiles%\Autodeskds Max 2022dsmax.exe" goto Progx86
start "" /D "%ProgramFiles%\Autodeskds Max 2022" 3dsmax.exe /i
exit /B
:Progx86
if not exist "%ProgramFiles(x86)%\Autodeskds Max 2022dsmax.exe" goto DisplayError
start "" /D "%ProgramFiles(x86)%\Autodeskds Max 2022" 3dsmax.exe /i
exit /B
:DisplayError
echo ERROR: Failed to find: "Autodeskds Max 2022dsmax.exe"
echo/
pause
endlocal
第二行使用 setlocal
和选项 EnableExtensions
和 DisableDelayedExpansion
的原因在第 问题 6:批处理文件取决于定义的环境.
之外
我在 Why is no string output with 'echo %var%' after using 'set var = text' on command line?
上的回答详细描述了使用语法定义环境变量的原因
这些更改的组合产生了一个工作批处理文件,即使在包含批处理文件的目录中也是如此,例如 C:\Temp\Development & Test 100% (!)
,大多数使用 %~dp0
的批处理文件都失败了。
几乎在所有情况下都应该在批处理文件末尾不使用命令 exit
。在极少数情况下,批处理文件底部的 exit
确实有用,但在大多数情况下它是无用的甚至适得其反,例如 意味着 运行 它来自内部命令提示符 window,或者当批处理文件将来被另一个批处理文件调用时。
为了了解使用的命令及其工作原理,请打开 command prompt window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
echo /?
endlocal /?
exit /?
goto /?
pause /?
rem /?
set /?
setlocal /?
start /?
另请参阅:
- Microsoft 的 Windows commands
文档
它包含 Microsoft 文档中未找到的有关 exit /B
的信息。
- DosTips 论坛主题:ECHO. FAILS to give text or blank line - Instead use ECHO/
- Microsoft 的 Windows 内核库函数 CreateProcess and the STARTUPINFO 结构的文档,
cmd.exe
在不使用或使用其内部命令的情况下启动可执行文件时使用该结构 start
.命令 start
的使用改变了一些传递给函数的参数和结构中的值。
CreateProcess
函数参数 lpEnvironment
的解释在这种情况下是最有趣的。此函数参数始终为空指针,因为 cmd.exe
不支持定义特定于可执行文件启动的环境变量。
命令 start
的选项 /D
定义了函数参数 lpCurrentDirectory
,即默认情况下没有空指针,而是指向明确指定的目录路径字符串的指针。
我正在尝试使用 'SET' 设置一些环境变量,以便它们在本地设置而不是在系统级别设置,这在使用 SETX 时会发生。但是变量似乎没有传递到正在执行的最终命令 (.exe) 我如何设置本地 env 变量并将修改后的 env 传递到 exe?
@echo off
setlocal
:: Assign all Path variables
SET STARTUP="%~dp0startup"
set ADSK_3DSMAX_STARTUPSCRIPTS_ADDON_DIR=%STARTUP%
echo ADSK_3DSMAX_STARTUPSCRIPTS_ADDON_DIR %STARTUP%
start /d "%PROGRAMW6432%\Autodeskds Max 2022\" 3dsmax.exe /i
endlocal
exit
解决方案可能是首先使用 set 在批处理文件中设置环境变量,然后直接 运行 可执行文件(无需启动)。如果有效,请告诉我!
使用 set "var1=data"
设置字符串值 - 这避免了尾随空格引起的问题。
如果你使用你的语法,你执行
set ADSK_3DSMAX_STARTUPSCRIPTS_ADDON_DIR=""%~dp0startup""
这可能不是您所期望的。
以下批处理文件适用于任何用例:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem Assign all directory path variables
set "STARTUP=%~dp0startup"
set "ADSK_3DSMAX_STARTUPSCRIPTS_ADDON_DIR=%STARTUP%"
if not exist "%ProgramFiles%\Autodeskds Max 2022dsmax.exe" goto Progx86
start "" /D "%ProgramFiles%\Autodeskds Max 2022" 3dsmax.exe /i
exit /B
:Progx86
if not exist "%ProgramFiles(x86)%\Autodeskds Max 2022dsmax.exe" goto DisplayError
start "" /D "%ProgramFiles(x86)%\Autodeskds Max 2022" 3dsmax.exe /i
exit /B
:DisplayError
echo ERROR: Failed to find: "Autodeskds Max 2022dsmax.exe"
echo/
pause
endlocal
第二行使用 setlocal
和选项 EnableExtensions
和 DisableDelayedExpansion
的原因在第 问题 6:批处理文件取决于定义的环境
我在 Why is no string output with 'echo %var%' after using 'set var = text' on command line?
上的回答详细描述了使用语法定义环境变量的原因这些更改的组合产生了一个工作批处理文件,即使在包含批处理文件的目录中也是如此,例如 C:\Temp\Development & Test 100% (!)
,大多数使用 %~dp0
的批处理文件都失败了。
几乎在所有情况下都应该在批处理文件末尾不使用命令 exit
。在极少数情况下,批处理文件底部的 exit
确实有用,但在大多数情况下它是无用的甚至适得其反,例如
为了了解使用的命令及其工作原理,请打开 command prompt window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
echo /?
endlocal /?
exit /?
goto /?
pause /?
rem /?
set /?
setlocal /?
start /?
另请参阅:
- Microsoft 的 Windows commands 文档
它包含 Microsoft 文档中未找到的有关exit /B
的信息。- DosTips 论坛主题:ECHO. FAILS to give text or blank line - Instead use ECHO/
- Microsoft 的 Windows 内核库函数 CreateProcess and the STARTUPINFO 结构的文档,
cmd.exe
在不使用或使用其内部命令的情况下启动可执行文件时使用该结构start
.命令start
的使用改变了一些传递给函数的参数和结构中的值。
CreateProcess
函数参数lpEnvironment
的解释在这种情况下是最有趣的。此函数参数始终为空指针,因为cmd.exe
不支持定义特定于可执行文件启动的环境变量。
命令start
的选项/D
定义了函数参数lpCurrentDirectory
,即默认情况下没有空指针,而是指向明确指定的目录路径字符串的指针。