运行bat文件为exe设置环境变量

问题描述 投票:0回答:3

我正在尝试使用“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
windows batch-file cmd
3个回答
2
投票

以下批处理文件适用于任何用例:

@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 /?
    
    
另请参阅:

    Microsoft 的
  • Windows 命令 文档
  • GOTO :EOF 返回到哪里? 它包含 Microsoft 文档中未找到的有关
    exit /B
     的信息。
  • DosTips 论坛主题:
  • ECHO。无法给出文本或空行 - 而是使用 ECHO/
  • Microsoft 的 Windows 内核库函数
  • CreateProcessSTARTUPINFO 结构的文档,由 cmd.exe
     在启动可执行文件时使用,无论是否使用其内部命令 
    start
    。命令
    start
    的使用改变了传递给函数的一些参数和结构中的值。
    在这种情况下,对
    CreateProcess
     函数参数 
    lpEnvironment
     的解释是最有趣的。该函数参数始终为空指针,因为
    cmd.exe
    不支持特定于要启动的可执行文件的环境变量的定义。
    命令
    /D
    的选项
    start
    定义了函数参数
    lpCurrentDirectory
    ,即默认没有空指针,而是指向显式指定的目录路径字符串的指针。

0
投票
解决方案可以首先使用 set 在批处理文件中设置环境变量,然后直接运行可执行文件(无需启动)。如果有效请告诉我!


0
投票
使用

set "var1=data"

 设置字符串值 - 这可以避免尾随空格引起的问题。

如果你使用你的语法,你就会执行

set ADSK_3DSMAX_STARTUPSCRIPTS_ADDON_DIR=""%~dp0startup""
这可能不是你所期望的。

© www.soinside.com 2019 - 2024. All rights reserved.