我有一个Powershell脚本,用于检查文件夹中的文件,如果任何文件超过3小时,则会发送电子邮件。
唯一的问题是,在尝试输出到电子邮件正文时,我似乎无法正确格式化。
这是脚本:
$emailSmtpServer = "emailserver.com"
$emailSmtpUser = "email@domain.com"
$emailSmtpPass = "password"
$emailSmtpServerPort = "587"
$emailFrom = "email@domain.com"
$emailTo = "email@domain.com"
$SMTPClient = New-Object System.Net.Mail.SmtpClient( $emailSmtpServer , $emailSmtpServerPort )
$SMTPClient.EnableSsl = $true
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential( $emailSmtpUser , $emailSmtpPass );
$limit = (Get-Date).AddHours(-3)
$path = "C:\folder"
$files = (Get-ChildItem -Path $path -Recurse | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit })
#$files | ft
if ($files -ne $NULL)
{
$emailMessage = New-Object System.Net.Mail.MailMessage( $emailFrom , $emailTo )
$emailMessage.Subject = "list of files"
$emailMessage.IsBodyHtml = $true
$emailMessage.Body = "Here is a list of the files: <p> $files"
$SMTPClient.Send( $emailMessage )
}
注释掉的行(#$ files | ft)会将输出格式化为这样
PS C:\test> .\filecheck.ps1
Directory: C:\test
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 4/20/2015 7:43 PM 1430 file1.txt
-a--- 4/20/2015 7:44 PM 1430 file2.ps1
-a--- 4/19/2015 11:29 PM 3551 file3.txt
-a--- 4/19/2015 11:28 PM 2078 file4.txt
我不一定需要&#34; Mode&#34;或&#34;长度&#34;在列表中,只需创建日期和文件名列表就可以了。该表输出到控制台,但电子邮件的正文如下:
file1.txt file2.ps1 file3.txt file4.txt
这使得难以处理文件列表,特别是如果有很多文件。
我在powershell上并不擅长,但我已经尝试了所有我能找到的东西,我知道它必须是简单的东西。
我感谢任何帮助。
答案 0 :(得分:1)
这是一种可行的方法:将所有文件放在数组中
$files = @(Get-ChildItem -Path $path -Recurse | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $limit })
然后创建电子邮件正文,循环浏览文件数组,并为每个文件写一行,并附上您需要的详细信息,例如
$mailBody = "";
foreach ($file in $files) {
$mailBody += "file name: $($file.Name); last write time: $($file.LastWriteTime)`r`n";
}