2009-04-08 87 views
4

我有一個批處理文件在Visual Studio自定義生成步驟中運行,以將文件複製到安裝目錄中。我希望它在複製失敗時正確地出錯。與我有選擇的問題是:如何在Visual Studio(2008 SP1)項目中從.bat返回錯誤?

  • exit 1
    這個工程構建順序以內罰款,但有時我想通過命令行或從另一個批處理使用批處理文件,並在這些情況下, exit也會導致調用者退出。

  • exit /b 1
    這在命令行或從另一個批處理文件工作得很好,但Visual Studio中不識別的返回碼不是0(即它的報告具有工程「0錯誤(S)」) 。

我碰到那個爲我提供了一個解決方案的鏈接:http://www.nabble.com/Re:-bjam-and-Windows-p17457249.html

本質上,它說我必須做exit /b之前呼應的錯誤消息。例如,

echo MyProj : error : could not copy files. 

有誰知道到底什麼消息格式觸發Visual Studio識別錯誤?

我試過調整這個和一些工作,有些不這樣做。似乎它必須匹配類似

.*\: .*error.*\: 

這是否記錄在任何地方?

謝謝。

這是Windows XP Pro SP3上的Visual Studio 2008 SP1(如果cmd.exe在Windows版本之間有不同的行爲)。

+0

@Owen,我不知道答案,但是如果你指定你正在使用的VS的版本,它可能會有所幫助。答案可能會有所不同,具體取決於VS的確切版本。 – 2009-04-08 00:46:26

+0

好點。這是VS 2008。 – Owen 2009-04-08 01:01:24

回答

2

關於您的實際問題,從過程的返回值,
This page指定了VS所期望的完整語法作爲構建工具的輸出。

1

你確定你正確地測試了嗎? 我剛剛試過這個批處理文件:

echo bla 
exit /b 1 

與VS2008,作爲預生成步驟,並且得到這個:

1>------ Build started: Project: XXXX, Configuration: Debug Win32 ------ 
1>Performing Pre-Build Event... 
1>bla 
1>Project : error PRJ0002 : Error result 1 returned from 'C:\Windows\system32\cmd.exe'. 
1>Build log was saved at "file://c:\XXXXX\BuildLog.htm" 
1>XXXXX - 1 error(s), 0 warning(s) 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

我也試圖與一個自定義生成步驟文件具有相同的確切結果。
應該指出,我用VS2008- SP1所以這可能是不同的。

+0

有趣。這是目前在文件上的自定義構建步驟。我嘗試了它作爲構建事件並得到了相同的結果。我甚至嘗試將腳本改爲正是你所擁有的。 但是,我很確定它在我的機器上不起作用。只需修改「回顯」行即可更改結果。 – Owen 2009-04-08 01:45:25

1

通常,批處理文件的返回值是從批處理文件中執行的最後一個命令的返回值。

退出應該工作,但如果沒有,不管什麼原因,你總是可以使用助手程序來設置你的返回值。

早在DOS時代,您可以將ECHO與CHOICE命令結合使用來設置您的返回值,但唉,它不再是Windows的一部分。

所以你可以寫一個小程序。這些東西把所需的返回值作爲參數,然後設置並返回作爲返回值:

#include <cstdio> 

int main(int argc, char * argv[]) { 

    if (argc == 2) { 

     return strtoul(argv[1], NULL, 10); 

    } else { 
     return 0; 
    } 
} 

然後在批處理文件中,你只需要調用與所需的返回值的程序,並跳轉到最後。

+0

有趣!這確實有效。我真的不知道「exit/b」是什麼問題...... – Owen 2009-04-08 15:03:05

2

你可以嘗試的另一件事情是這樣的:

set errorlevel=1 
exit /b 

這基本上已經是什麼@Bill表明同樣的效果。最後的程序運行的返回值被設置爲所謂%errorlevel%環境變量,然後當你退出CMD.EXE這是(這是VS讀取)

+0

與「exit/b 1」一樣的問題:它不起作用。但是,如果我「設置errorlevel = 1」,然後「退出」,它會起作用。 – Owen 2009-04-08 14:39:44

0

由於某些原因,exit /b 12在寫入後構建步驟時未設置退出代碼。經常的exit 12會工作。

所以正確地從bat文件返回退出代碼,你應該這樣寫:

​​

call命令是重要的,當運行該批處理文件,它會創建一個新的上下文bat文件中,所以當你運行在bat文件中運行exit /b 1,它將退出該上下文,而不是整個命令解釋器。然後,您可以比較錯誤級別並退出。

相關問題