2017-08-09 158 views
0

我有一个调用C#程序的批处理文件。这个C#程序调用SQL Server数据库。 有时它无法连接到数据库,并且异常处理程序打印堆栈跟踪并退出c#程序。我想尝试运行这个程序最多5次。 如果成功(5次尝试之前),则转到下一步(CheckStatus),然后出错并退出。调用C#程序后的批处理文件错误处理

当我运行这个时,即使C#程序有错误,它也会将%ERRORLEVEL%打印为零。

@ECHO OFF 

SET Header=----------------------------------------------------- 
SET Logfile=C:\LOG\log.txt 
set %ERRORLEVEL% = 0 

echo %header% 
ECHO Running the batch file >> %Logfile% 

if '%1' == '' goto usage 
if '%2' == '' goto usage 
if '%1' == '/?' goto usage 
if '%1' == '-?' goto usage 
if '%1' == '?' goto usage 
if '%1' == '/help' goto usage 


SET SQLServer=dbsql\production 
SET SQLUser=user1 
SET SQLPass=pwd1 
SET SQLCommandMaster=osql -S%SQLServer% -n -U%SQLUser% -P%SQLPass% -b -i 


GOTO %1% 
:Start 
Set count=0 

:RunCSharpProgram 
set /a count+=1 
ECHO starting RunCSharpProgram count >> %Logfile% 
timeout /t 10 
SET RunningStep="RunCSharpProgram" 
start "" "C:\CSharpProject\GetData\GetData\bin\Debug\GetData.exe" 
ECHO %ERRORLEVEL% >> %Logfile% 
IF %ERRORLEVEL% ==1 and count LEQ 5 (GOTO RunCSharpProgram) 
IF %ERRORLEVEL% ==1 and count EQ 5 (GOTO error) 
IF %ERRORLEVEL% ==0 (GOTO CheckStatus) 

:CheckStatus 
ECHO Check Status of tables >> %Logfile% 
REM %SQLCOMMANDMASTER% /Q "EXEC TestDB.dbo.CheckStatus" 
goto end 

:usage 
echo Usage: %0 'start step' 'end step' 
goto end 

:error 
REM --------------------------------------------------------------------- 
ECHO ERROR RUNNING BatchFileTest.BAT >> %Logfile% 


:end 
echo %header% >> %Logfile% 
echo END >> %Logfile% 

不确定这个批处理文件有什么问题。 谢谢 MR

+1

的可能的复制[我如何从一个Windows命令行应用程序退出代码? ](https://stackoverflow.com/questions/334879/how-do-i-get-the-application-exit-code-from-a-windows-command-line) – Gusman

+1

可能重复[如何指定在.NET中退出控制台应用程序的代码?](https://stackoverflow.com/questions/155610/how-do-i-specify-the-exit-code-of-a-console-ap网络中的折叠) – mjwills

+0

这两个都不回答我的问题,我试图从批处理文件中调用.NET程序 – user2726975

回答

3

当你使用start时,它会启动一个新的shell来运行你的程序。

Official documentation

启动另一个命令提示窗口来运行指定程序或命令。

由于它是一个独立的命令提示符下,你会找回错误代码。所以,简单的解决方案不使用启动

代替

start "" "C:\CSharpProject\GetData\GetData\bin\Debug\GetData.exe" 

你可以使用

"C:\CSharpProject\GetData\GetData\bin\Debug\GetData.exe"