10
看來,因爲我使用SET在批處理腳本中聲明瞭我的變量,所以如果我在cmd中多次運行它,變量值將保留,除非我明確地重置它們。如何在每批腳本運行後清除變量?
我是否必須使用setlocal和endlocal來確保一次運行的變量不會持續到另一次,而不關閉CMD?
看來,因爲我使用SET在批處理腳本中聲明瞭我的變量,所以如果我在cmd中多次運行它,變量值將保留,除非我明確地重置它們。如何在每批腳本運行後清除變量?
我是否必須使用setlocal和endlocal來確保一次運行的變量不會持續到另一次,而不關閉CMD?
是的,你應該使用SETLOCAL。這將定位任何變化,以便在發佈ENDLOCAL後舊環境將會恢復。
當所有腳本處理完成並返回到命令行上下文時,會爲每個活動的SETLOCAL頒發一個隱式ENDLOCAL。沒有必要明確地發出ENDLOCAL。另外,如果您的腳本(或例程)被調用,那麼當CALL完成時,對於在CALLed例程中發出的每個活動SETLOCAL都有一個隱式ENDLOCAL。沒有必要把ENDLOCAL在例行的結束,(儘管它不會傷害)
例如
@echo off
set var=pre-CALL value
echo var=%var%
call :test
echo var=%var%
exit /b
:test
setlocal
set var=within CALL value
echo var=%var%
exit /b
輸出:
被調用函數中var=pre-CALL value
var=within CALL value
var=pre-CALL value
ENDLOCAL永遠不會回滾在CALL之前發出的SETLOCAL。例如。
@echo off
setlocal
set var=VALUE 1
setlocal
set var=VALUE 2
echo before call: var=%var%
call :test
echo after call: var=%var%
endlocal
echo after endlocal: var=%var%
exit /b
:test
setlocal
set var=VALUE 3
echo within local CALL context: var=%var%
endlocal
echo within CALL after 1st endlocal: var=%var%
endlocal
echo within CALL cannot endlocal to before CALL state: var=%var%
exit /b
結果:執行完成時
before call: var=VALUE 2
within local CALL context: var=VALUE 3
within CALL after 1st endlocal: var=VALUE 2
within CALL cannot endlocal to before CALL state: var=VALUE 2
after call: var=VALUE 2
after endlocal: var=VALUE 1
我看......所以基本上SETLOCAL之後每一套操作將被清除。我會試一試。這打敗了我自己的變數。 – ttback