我有a.bat具有可變%errorlevel%
,並呼籲b.bat以下行:批次開始堅持特定的變量
start /wait cmd /c b.bat
如果b.bat
設置%errorlevel%
(如errorlevel = 5
)
如何是否有可能在a.bat
中只保留這個%errorlevel%
變量,而不使用CALL命令。
我不想使用CALL的原因是因爲b.bat
包含一些我不想保留的變量。
我有a.bat具有可變%errorlevel%
,並呼籲b.bat以下行:批次開始堅持特定的變量
start /wait cmd /c b.bat
如果b.bat
設置%errorlevel%
(如errorlevel = 5
)
如何是否有可能在a.bat
中只保留這個%errorlevel%
變量,而不使用CALL命令。
我不想使用CALL的原因是因爲b.bat
包含一些我不想保留的變量。
您不必公開內部變量以在腳本之間進行通信。您可以使用常規參數將值發送到被調用的腳本,並從%ERRORLEVEL%
環境變量中獲取其數值結果。在下面的示例,a.cmd
傳遞一個參數b.cmd
並接收其執行的結果(從%ERRORLEVEL%
):
:: a.cmd ----
SETLOCAL
SET ARGUMENT=123
CALL b.cmd "%ARGUMENT%"
SET RESULT=%ERRORLEVEL%
ECHO B returned this numeric value as result (%RESULT%)
:: b.cmd ----
SETLOCAL
SET OTHERVAR=%~1
ECHO B received this value as argument (%OTHERVAR%)
EXIT /B 33000
我增強建議避免使用保留名稱爲變量(如@dbenham也評論) 。
此答案自從最初發布以來已經被顯着編輯。
你的命令應該像當前編寫的那樣工作,儘管我沒有看到使用START的好處。這將是更簡單,更高效簡單地使用:
cmd /c "b.bat"
,是由b.bat設定應當由CMD命令返回的錯誤級別。當然,如果你創建了你自己的名爲ERRORLEVEL的環境變量來掩蓋由Windows維護的動態值,那麼這是行不通的。
但是,我認爲它會更好,(如果可能)修改b.bat,使其頂部有SETLOCAL
。一旦腳本結束,由b.bat定義的任何變量都是臨時的並且被遺忘。然後你可以使用CALL,並且b.bat中的變量將會消失,但是ERRORLEVEL將被正確設置給調用者。
b.bat
@echo off
setlocal
set var=This value will be "forgotten" when b.bat ends
dir "This does not exist so ERRORLEVEL will be set to 1"
caller.bat
@echo off
set var=
call b.bat
echo ERRORLEVEL=%errorlevel%
set var
但基於您的評論,這聽起來好像你有類似下面b.bat一行:
set errorlelvel=%errorsaved%
您應該從來沒有像那樣爲ERRORLEVEL定義自己的值,因爲它打破了ERRORLEVEL應該用於的功能。
而是應該使用EXIT/B在腳本的端部設置的錯誤級別
@echo off
setlocal
...
set someVar=anything. This value will be gone at script end because of SETLOCAL
...
someCommandThatGeneratesAnError
set errorsaved=%errorlevel%
...
exit /b %errosaved%
如果要嘗試,以選擇性地從持續b.bat(未ERRORLEVEL)的用戶定義的變量,那麼你真的應該修改b.bat使SETLOCAL
在頂部,然後使用ENDLOCAL
與任何一種方法結合在ENDLOCAL屏障上保留一個值。看看前3投票答案Make an environment variable survive ENDLOCAL
謝謝dbenham,我實際上希望堅持ERRORLEVEL。所以b.bat實際上正在通過sqlcmd調用幾個查詢。所以我想在這個我應該用你的例子(與CALL)對嗎? (並且它不會與START一起工作) – MajorInc
@MajorInc - 您可以使用START加上我的第一個建議,但是沒有任何優勢。直接使用CMD會更有效率。我仍然喜歡更好地調用b.bat的修改形式。 – dbenham
你知道嗎,我認爲其實就像start/wait cmd/c b.bat一樣簡單。正如你所說的,ERRORLEVEL是一個環境變量,因此是持久性的。我認爲我面臨的問題可能是由於「set errorlevel =%errorsaved%」這一行導致的,我在caller.bat:/ – MajorInc
嗨,感謝您的答覆。我真正想要的是在b.cmd中更改%OTHERVAR%,並在a.cmd中輸出結果 – MajorInc