我正在编写一个批处理文件来读取文件中的路径并将其设置为环境变量。许多其他批处理文件将使用(调用)此批处理文件来获取变量。在编写批处理文件时,我面临一个问题,即变量扩展,因此我使用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
来延迟扩展并在执行时发生。解决这个问题的任何方法?请帮帮我。
答案 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坐标。