12

我正在编写一个批处理文件以从文件中读取路径并将其设置为环境变量。许多其他批处理文件将使用(调用)该批处理文件来获取变量。在编写批处理文件时,我遇到了变量扩展问题,所以我曾经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!
)

在我的另一个批处理文件中,我使用上面的批处理文件来设置变量

   another.bat
 
   call getVariables.dat
   echo "%JAVA%"

但是 echo 正在打印“”,但未设置。如果这是因为setlocal,我该如何克服呢?我还需要setlocal延迟扩展并在执行时发生。我该如何解决这个问题?

4

4 回答 4

22

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

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

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

于 2013-08-17T17:39:09.653 回答
5

endlocal & set str=value将创造奇迹。

于 2013-03-19T08:40:34.487 回答
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失去其存在的理由

为了测试,你可以写

@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

实际上, if getVariables.batis only ever CALLed 那么即使该@echo off行也是多余的-假设您@echo off已从调用批处理中执行。

于 2013-03-19T10:15:36.217 回答
1

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

于 2014-03-01T21:41:19.253 回答