2013-03-19 162 views
6

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

下面是批处理脚本,

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

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

回答

4

This endlocal & set str=value will work wonders。

+1

这是我的问题。我习惯于在我的所有脚本中使用SETLOCAL。最后,我发现了一个引起问题的例外。 – djangofan 2013-06-05 21:28:07

2

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

首先,你必须不平衡在%test.dat

下一页%,这是一个好主意来命名批处理文件.bat没有.dat

接下来,如果这个getVariables.bat的唯一目的是设置变量的FOM的文件线(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会失去它的存储权

为了测试,你可以写

@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从调用批次。

10

要设置多个全局变量来局部变量的值,可以使用下面的技巧:执行ENDLOCAL之前

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

在()块中的变量被扩展。

0

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