【问题标题】:DOS batch file not setting the value of countDOS批处理文件未设置计数值
【发布时间】:2014-08-01 15:37:41
【问题描述】:

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

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

我需要继续检查,直到 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 表中的计数为 1 之后,变量 ct 的值也总是为零。我不知道为什么。

谢谢 回复

【问题讨论】:

    标签: c# batch-file


    【解决方案1】:

    首先,阅读MC NDIF statement in batch causing issues. Works when ran individually? 上作为答案写的内容,因为它解释了为什么在if %ERRORLEVEL% EQU 0 块中的for 循环中总是以低于for 的值0 读取环境变量ct

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

    @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

    请参阅我在 How to call a batch file in the parent folder of current batch file? 上的回答,其中我解释了从批处理文件中启动调用另一个批处理文件/控制台/GUI 应用程序的 4 种可能性。

    【讨论】:

    • 当我在 for 循环后尝试 Echo %ct% 时,我得到 ct 的值为 '(1' 而不是 '1'。那是什么??
    • sqlcmd -E -S "MYDATA\MYDB" -h-1 -Q "SELECT COUNT(*) FROM [dbo].[emptablestat] where JobStatusName like '%FINANCE%' and empstatus=1" 的输出是什么?也许不只是你所期望的01
    • 它是一个。为了测试,我在 DB 中只有一条记录。
    • 我看不到我的批处理代码中 ct 的值中的 ( 应该来自哪里。我建议将第一行更改为@echo on,打开命令提示符窗口并在此窗口中运行批处理文件。现在您可以看到实际发生的情况,您应该明白为什么 ct 不只是 1 作为值。
    猜你喜欢
    • 1970-01-01
    • 2010-09-13
    • 2014-11-09
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 2012-01-10
    相关资源
    最近更新 更多