用于发送包含文件夹中文件列表的电子邮件的 Powershell 脚本 - 格式问题
Powershell script to send email with list of files in a folder - formatting issue
感谢您抽出时间来看我的问题。
我有一个 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
我不一定需要列表中的 "Mode" 或 "Length",只需一个创建日期和文件名的列表就可以满足我的目的。 table 将输出输出到控制台,但是电子邮件的正文是这样的:
file1.txt file2.ps1 file3.txt file4.txt
这使得处理文件列表变得困难,尤其是在文件很多的情况下。
我还不是很擅长 powershell,但我已经尝试了所有我能找到的东西,我知道它必须是简单的东西。
感谢您的帮助。
这是一种可行的方法:将所有文件放在一个数组中
$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";
}
感谢您抽出时间来看我的问题。
我有一个 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
我不一定需要列表中的 "Mode" 或 "Length",只需一个创建日期和文件名的列表就可以满足我的目的。 table 将输出输出到控制台,但是电子邮件的正文是这样的:
file1.txt file2.ps1 file3.txt file4.txt
这使得处理文件列表变得困难,尤其是在文件很多的情况下。
我还不是很擅长 powershell,但我已经尝试了所有我能找到的东西,我知道它必须是简单的东西。
感谢您的帮助。
这是一种可行的方法:将所有文件放在一个数组中
$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";
}