Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DOS批处理文件未设置计数的值_C#_Batch File - Fatal编程技术网

C# DOS批处理文件未设置计数的值

C# DOS批处理文件未设置计数的值,c#,batch-file,C#,Batch File,我有一个每周运行的批处理作业,用于计算员工一周内的支出 WriteToDBIndex是一个C程序,用于检查其他流程,如财务部门是否已完成数据处理,即输入所有员工的支出数据。如果是,WriteToDBIndex会在emptablestat表中写入一行,如果输入了所有数据,则会显示JobStatusName和status 我需要不断检查此项,直到FINANCE&empstatus=1的计数为1为止。我已将超时设置为3600秒 @ECHO OFF set ERRORLEVEL=0 REM start

我有一个每周运行的批处理作业,用于计算员工一周内的支出

WriteToDBIndex是一个C程序,用于检查其他流程,如财务部门是否已完成数据处理,即输入所有员工的支出数据。如果是,WriteToDBIndex会在emptablestat表中写入一行,如果输入了所有数据,则会显示JobStatusName和status

我需要不断检查此项,直到FINANCE&empstatus=1的计数为1为止。我已将超时设置为3600秒

@ECHO OFF
set ERRORLEVEL=0
REM start "" "C:\WriteToDBIndex.exe"
:gobackloop
set ct=0
if %ERRORLEVEL% NEQ 0 (
Echo There has been an error. 
goto end
)
if %ERRORLEVEL% EQU 0 (
Echo inside errorlevel zero
for /F "usebackq" %%i in (`sqlcmd -E -S "MYDATA\MYDB" -h-1 -Q "SELECT COUNT(*) FROM [dbo].[emptablestat] where JobStatusName like '%FINANCE%' and empstatus=1"`) do set ct=%%i 

if %ct% EQU 1 (
echo starting 1
start "" "C:\CalculateMoneySpent.exe"
timeout /t 60
) 
if %ct% EQU 0 (
timeout /t 3600
goto :gobackloop
)
)
:end
echo END
REM cd ..
即使在emptablestat表中有一个计数,变量ct的值也总是零。我不知道为什么

谢谢 R

首先,阅读上面作为答案写下的内容,因为它解释了为什么在if%ERRORLEVEL%eq 0块中,循环总是以低于0的值读取环境变量ct

第二,看看下面的批处理代码,我根本无法测试它,但希望它能工作

@回音 rem在并行进程中运行WriteToDBIndex.exe。 开始写入数据库索引C:\WriteToDBIndex.exe 如果错误级别为1 回显错误:无法启动WriteToDBIndex.exe! 转到终点 :gobackloop 设置ct=0 对于'sqlcmd-E-S MYDATA\MYDB-h-1-Q中的/F usebackq%%i,请从[dbo].[emptablestat]中选择COUNT*,其中JobStatusName(如'%FINANCE%'和empstatus=1)`do set ct=%i 如果%ct%EQU 1 rem在此过程中运行CalculateMoneySpent。 C:\CalculateMoneyPent.exe 否则,如果%ct%eq 0 timeout.exe/t 3600 goto gobackloop :结束 光盘 我不知道为什么要使用start命令在与此批处理并行运行的单独进程中运行WriteToDBIndex.exe

原因可能是WriteToDBIndex.exe运行时间很长,您希望在WriteToDBIndex.exe终止之前完成此批处理过程

或者WriteToDBIndex.exe是Windows GUI应用程序,这就是使用命令start的原因,尽管我不知道为什么在这种情况下不使用额外的参数/wait来停止批处理文件的执行,直到WriteToDBIndex.exe终止

但我认为您使用命令start是因为不知道调用控制台应用程序时有无start的不同执行行为。因此,我进一步假设calculateMoneyPent.exe是一个控制台应用程序,执行时间短,并且删除了命令start


请参阅我的回答,其中解释了从批处理文件中启动或调用另一批处理文件/console/GUI应用程序的4种可能性。

当我尝试在for循环后回显%ct%时,我将ct的值设置为“1”,而不是“1”。这是什么?sqlcmd-E-S MYDATA\MYDB-h-1-Q SELECT COUNT*从[dbo].[emptablestat]的输出是什么,其中JobStatusName像“%FINANCE%”,empstatus=1?也许不只是你所期望的0或1,而是1。对于测试,我只有一条DB记录。我看不出ct的in值在我的批处理代码中应该来自哪里。我建议将第一行更改为@echo on,打开一个命令提示符窗口,并在此窗口中运行批处理文件。现在你们可以看到真正发生了什么,你们应该知道为什么ct的值不只有1。