如何在 Powershell 中使用 Get-ChildItem 将文件附加到电子邮件

How to attach files to email using Get-ChildItem in Powershell

我正在尝试编写执行以下操作的 Powershell 脚本:

  1. 检查目录中所有文件的有效字符串
  2. 获取包含该有效字符串的每个文件,然后将它们作为电子邮件附件发送

我不在乎是用一封电子邮件发送所有有效文件,还是为每个有效文件发送一封电子邮件。

以下代码是我的代码,但在尝试附加文件时出错,提示 Send-MailMessage:找不到驱动器。名称为 '

的驱动器
$ValidFiles = Get-ChildItem -Path C:\Results -Recurse |
                Select-String -Pattern "Test" |
                  Select-Object -Unique Path

foreach ($ValidFile in $ValidFiles)
{

    $From = 'test <test@test.com>'
    $To = 'me <me@test.com>'
    $Subject = "Valid File Found"
    $Username = "Test-Domain\test"
    $Password = ConvertTo-SecureString "notrealpassword" -AsPlainText -Force
    $Creds = New-Object System.Management.Automation.PSCredential($username, $password)
    $Body = "Please review the attached files"
    $Attachment = $ValidFile | Out-String
    $SMTPServer = "test-com.mail.protection.outlook.com"

    Send-MailMessage -From $From -To $To -Subject $Subject -Credential ($Creds) -Attachments $Attachment -UseSsl -Body $Body -DeliveryNotificationOption OnSuccess, OnFailure -SmtpServer $SMTPServer
}

非常感谢任何帮助。

外字符串阻止 $Attachment 被填充。

$Attachment = $ValidFile | Out-String

尝试

 $Attachment = $ValidFile

首先,确保$ValidFiles只包含字符串(文件路径):

$ValidFiles = Get-ChildItem -Path C:\Results -Recurse | 
                Select-String -List -Pattern "Test" | 
                  ForEach-Object Path
  • -List 添加到 Select-String 使搜索在给定文件中找到的 第一个 匹配处停止,从而避免了需要Select-Object -Unique.

  • Select-Object outputs [pscustomobject] instances with the specified property/properties, even if only one property Path is specified; while you could use -ExpandProperty Path instead to get just the .Path property value, it is simpler to use ForEach-Object 改为 属性 名称。

然后,使用 $ValidFile - 现在是路径 string - direct 作为 -Attachments 参数(这是 [string[]] 类型的,但也接受标量 [string] 实例(单个字符串))。

  • 一般来说,不要使用Out-String,除非你想要一个格式化以显示输入对象的表示).