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

时间:2013-03-19 08:34:02

标签: windows batch-file command

我正在编写一个批处理文件来读取文件中的路径并将其设置为环境变量。许多其他批处理文件将使用(调用)此批处理文件来获取变量。在编写批处理文件时,我面临一个问题,即变量扩展,因此我使用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!
)

在我的另一个批处理文件中,我使用上面的batach文件来获取变量集

   another.bat

   call getVariables.dat
   echo "%JAVA%"

但是echo是打印“”,它没有设置。如果这是因为setlocal,我该如何克服这个问题?我还需要setlocal来延迟扩展并在执行时发生。解决这个问题的任何方法?请帮帮我。

4 个答案:

答案 0 :(得分:17)

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

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

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

答案 1 :(得分:5)

endlocal & set str=value会产生奇迹。

答案 2 :(得分: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)。

关键是您只需要enabledelayedexpansion,因此需要setlocal才能显示您正在更改的变量WITHIN THE LOOP WHERE YOU'RE CHANGING THE VALUES的值。你最终会删除这些行,enabledelayedexpansion会失去 raison d'etre

进行测试,你可以写

@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只是CALL,那么即使@echo off行也是多余的 - 假设您已经从调用批处理中执行了@echo off

答案 3 :(得分:0)

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

相关问题