批处理文件未设置变量

时间:2014-06-06 09:47:20

标签: batch-file

我试图编写一个批处理文件来简化WebService存根的生成。问题是变量的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 个答案:

答案 0 :(得分:6)

批处理文件将变量设置为指示值。但是你没有看到它。

在批处理文件中解析行,然后执行。逐行或逐块(括号内的行)。当解析器到达一行或一行行时,在读取变量的所有点处,对该变量的引用将被删除,并替换为变量中的值开始执行该块之前。因此,如果变量在块内更改其值,则不会从同一块内部访问此新值。正在执行的内容不包括对变量的引用,而是在解析代码时包含变量中的值。

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

启用延迟扩展后,可以从%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!  
)

答案 1 :(得分:4)

看起来像一个很老的帖子,但可能会节省一些时间......

IF语句括号内的所有命令"("")"作为单个块执行。在执行IF语句块(LINE 2到LINE 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行将显示实际值,而不是LINE#5