在powershell中使用Robocopy Summary发送邮件正文

时间:2017-08-18 04:33:31

标签: powershell email robocopy

我正在使用powershell通过重置任务发送带有Robocopy Summary的邮件。

以下是powershell版本详细信息

Name                           Value
----                           -----
PSVersion                      5.1.15063.502
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.15063.502
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

我的脚本在下面,

$pw = Get-Content .\bumblebee.txt | ConvertTo-SecureString 
$cred = New-Object System.Management.Automation.PSCredential "xyz\abc", $pw
$cont = gc C:\Users\Vinod_DMSE\Desktop\Bat\backup_log_20170816.log -last 12 |%{"$_ <br/>"}|out-String
$encoding = [System.Text.Encoding]::UTF8 
Send-MailMessage -SmtpServer smtp.xyz.com -to "abc@xyc.com" -Credential $cred -from "backupkr.alert@xyz.com" -Subject " Backup Alert" -BodyAsHtml $cont"

这有效,

但是当我收到带有文本对齐问题的邮件正文时。

以下是输出

enter image description here

是否可以像powershell一样获得更多对齐的输出。

enter image description here

提前致谢,

2 个答案:

答案 0 :(得分:2)

正如Ansgar所暗示的那样,这个问题是因为HTML如何处理空间。 Multiple spaces normally created by the spacebar, the tab key and return key are all ignored when you write code. HTML just interprets them all as whitespace between words, and displays a single space.

因此,两种可能的解决方案是使用<pre>标记,它代表预先格式化的文本。在您的脚本的上下文中将如下所示:

$cont = "<pre>$(Get-Content C:\Users\Vinod_DMSE\Desktop\Bat\backup_log_20170816.log -last 12 | ForEach-Object {"$_ <br/>"})</pre>"

否则,您可以使用Non-breaking spaces替换常规空格。

$cont = "$(Get-Content C:\temp\rblog.txt  -last 12 | ForEach-Object {"$($_ -replace '\s','&nbsp;') <br/>"})"

另一个问题可能是使用字符宽度不均匀的字体。将<font>标记与字体系列一起使用,其中每个字符的宽度相同将有助于文本更好地排列。

$cont = "<font face='monospace'>$(Get-Content C:\temp\rblog.txt -last 12 | ForEach-Object {"$($_ -replace '\s','&nbsp;') <br/>"})</font>"

答案 1 :(得分:0)

在@BenH做了一些研究和帮助之后,我已经完成了我的脚本。 我正在分享这个,因为我找不到任何直接解决方案和直接发送robocopy摘要的方法。这种方法非常直接,任何新手都可以使用它。

请参阅下面的主脚本,该脚本从服务器备份文件

::Backup Bat file Created By Vinod Amarathunga 2017-08-11 V 3.0 Improved
::Please do not change anything
@echo off
::Login to the server
NET USE \\server IP\IPC$ /u:server IP\username password
::Backup 
ROBOCOPY "\\server IP\c\Program Files (x86)\source" /S E:\Backup\Backup_%date:~-4,4%%date:~-10,2%%date:~-7,2% /unilog+:"E:\Log\backup_log_%date:~-4,4%%date:~-10,2%%date:~-7,2%.log"
::End the session 
NET USE \\server IP\IPC$ /D
::Archive Backup
"C:\Program Files\WinRAR\WinRAR.exe" a -r E:\TMS_Auto_Backup\Zip\Zip_Backup_%date:~-4,4%%date:~-10,2%%date:~-7,2%.rar E:\TMS_Auto_Backup\Backup\Backup_%date:~-4,4%%date:~-10,2%%date:~-7,2%
forfiles /p E:\Backup /s /m *.* /D -7 /C "cmd /c del @path"
::Call mail script
powershell -ExecutionPolicy ByPass -Command "C:\mail.ps1" 
pause

此脚本将删除超过7天的文件。 如果您愿意,可以在下面注释或删除

forfiles /p E:\TMS_Auto_Backup\Backup /s /m *.* /D -7 /C "cmd /c del @path"

为了存档备份,我使用了WinRar。

为了发送robocopy摘要,我已经写了一篇来自powershell的另一个脚本 从主脚本开始,下面的行将被调用以运行发送邮件

 powershell -ExecutionPolicy ByPass -Command "C:\mail.ps1"

以下是邮件脚本

#Poweshell V 1.0 Script created by Vinod Amarathunga V3.0 Improved
$pw = Get-Content .\bumblebee.txt | ConvertTo-SecureString 
$cred = New-Object System.Management.Automation.PSCredential "user name", $pw 
$date = Get-Date -format "yyyyMMdd"
$cont = "<font face='monospace'>$(Get-Content C:\Bat\backup_log_$date.log -last 12 | ForEach-Object {"$($_ -replace '\s','&nbsp;') <br/>"})</font>"
$encoding = [System.Text.Encoding]::UTF8 
Send-MailMessage -SmtpServer mail.xyz.com -to "abc@xyz.com" -Credential $cred -from "backup.alert@xyz.com" -Subject "Backup Summary" -BodyAsHtml "$cont"

下面的行将有助于识别给定日期的日志,

 $cont = "<font face='monospace'>$(Get-Content C:\Bat\backup_log_$date.log -last 12 | ForEach-Object {"$($_ -replace '\s','&nbsp;') <br/>"})</font>"

此日期应为yyyymmdd格式,此格式化日期必须为

$date = Get-Date -format "yyyyMMdd"

执行了预定的enter image description here任务后,我收到了邮件到我的邮箱

互联网上有更多可用的资源,但我认为这是迄今为止最直接的方法。

要访问我的邮件帐户,需要拥有用户名和passowrd。 Powershell不允许使用普通密码以下链接将帮助我了解如何使用加密密码

https://www.pdq.com/blog/secure-password-with-powershell-encrypting-credentials-part-1/