批处理文件未设置变量

7

我正在尝试编写一个批处理文件,以简化Web服务存根的生成。问题在于其中一个变量的SET命令没有设置值。我已经尝试了各种方法来让它遵守这个SET,但都无济于事。显然我漏掉了某些明显的东西。脚本的其余部分正常工作。

IF %1==-b (
    ECHO %2
    SET BINDINGS_FILE=%2
    SHIFT & SHIFT
    ECHO File: %BINDINGS_FILE%

    IF EXIST "%BINDINGS_FILE%" (
        SET BINDINGS=-b %BINDINGS_FILE%
    ) ELSE (
        ECHO Please enter a valid Bindings file name: %BINDINGS_FILE%.
        GOTO DONE
    )
    ECHO BINDINGS = %BINDINGS%  
)

当我使用以下命令进行执行时,它会将绑定文件打印为%2,但其被SET的变量仍为空。
generate-stubs.bat -b wsdl/Binding.xml -p com.acme.service wsdl/WebService.wsdl

wsdl/Binding.xml
File:
Please enter a valid Bindings file name: .
Done!

任何建议都受到欢迎。
2个回答

8

批处理文件会将变量设置为指定的值,但你可能看不到它。

在批处理文件中,代码会逐行或逐个块(括号内的多行)解析和执行。当解析器遇到一行或一个代码块时,在所有读取变量的位置,引用变量的部分都会被删除并替换为变量中的值 在执行该块之前 的值。因此,如果一个变量在一个块内部改变了其值,这个新值将无法从该块内部访问。被执行的内容不包括对变量的引用,而是在代码被解析时的变量值。

要更改此行为,并能够从改变变量值的同一块内部读取已更改的变量值,则需要启用延迟扩展。

启用延迟扩展后,访问/读取变量的语法可以更改(必要时)从 %var%!var!。这指示解析器不要进行初始替换,并推迟访问变量的值直到命令执行。

因此,你的代码可能如下所示:

setlocal enabledelayedexpansion 

IF "%1"=="-b" (
    ECHO %2
    SET "BINDINGS_FILE=%~2"
    SHIFT & SHIFT
    ECHO File: !BINDINGS_FILE!

    IF EXIST "!BINDINGS_FILE!" (
        SET "BINDINGS=-b !BINDINGS_FILE!"
    ) ELSE (
        ECHO Please enter a valid Bindings file name: !BINDINGS_FILE!.
        GOTO DONE
    )
    ECHO BINDINGS = !BINDINGS!  
)

谢谢。我读了关于延迟扩展的内容,但显然没有正确理解它。 - radimpe

8

看起来这是一个非常旧的帖子,但可能会为某些人节省数小时的努力...

IF语句括号“()”内的所有命令都作为单个块执行。变量值在执行IF语句块(第2行到第5行)期间确实发生了更改,但更改后的值只能在当前块执行完成后使用。 例如,您下面的代码片段:

    1 IF %1==-b (
    2    ECHO %2
    3    SET BINDINGS_FILE=%2
    4    SHIFT & SHIFT
    5    ECHO File: %BINDINGS_FILE%
      )
    6    ECHO %BINDINGS_FILE%

尽管“BINDING_FLAGS”的值在第3行中设置,但它仅在下一个块或下一个命令中生效,这意味着第6行将显示实际值而不是第5行。


当我再做一些批处理文件时,我会记住这个。 - radimpe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接