2011-07-07 43 views

回答

5

據我所知,您的問題基本上是關於SETLOCAL命令及其效果,無論使用的是ENABLEDELAYEDEXPANSION選項(或任何其他選項)。

我的答案很簡單:沒有,假設變量之前沒有進入SETLOCAL的範圍存在。

我的較長答案如下:

所有SETLOCAL範圍內的一個變量所做的更改在離開範圍丟棄(即在達到ENDLOCAL)。這包括:

  • 限定先前未定義的變量:

    @ECHO OFF 
    
    <nul SET /P q=1. 
    IF DEFINED ttt (ECHO defined) ELSE (ECHO undefined) 
    
    SETLOCAL 
    
    SET ttt= 
    <nul SET /P q=2. 
    IF DEFINED ttt (ECHO defined) ELSE (ECHO undefined) 
    
    ENDLOCAL 
    
    <nul SET /P q=3. 
    IF DEFINED ttt (ECHO defined) ELSE (ECHO undefined) 
    

    這個輸出:

    1.undefined 
    2.defined 
    3.undefined 
    
  • 取消定義預先定義的變量:

    @ECHO OFF 
    
    SET ttt=1 
    <nul SET /P q=1. 
    IF DEFINED ttt (ECHO defined) ELSE (ECHO undefined) 
    
    SETLOCAL 
    
    SET ttt= 
    <nul SET /P q=2. 
    IF DEFINED ttt (ECHO defined) ELSE (ECHO undefined) 
    
    ENDLOCAL 
    
    <nul SET /P q=3. 
    IF DEFINED ttt (ECHO defined) ELSE (ECHO undefined) 
    

    的輸出是:

    1.defined 
    2.undefined 
    3.defined 
    
  • 改變變量的值:

    @ECHO OFF 
    
    SET ttt=1 
    ECHO 1.ttt=%ttt% 
    
    SETLOCAL 
    
    SET ttt=2 
    ECHO 2.ttt=%ttt% 
    
    ENDLOCAL 
    
    ECHO 3.ttt=%ttt% 
    

    而這將產生以下輸出:

    1.ttt=1 
    2.ttt=2 
    3.ttt=1 
    

正如我在開始時所述,上述適用於SETLOCAL無論你是否使用它與其他選項或不。

總之,我想說的是,可以將計算結果保存在SETLOCAL的範圍內,以便在ENDLOCAL之後使用。這裏有一個小竅門,使得它可能:

… 
ENDLOCAL & SET var=%var% 
… 

截至解析這一行的時候,SETLOCAL命令仍然有效,所以%var%得到評估,以你最最近存入var值。當行執行時,var變量在ENDLOCAL後立即丟失其值,但SET命令已包含其值,剛剛被替換,所以var收到它,以滿足所有人的需求。

按@Jeremy穆雷的評論,你也可以得到訪問ENDLOCAL後改變的值,如果你提供ENDLOCAL和命令(S)讀取變量用括號括起來的單個塊:

… 
(
ENDLOCAL 
SET var=%var% 
anything else 
) 
…

效果將是相同的,因爲括號內的命令都解析並作爲一個單元執行:首先它們是全部解析,然後它們全部被執行。

+2

如果需要,您還可以在paren語句中放置endlocal以執行多個集合。 [想象這個例子中的換行符:)](ENDLOCAL 如果不是「%RETURN_SIG%」==「」SET「SIGNATURE =%RETURN_SIG%」 如果「%RETURN_SIG%」==「」SET「SIGNATURE =% DEFAULT_SIG%「 ) –

+0

@Jeremy Murray:絕對如此。在執行第一個命令之前,所有括號命令都會被解析。所以它的效果就好像它們在同一條線上一樣。感謝您指出了這一點! –

+0

我認爲只有在調用SETLOCAL時才能使用enabledelayedexpansion? – Mechaflash

相關問題