Powershell脚本用于发送包含文件夹中文件列表的电子邮件 - 格式化问题

时间:2015-05-07 06:02:09

标签: email powershell formatting

谢谢你花时间看我的问题。

我有一个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上并不擅长,但我已经尝试了所有我能找到的东西,我知道它必须是简单的东西。

我感谢任何帮助。

1 个答案:

答案 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";
}