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

Windows 批处理脚本使setlocal变量被其他批处理文件访问,windows,batch-file,command,Windows,Batch File,Command,我正在编写一个批处理文件,以便从文件中读取路径并将其设置为环境变量。许多其他批处理文件将使用(调用)此批处理文件来获取变量。在编写批处理文件时,我遇到了变量扩展的问题,因此我使用了setlocalenabledayedexpansion来解决这个问题。但是使用它的其他批处理文件无法获得变量集 下面是批处理脚本 getVariables.bat @echo off SETLOCAL ENABLEDELAYEDEXPANSION if EXIST "test.dat" ( for /F "

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

下面是批处理脚本

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
来延迟扩展并在执行时发生。这个问题有什么解决办法吗?请帮帮我。

这个
endlocal&set str=value
将产生奇迹

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

首先,在
%test.dat

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

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

然后

这完全足够了。就这样-4行(如果你真的尝试的话,可以全部压缩成1行…)

关键是,您只需要启用
延迟扩展
,因此需要
设置本地
,以便在更改值的循环中显示所更改变量的值。您最终将删除这些行,
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
只是
CALL
ed,那么即使
@echo off
行也是多余的-假设您已经从调用批处理执行了
@echo off

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

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

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

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

这就是我的问题所在。我习惯在所有脚本中使用SETLOCAL。最后,我发现了一个异常,它导致了一个问题。它与这个问题有什么关系?您实际上可以将一个变量设置为它自己的名称,例如,
endlocal&set var=%var%
endlocal
销毁变量,但其值已被替换,因此
set
命令立即重新创建变量。
@echo off
echo before&set java
if EXIST "test.dat" (
    for /F "tokens=*" %%I in (test.dat) do set %%I
)
echo after&set java
endlocal & (
  set "globalvar1=%localvar1%"
  set "globalvar2=%localvar2%"
  set "globalvar3=%localvar3%"
)