批处理脚本使 setlocal 变量被其他批处理文件访问

Posted

技术标签:

【中文标题】批处理脚本使 setlocal 变量被其他批处理文件访问【英文标题】:Batch script make setlocal variable accessed by other batch files 【发布时间】:2013-03-07 20:15:17 【问题描述】:

我正在编写一个批处理文件以从文件中读取路径并将其设置为环境变量。许多其他批处理文件将使用(调用)此批处理文件来获取变量。在编写批处理文件时,我遇到了变量扩展问题,所以我使用SETLOCAL ENABLEDELAYEDEXPANSION 来克服这个问题。但是这样做其他正在使用它的批处理文件无法设置变量。

下面是批处理脚本,

getVariables.bat

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
if EXIST "test.dat" (
    for /F "tokens=*" %%I in (test.dat) do set %%I
    echo setting JAVA_HOME to :: !JAVA_HOME!
    echo setting JAVA to !JAVA!
)

在我的另一个批处理文件中,我使用上面的批处理文件来设置变量

   another.bat
 
   call getVariables.dat
   echo "%JAVA%"

但 echo 正在打印“”,但未设置。如果这是因为setlocal,我该如何克服呢?我还需要setlocal 来延迟扩展并在执行时发生。我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

要将多个全局变量设置为局部变量的值,请使用以下技巧:

endlocal & (
  set "globalvar1=%localvar1%"
  set "globalvar2=%localvar2%"
  set "globalvar3=%localvar3%"
)

() 块中的变量在 endlocal 执行之前被展开。

【讨论】:

您实际上可以将变量设置为自己的名称,例如,endlocal & set var=%var%endlocal 销毁变量,但它的值已经被替换,所以 set 命令立即重新创建它。【参考方案2】:

这个endlocal & set str=value会创造奇迹。

【讨论】:

这就是我的问题。我习惯在我的所有脚本中使用 SETLOCAL。最后,我发现了一个导致问题的异常。【参考方案3】:

这真的取决于你在做什么 - 以及你是否发布了完整的脚本。

首先,你在%test.dat中有不平衡的%

接下来,最好将批处理文件命名为 .bat 而不是 .dat

接下来,如果这个getVariables.bat 的唯一目的是设置行文件 (test.dat) 中的变量,例如

JAVA_HOME=c:\whereverjavahomeis
JAVA=c:\whereverjavais

然后

@echo off
if EXIST "test.dat" (
    for /F "tokens=*" %%I in (test.dat) do set %%I
)

完全够用了。就是这样 - 4 行(如果你真的尝试,它可以全部压缩为 1...)

关键是您只需要enabledelayedexpansionsetlocal 即可显示您正在更改的变量的值WITHIN THE LOOP WHERE YOU'RE CHANGING THE VALUES。您最终将删除这些行,enabledelayedexpansion 将失去其存在的存在理由

为了测试,你可以写

@echo off
echo before...JAVA=%java%
echo before...JAVA_HOME=%java_home%
if EXIST "test.dat" (
    for /F "tokens=*" %%I in (test.dat) do set %%I
)
echo after....JAVA=%java%
echo after....JAVA_HOME=%java_home%

甚至

@echo off
echo before&set java
if EXIST "test.dat" (
    for /F "tokens=*" %%I in (test.dat) do set %%I
)
echo after&set java

事实上,如果getVariables.bat 只是CALLed,那么即使@echo off 行也是多余的——假设您已经从调用批处理中执行了@echo off

【讨论】:

【参考方案4】:

进入 cmd 并搜索 setx。它可以让您制作系统变量和所有其他类型的东西,甚至可以在文件中查找变量的 x 和 y 坐标。

【讨论】:

它与问题有什么关系?

以上是关于批处理脚本使 setlocal 变量被其他批处理文件访问的主要内容,如果未能解决你的问题,请参考以下文章

.bat学习-基础语法

批处理中setlocal enabledelayedexpansion的作用详细整理

为啥即使使用 setlocal enabledelayedexpansion 也无法访问 for 循环(批处理文件)中的局部变量? [复制]

bat批处理命令大全

Windows 批处理中 setlocal enabledelayedexpansion 的作用

批处理中setlocal enabledelayedexpansion的作用详细整理