2012-08-23 35 views

回答

6

您正在錯誤地檢查錯誤級別。

變量和命令的托架對這樣內部...

(
    command1 
    command2 
    command3 
) 

...像他們在一行上運行,這樣command1 & command2 & command3

在命令行嘗試此操作。

choice & echo %errorlevel% 

如果執行上面的命令超過一次,你會看到以前錯誤級別相呼應,不是當前

或者嘗試在命令行上:

set x=yes 
(echo %x% 
    set x=no 
    echo %x% 
) 

你的輸出將是:

yes 
yes 

就像如果你願意進入echo %x% & set x=no& echo %x%

我喜歡把它作爲系統沒有時間更新變量。 (雖然更準確地說,變量只在整行執行後纔會更新。)所有變量都是如此,而不僅僅是錯誤級別。

要使for循環中的變量正常工作,您需要在批處理文件(或外部批處理文件)中使用call這樣的內部標籤。

@echo off 
    FOR /L %%i IN (1,1,100) DO call :dostuff %%i 
goto :eof 

:dostuff 
    choice /m "Question #%1" 
    echo %ErrorLevel% 

==================================== 解決方案質疑下面

或者,Microsoft創建了一個方法來訪問括號內的變量的當前值,他們稱之爲'Delayed Expansion',因爲代碼行被解釋了兩次。

要激活此模式,請使用setlocal命令和enableDelayedExpansion開關,然後使用!訪問變量。這樣的性格。 FYI endlocal關閉效果。

@echo off 
setlocal enableDelayedExpansion 
for /L %%i in (1,1,100) do (
    choice /m "Question #%%i" 
    echo !ErrorLevel! 
) 
endlocal 

正如你可以看到我的第一個例子更容易編碼,但我的第二個例子更容易閱讀。無論使用哪種方法都取決於您的需求和可重用性。

setlocal命令還具有創建臨時變量的效果,該命令在命令endlocal後死亡。這意味着您不需要在批處理文件結束時將其刪除,並將在執行期間更改的所有變量恢復爲其原始值。這很好,因爲您不必擔心「踩踏」任何先前存在的變量。