【问题标题】:count the row affected put in Log File through batch file通过批处理文件计算受影响的行放在日志文件中
【发布时间】:2014-11-26 09:24:14
【问题描述】:

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

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

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

日志文件.txt

结果很多,所以我只希望它显示 [nn 行受影响]。此外,如果一个更新语句中出现错误,它将绕过计数并显示错误。

【问题讨论】:

  • 从命令行以for /F "tokens=*" %G in ('type Logfile.txt') do @echo "%G" 开始(要在“.bat”批处理中运行,您应该将所有% 符号加倍:使用%%G)。然后您可以通过例如优化结果过滤源'^|查找'或汇总受影响的行数等。随时用实际成就更新您的问题,并在您遇到问题时提出更多问题。 Read more ...

标签: sql batch-file cmd sqlcmd logfile


【解决方案1】:

我怀疑你可以对你的 .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%

【讨论】:

    【解决方案2】:

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

    @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
    

    希望这会有所帮助。

    【讨论】:

    • 为什么有两个 FOR /F 循环?即使它没有在 OP 的示例中显示,您也可能需要在日志文件中考虑 (10 rows affected) 之类的内容。复数与您的 FINDSTR 搜索字符串不匹配。
    • @Ketsuban 谢谢。它按我的预期工作,我使用第二个,但都很好。
    • Doh - 我忘了你没有使用 /c 选项,所以它会搜索任何包含“行”的行做作的”。但这可能不太好,具体取决于日志中可能出现的其他文本。
    猜你喜欢
    • 1970-01-01
    • 2020-02-19
    • 2014-08-22
    • 1970-01-01
    • 2013-03-01
    • 2012-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多