2
A
回答
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
後死亡。這意味着您不需要在批處理文件結束時將其刪除,並將在執行期間更改的所有變量恢復爲其原始值。這很好,因爲您不必擔心「踩踏」任何先前存在的變量。
相關問題
- 1. 爲什麼在for循環中使用pop()不起作用(javascript)
- 2. 爲什麼while循環不起作用?
- 3. 爲什麼setInterval在for循環中不起作用?
- 4. 爲什麼For循環在我的程序中不起作用?
- 5. 爲什麼arr.entries()for循環在TS中不起作用?
- 6. 爲什麼for循環對特定值不起作用?
- 7. 爲什麼擴展for循環對迭代器不起作用?
- 8. for循環不起作用
- 9. 爲什麼for循環不工作我
- 10. 爲什麼負循環輸入在for循環中不起作用
- 11. bash選擇循環不起作用
- 12. 爲什麼while循環在if循環中不起作用?
- 13. 這個循環爲什麼起作用?
- 14. 爲什麼for循環工作
- 15. 爲什麼for循環
- 16. 爲什麼'for(;;)'循環?
- 17. 不能工作爲什麼這個while循環不起作用
- 18. getViewTreeObserver for for循環不工作,爲什麼?
- 19. 爲什麼我的for循環在函數內部使用push不起作用?
- 20. 爲什麼不執行for循環?
- 21. 爲什麼for循環不打破
- 22. 爲什麼for循環不執行?
- 23. 遞增[i] for循環不起作用
- 24. 節點JS for循環不起作用
- 25. Javascript;嵌套for循環不起作用
- 26. Easy JsRender for循環不起作用
- 27. 我的for循環不起作用
- 28. For循環計算Matlab不起作用
- 29. JavaScript for循環不起作用
- 30. For循環對ArrayList不起作用