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

Batch file 如何使用批处理脚本以列对齐方式发送电子邮件正文中的文本文件内容?,batch-file,Batch File,我在服务器上有一个设置,它负责使用控制台应用程序通过邮件从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 (

我在服务器上有一个设置,它负责使用控制台应用程序通过邮件从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

文件
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的命令使用空格和制表符将行拆分为标记。由于状态
无错误
,因此此处不完美。上面的代码考虑了这个异常

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

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%"
)
注意:命令的第一行中的
delims=
之后的
字符必须在批处理文件中替换为工作批处理文件的水平制表符

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

  • del/?
  • echo/?
  • endlocal/?
  • findstr/?
  • 获取/?
  • goto/?
  • 如果/?
  • 设置/?
  • setlocal/?

另请阅读有关Microsoft的文章。

文件
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的命令使用空格和制表符将行拆分为标记。由于状态
无错误
,因此此处不完美。上面的代码考虑了这个异常

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

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%"
)
注意:命令的第一行中的
delims=
之后的
字符必须在批处理文件中替换为工作批处理文件的水平制表符

要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面

  • del/?
  • echo/?
  • endlocal/?
  • findstr/?
  • 获取/?
  • goto/?
  • 如果/?
  • 设置/?
  • setlocal/?

另请阅读Microsoft关于的文章。

电子邮件中的纯文本的外观取决于电子邮件格式(纯文本、RTF或HTML),收件人或您定义的字体(纯文本)以及正确格式标记(RTF和HTML)的使用。默认字体通常是成比例的,每个字符都有自己的宽度,导致纯文本电子邮件内容与不包含特殊对齐标记的空格对齐看起来不太好。我已经给出了更多详细信息,我不知道如何在Wmailto.exe中定义邮件格式,是否有任何特定的命令要定义,我请求您帮助我,并将我发送到正确的方向。我假设文本文件内容与纯文本电子邮件一起发送,并且我假设电子邮件的接收者已经配置了固定宽度的字体,用于查看/编辑纯文本电子邮件。最后,我假设文件
Report.txt
使用水平制表符来对齐数据列,而不是空格。在这种情况下,用于查看
Report.txt
和Outlook的应用程序的不同制表位值是导致数据显示不对齐的原因。如果我所有的猜测都是正确的,在通过电子邮件发送
Report.txt
中的行之前,您需要用空格替换制表符。是的,您的假设是正确的,但我确实在SQL Server Management Studio中进行了更改,但Report.txt仍在制表符中生成缩进,请帮助如何在查询中执行此操作,我没有选择工具-->选项-->纯文本-->选项卡。或者有没有办法将纯文本转换为富文本?这会有帮助,或者我们可以使用批处理脚本删除带空格的选项卡。请告诉我正确的路径。电子邮件中的纯文本的外观取决于电子邮件格式(纯文本、RTF或HTML)、接收者定义的字体(纯文本)或您定义的字体(RTF和HTML)以及正确格式标记(RTF和HTML)的使用。默认值通常是一种比例字体,每个字符都有自己的宽度,从而生成纯文本