我在服务器上有一个设置,它会注意使用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
答案 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。
的文章