我正在尝试使用“SET”设置一些环境变量,以便它们在本地设置,而不是在系统级别设置,这在使用 SETX 时会发生。但是,变量似乎没有传递到正在执行的最终命令(.exe)中。我如何设置本地环境变量并将修改后的环境传递到 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%\Autodesk\3ds Max 2022\" 3dsmax.exe /i
endlocal
exit
以下批处理文件适用于任何用例:
@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%\Autodesk\3ds Max 2022\3dsmax.exe" goto Progx86
start "" /D "%ProgramFiles%\Autodesk\3ds Max 2022" 3dsmax.exe /i
exit /B
:Progx86
if not exist "%ProgramFiles(x86)%\Autodesk\3ds Max 2022\3dsmax.exe" goto DisplayError
start "" /D "%ProgramFiles(x86)%\Autodesk\3ds Max 2022" 3dsmax.exe /i
exit /B
:DisplayError
echo ERROR: Failed to find: "Autodesk\3ds Max 2022\3dsmax.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
确实有用,但在大多数情况下它是无用的,甚至适得其反,例如,在调试批处理文件 时,这意味着从命令提示符窗口中运行它,或者当该批处理文件将来被另一个批处理文件调用时。 要了解所使用的命令及其工作原理,请打开
命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
echo /?
endlocal /?
exit /?
goto /?
pause /?
rem /?
set /?
setlocal /?
start /?
exit /B
的信息。
cmd.exe
在启动可执行文件时使用,无论是否使用其内部命令
start
。命令
start
的使用改变了传递给函数的一些参数和结构中的值。在这种情况下,对
CreateProcess
函数参数
lpEnvironment
的解释是最有趣的。该函数参数始终为空指针,因为
cmd.exe
不支持特定于要启动的可执行文件的环境变量的定义。命令
/D
的选项
start
定义了函数参数
lpCurrentDirectory
,即默认没有空指针,而是指向显式指定的目录路径字符串的指针。
set "var1=data"
设置字符串值 - 这可以避免尾随空格引起的问题。如果你使用你的语法,你就会执行
set ADSK_3DSMAX_STARTUPSCRIPTS_ADDON_DIR=""%~dp0startup""
这可能不是你所期望的。