2014-11-23 27 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%