我试图编写一个批处理文件来简化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!
任何建议表示赞赏。
答案 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