【问题标题】:Batch script make setlocal variable accessed by other batch files批处理脚本使 setlocal 变量被其他批处理文件访问
【发布时间】:2013-03-07 20:15:17
【问题描述】:

我正在编写一个批处理文件以从文件中读取路径并将其设置为环境变量。许多其他批处理文件将使用(调用)此批处理文件来获取变量。在编写批处理文件时,我遇到了变量扩展问题,所以我使用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 来延迟扩展并在执行时发生。我该如何解决这个问题?

【问题讨论】:

    标签: windows batch-file command


    【解决方案1】:

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

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

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

    【讨论】:

    • 您实际上可以将变量设置为自己的名称,例如,endlocal & set var=%var%endlocal 销毁变量,但它的值已经被替换,所以 set 命令立即重新创建它。
    【解决方案2】:

    这个endlocal & set str=value会创造奇迹。

    【讨论】:

    • 这就是我的问题。我习惯在我的所有脚本中使用 SETLOCAL。最后,我发现了一个导致问题的异常。
    【解决方案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...)

    关键是您只需要enabledelayedexpansionsetlocal 即可显示您正在更改的变量的值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 只是CALLed,那么即使@echo off 行也是多余的——假设您已经从调用批处理中执行了@echo off

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 它与问题有什么关系?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      相关资源
      最近更新 更多