通过批处理文件计算受日志文件影响的行

时间:2014-11-26 09:24:15

标签: sql batch-file cmd sqlcmd logfile

我敢打赌,这太简单了,但我不能把它放在一起:

在运行脚本时使用批处理文件时,如何计算受影响的行将其置于日志文件中。

xxx_proc.bat

@echo off 

echo Running script in THENW

echo %DATE% tprdcr.sql executed > Logfile.txt

isql -UEMXXX2 -PEMXXX2 -SKXXXXXXDB02 -Jcp8x50 -w20x00 -itprdcr.sql >> Logfile.txt

echo tprdcr.sql Generated successfully

pause

EXIT /B

LOGFILE.TXT

enter image description here

结果非常多,所以我只想显示 [nn rows affected] 。此外,如果一个更新语句中出现错误,它将绕过计数并显示错误。

2 个答案:

答案 0 :(得分:0)

如果您希望原始日志文件保持不变,那么您可以使用:

@echo off
@setlocal EnableDelayedExpansion

::Other code here

set count=0
for /f "tokens=*" %%r in ('type Logfile.txt ^| findstr /i "row affected"') do (
for /f "tokens=1 delims=^( " %%c in ("%%r") do set /a count+=%%c
)
echo Total rows affected: !count!
echo Total rows affected: !count!>>Logfile.txt
pause
exit /b

可选地,如果您想绕过将每个受影响的行写入日志文件,并且只写一行说明受影响的行数,您可以改为使用它:

@echo off
@setlocal EnableDelayedExpansion

::Other code here

set count=0
for /f "tokens=*" %%r in ('isql -UEMXXX2 -PEMXXX2 -SKXXXXXXDB02 -Jcp8x50 -w20x00 -itprdcr.sql ^| findstr /i "row affected)"') do (
for /f "tokens=1 delims=^( " %%c in ("%%r") do set /a count+=%%c
)
echo Total rows affected: !count!
echo Total rows affected: !count!>>Logfile.txt
pause
exit /b

希望这有帮助。

答案 1 :(得分:0)

我怀疑您可以使用.sql文件修改输出以使您的生活更轻松。但是如果你想现在使用日志文件......

在您展示错误的内容之前,我们无法建议如何绕过错误。

这是一个获得总计数的纯批处理方法:

set /a cnt=0
for /f "delims=( " %%N in (
  'findstr  /c:"^(1 row affected)" /c:"^([0-9][0-9]* rows affected)" "Logfile.txt"'
) do set /a cnt+=%%N
echo %%N rows affected

您也可以使用我的JREPL.BAT utility

jrepl "\((\d+) rows? affected\)" "total+=Number($1);false" /jmatch /jbeg "total=0" /jend "output.WriteLine(total+' rows affected')" /f "Logfile.txt"

如果需要捕获变量中的总数,可以将上述命令放在FOR / F循环中:

for /f %%N in (
  'jrepl "\((\d+) rows? affected\)" "total+=Number($1);false" /jmatch /jbeg "total=0" /jend "output.WriteLine(total+' rows affected')" /f "Logfile.txt"'
) do set total=%%N
echo %total%