2012-06-11 42 views
0

我有a.bat具有可變%errorlevel%,並呼籲b.bat以下行:批次開始堅持特定的變量

start /wait cmd /c b.bat 

如果b.bat設置%errorlevel%(如errorlevel = 5

如何是否有可能在a.bat中只保留這個%errorlevel%變量,而不使用CALL命令。

我不想使用CALL的原因是因爲b.bat包含一些我不想保留的變量。

回答

1

您不必公開內部變量以在腳本之間進行通信。您可以使用常規參數將值發送到被調用的腳本,並從%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也評論) 。

+0

嗨,感謝您的答覆。我真正想要的是在b.cmd中更改%OTHERVAR%,並在a.cmd中輸出結果 – MajorInc

1

此答案自從最初發布以來已經被顯着編輯。

你的命令應該像當前編寫的那樣工作,儘管我沒有看到使用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

+0

謝謝dbenham,我實際上希望堅持ERRORLEVEL。所以b.bat實際上正在通過sqlcmd調用幾個查詢。所以我想在這個我應該用你的例子(與CALL)對嗎? (並且它不會與START一起工作) – MajorInc

+0

@MajorInc - 您可以使用START加上我的第一個建議,但是沒有任何優勢。直接使用CMD會更有效率。我仍然喜歡更好地調用b.bat的修改形式。 – dbenham

+0

你知道嗎,我認爲其實就像start/wait cmd/c b.bat一樣簡單。正如你所說的,ERRORLEVEL是一個環境變量,因此是持久性的。我認爲我面臨的問題可能是由於「set errorlevel =%errorsaved%」這一行導致的,我在caller.bat:/ – MajorInc