如何使用批处理脚本在列对齐的电子邮件正文中发送文本文件内容?

时间:2017-03-18 15:33:13

标签: batch-file

我在服务器上有一个设置,它会注意使用wMailTo控制台应用程序通过邮件从SQL记录发送报告。但现在我担心的是邮件正文没有正确的列对齐,因此很难在Outlook中阅读。文件Report.txt处于正确对齐状态。我在批处理脚本中使用以下行发送电子邮件。

sqlcmd -S ErrorCode1 -E -i C:\Shared\Report.sql -o C:\Shared\Report.txt
findstr.exe /L /C:"DOWN" Report.txt 
if not errorlevel 1 ( 
    wmailto %dbemail% -s"%ServerName% DOWN Alert." -tReport.txt
)

文本文件包含:

IPAddress       ErrorCode        Status       Time           
-----------     -----------      -------      ----------- 
127.0.0.1       0x1548SW581      FullError    12:00:40.03                      
127.0.0.2       0x1548SW5811258  PartialError 12:09:55.42
127.0.0.1       0x1548SW9878     No Error     12:00:40.03

邮件看起来:

IPAddress       ErrorCode    Status       Time           
-----------     -----------      -------      ----------- 
127.0.0.1       0x1548SW581   FullError    12:00:40.03                      
127.0.0.2       0x1548SW5811258       PartialError 12:09:55.42
127.0.0.1       0x1548SW9878       No Error     12:00:40.03

是否有其他免费应用程序负责列对齐?

或者有什么方法可以在RichText中发送邮件来解决这个问题吗?

我确实尝试了更多选项,但没有运气

more /t1  report.txt >output.txt

1 个答案:

答案 0 :(得分:0)

文件C:\Shared\Report.txt包含例如:

IPAddress»    ErrorCode»        Status»        Time
-----------»  -----------»      -------»       -----------
127.0.0.1»    0x1548SW581»      FullError»     12:00:40.03
127.0.0.2»    0x1548SW5811258»  PartialError»  12:09:55.42
127.0.0.1»    0x1548SW9878»     No Error»      12:00:40.03

»和正确的空格数用作占位符,用于数据列之间文本文件中真正存在的水平制表符。

要使用纯文本电子邮件发送文本数据,必须将数据转换为:

IP Address    Error Code        Status         Time
-----------   ---------------   ------------   -----------
127.0.0.1     0x1548SW581       FullError      12:00:40.03
127.0.0.2     0x1548SW5811258   PartialError   12:09:55.42
127.0.0.1     0x1548SW9878      No Error       12:00:40.03

标签被空格替换,另外前两行也略有修改。

实现此目的的批处理代码是:

@echo off
sqlcmd.exe -S ErrorCode1 -E -i C:\Shared\Report.sql -o C:\Shared\Report.txt
%SystemRoot%\System32\findstr.exe /L /C:"DOWN" C:\Shared\Report.txt
if errorlevel 1 goto Done

setlocal EnableExtensions EnableDelayedExpansion
set "TempFile=C:\Shared\Report.tmp"

echo IP Address    Error Code        Status         Time>"%TempFile%"
echo -----------   ---------------   ------------   ----------->>"%TempFile%"

for /F "usebackq skip=2 tokens=1-5" %%A in ("C:\Shared\Report.txt") do (
    set "IpAddress=%%A             "
    set "IpAddress=!IpAddress:~0,11!"
    set "ErrorCode=%%B               "
    set "ErrorCode=!ErrorCode:~0,15!"
    if "%%C %%D" == "No Error" (
        set "Status=No Error    "
        set "Time=%%E"
    ) else (
        set "Status=%%C            "
        set "Status=!Status:~0,12!"
        set "Time=%%D"
    )
    echo !IpAddress!   !ErrorCode!   !Status!   !Time!>>"%TempFile%"
)

wmailto.exe %dbemail% -s"%ServerName% DOWN Alert." -t"%TempFile%"
del "%TempFile%"
endlocal

:Done

命令 FOR 默认使用空格和制表符将行拆分为标记。由于状态No Error,这在这里并不完美。上面的代码考虑了这个例外。

但文件中可能会有更多此类例外。因此,最好只使用水平制表符作为分隔符,如下面的批处理代码所示。

for /F "usebackq skip=2 tokens=1-4 delims=»" %%A in ("C:\Shared\Report.txt") do (
    set "IpAddress=%%A             "
    set "IpAddress=!IpAddress:~0,11!"
    set "ErrorCode=%%B               "
    set "ErrorCode=!ErrorCode:~0,15!"
    set "Status=%%C            "
    set "Status=!Status:~0,12!"
    echo !IpAddress!   !ErrorCode!   !Status!   %%D>>"%TempFile%"
)

注意: FOR 命令的第一行中的»之后的字符delims=必须在批处理文件中被水平制表符替换为工作批处理文件。

要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。

  • del /?
  • echo /?
  • endlocal /?
  • findstr /?
  • for /?
  • goto /?
  • if /?
  • set /?
  • setlocal /?

另请阅读Microsoft有关Using Command Redirection Operators

的文章