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%"
)