批处理文件未设置变量

rad*_*mpe 5 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%  
)
Run Code Online (Sandbox Code Playgroud)

当我使用以下命令执行它时,它会打印绑定文件,%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!
Run Code Online (Sandbox Code Playgroud)

任何建议赞赏.

ash*_*ash 8

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

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

    1 如果 %1==-b (
    2 回声 %2
    3 SET BINDINGS_FILE=%2
    4 移位和移位
    5 回显文件:%BINDINGS_FILE%
      )
    6 回显 %BINDINGS_FILE%

虽然“BINDING_FLAGS”的值是在第3行设置的,但它只会在下一个块或下一个命令中生效,也就是说,第6行将显示实际值而不是第5行


MC *_* ND 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!  
)
Run Code Online (Sandbox Code Playgroud)