2009-12-17 45 views
5

如果我做一個批處理腳本命名temp.bat(例如)包含:爲什麼cmd.exe在64位機器上具有不同的錯誤級別行爲?

exit /b 1 

當我以不同的方式運行它,我讓我的32位XP系統上與64位不同的行爲XP系統。

在32位:

> temp.bat 
> echo %ERRORLEVEL% 
1 
> cmd /c temp.bat 
> echo %ERRORLEVEL% 
0 

在64位:

> temp.bat 
> echo %ERRORLEVEL% 
1 
> cmd /c temp.bat 
> echo %ERRORLEVEL% 
1 

我已經通過CMD.EXE選項搜查,我一直無法找到任何選項來控制如何從批處理腳本傳播錯誤級別信息。在這一點上,我無法找到任何合理的解釋這種差異。

+0

我的猜測:保持原始行爲的32位版本是由於向後兼容性。 64位版本沒有這個要求,所以對自動化腳本的行爲更友好。 – 2009-12-17 21:04:30

+0

啊哈!雷蒙德的女兒[http://blogs.msdn.com/oldnewthing/archive/2003/12/24/45779.aspx]對雷蒙德的伴娘[http://blogs.msdn.com/oldnewthing/archive/2009/12/02 /9931184.aspx#9931572] – 2009-12-18 07:19:25

+0

這裏不能重現。在32位和64位上工作相同。 – Joey 2009-12-18 08:57:15

回答

7

你必須小心退出/ b,因爲它在所有情況下都不能正常工作。例如:

temp.bat&&echo 0||echo 1

如果temp.bat包含退出/ B 1,你會期望1要打印的,但事實並非如此。可悲的是,真正設置批處理文件的工作退出代碼的唯一方法是使用@%COMSPEC% /C exit 1作爲最後的批處理文件中的行

+0

非常好,我試過你的建議,它在兩臺機器上的工作原理都是一樣的。 – paraquat 2009-12-21 14:45:04

3

Anders的示例的問題是它使用.bat文件。如果您使用.cmd文件,則退出按文檔所述工作。

同時具有.bat和.cmd文件的要點似乎是向後兼容性:如果它正在執行.bat文件,cmd會嘗試模擬NT之前的CLI command.com,它具有更簡單的錯誤處理。

至少這是我的猜測。我在搜索官方文檔的時候偶然發現了這個線程,這些文件都是我無法找到的.bat/.cmd文件。

相關問題