2014-11-23 37 views
1

我有以下的.bat文件正被從另一個.vbs文件調用的命令。我的要求是停止執行以下行,並通過將某些內容寫回命令提示符或彈出(如果msbuild/t:clean未完成執行沒有任何問題,則彈出首選項)來通知用戶。我想在添加if條件後執行msbuild/p:configuration=%1。成功完成後,我還想通過命令提示符或彈出警報通知用戶整個過程已成功或失敗。這些可以完成嗎?如何從Windows命令返回布爾結果?

call "%VS130COMNTOOLS%\vsvars32.bat" 
cd c:\working\develop 

msbuild/t:clean 
msbuild/p:configuration=%1 
+0

'msbuild'提供一個錯誤級別? (把'echo%errorlevel%'放到下面一行並試試)大多數程序如果成功則返回'0'或者任何失敗返回「非零」。 – Stephan 2014-11-23 08:18:07

+0

@Stephan,我想知道錯誤代碼的一樣。幾個小時的研究顯示了一系列的失敗錯誤代碼,但廣泛的共識(特別是在MSDN)成功完成返回errorlevel 0. – sjoy 2014-11-23 10:35:43

+0

@sjoy,是的,每個開發人員都可以自由選擇他們想要的(或使用任何錯誤級別一個退出代碼)。只有認爲「0」才能成功,但是一旦我甚至看到錯誤級別「1」表示「成功」...... – Stephan 2014-11-23 10:47:02

回答

3

以下批處理文件應該做你所需要的。它會在每個msbuild作業之後檢查是否成功完成,如果作業失敗(由errorlevel> 0指示),則通知用戶(在CMD窗口中)並退出。當兩個作業完成時,它都會告訴用戶。

你說,「我已經按照一個bat文件的命令」,所以我認爲這是從VBS文件名爲蝙蝠,它包括調用vsvars32.bat。如果這個 vsvars32.bat,顯然你需要刪除這個調用並把剩餘的代碼放到那個bat中。

@echo off 
    cls 
    echo. &echo 
     call "%VS130COMNTOOLS%\vsvars32.bat" 
     cd c:\working\develop 
     :: Job 1 
      set errorlevel=0 
      msbuild/t:clean 
       If %errorlevel% NEQ 0 set "job=msbuild/t:clean" &goto err 
     :: Job2 
      set errorlevel=0 
      msbuild/p:configuration=%1 
       If %errorlevel% NEQ 0 set "job=msbuild/p:configuration=%1" &goto err 
     :: Success 
      echo msbuild jobs completed successfully 
      echo Will exit when you press any key. &pause >nul &exit 
:err 
     echo ERROR: %job% failed to complete 
     echo Will exit when you press any key. &pause >nul 
exit 
+0

設置錯誤級別爲0時總是返回錯誤級別,總是成功的。但是,我刪除了該錯誤,並從msbuild獲得錯誤級別,該錯誤級別爲'0',失敗並獲得預期結果。謝謝! – Saifur 2014-11-24 16:36:02

+0

@Saifur嗯...只是想確保這段代碼適合其他人。如果0這些作業失敗,那麼'If%errorlevel%NEQ 0'行不起作用 - 'NEQ 0'(不等於0)將檢測成功。如果它起作用,那麼你的錯誤級別必須是0.你是否也將'NEQ 0'改爲'EQU 0'?如果是,我會在這裏修復代碼。 thx – sjoy 2014-11-24 19:54:23

+1

@Saifur我認爲'set'的概率是'errorlevel = 0'附近的引號。我回答了他們。 – sjoy 2014-11-24 20:01:01

1

msbuild返回成功完成一個零退出代碼,和在發生錯誤的情況下的非零退出代碼,所以像這樣應該做的:

call "%VS130COMNTOOLS%\vsvars32.bat" 
cd c:\working\develop 

msbuild /t:clean 
set "rc=%errorlevel%" 
if %rc% neq 0 goto END 
msbuild /p:configuration=%1 
set "rc=%errorlevel%" 

:END 
exit /b %rc%

或(使用延遲擴展)像這樣:

setlocal EnableDelayedExpansion 

call "%VS130COMNTOOLS%\vsvars32.bat" 
cd c:\working\develop 

msbuild /t:clean 
set "rc=%errorlevel%" 
if %rc% equ 0 ( 
    msbuild /p:configuration=%1 
    set "rc=!errorlevel!" 
) 

exit /b %rc%