运行 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 和选项 EnableExtensionsDisableDelayedExpansion 的原因在第 问题 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,即默认情况下没有空指针,而是指向明确指定的目录路径字符串的指针。