2014-06-06 29 views
3

我想寫一個批處理文件來簡化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! 

任何建議表示讚賞。

回答

5

批處理文件將變量設置爲指示值。但是你沒有看到它。

在批處理文件行中被解析,然後執行。逐行或逐個塊(括號中的行)。當解析器到達一行或一行塊時,在變量被採集的所有點處,對該變量的引用將被刪除,並且在開始執行該塊之前,被替換爲變量中的值。所以,如果一個變量在一個塊內部改變了它的值,這個新值將不會從這個塊內被訪問。正在執行的內容不包括對變量的引用,而是對代碼進行分析時變量中的值。

要改變這種行爲,並且能夠從改變該值的相同塊內讀取變量的變化值,需要延遲擴展。

啓用延遲擴展時,訪問/讀取變量的語法可以從%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! 
) 
+0

謝謝。我讀到延期擴張的事情,顯然沒有正確理解。 – radimpe

3

看起來像一個非常老的文章,但可能會節省力氣有人小時......

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

+0

當我做更多的批處理文件時,我會記住這一點。 – radimpe

相關問題