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

本文关键字:设置 批处理文件 DOS | 更新日期: 2023-09-27 18:16:03

我有一个批处理作业,每周运行一次,以计算员工一周内花费的钱。

WriteToDBIndex是一个 C# 程序,用于检查其他流程,例如财务是否已完成数据处理(即输入所有员工的支出数据(。如果是,WriteToDBIndex ,如果输入了所有数据,则emptablestat表中写入一行,并带有 JobStatusName &status

我需要继续检查这一点,直到计数FINANCE & empstatus=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 ..

可变 ct 的值不知何故总是为零,即使我在表中计数为 1 emptablestat。我不知道为什么。

谢谢R

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

首先,阅读 MC ND 在批量导致问题的 IF 语句上写的答案。单独运行时有效?因为它解释了为什么环境变量 ct 总是在if %ERRORLEVEL% EQU 0块中的循环下方读取值 0 for

其次,请参阅下面的批处理代码,我根本无法测试,但希望可以工作。

@echo off
rem Running WriteToDBIndex.exe in a parallel process.
start "Write to DB index" "C:'WriteToDBIndex.exe"
if errorlevel 1 (
   echo Error: Failed to start WriteToDBIndex.exe!
   goto end
)
:gobackloop
set ct=0
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 (
   rem Running CalculateMoneySpent in this process.
   "C:'CalculateMoneySpent.exe"
) else if %ct% EQU 0 (
   timeout.exe /t 3600
   goto gobackloop
)
:end
cd ..

我不确定为什么您使用命令start在与此批处理并行运行的单独进程中运行WriteToDBIndex.exe

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

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

但我想你已经使用了命令start,因为根本不知道调用有或没有start的控制台应用程序的不同执行行为。因此,我进一步假设CalculateMoneySpent.exe是一个控制台应用程序,执行时间短,并且删除了命令start

请参阅我的答案 如何在当前批处理文件的父文件夹中调用批处理文件?,其中我解释了从批处理文件中启动调用另一个批处理文件/控制台/GUI应用程序的4种可能性。