【问题标题】:Adding multiple attachments to email with paths from txt file via powershell通过 powershell 使用 txt 文件中的路径向电子邮件添加多个附件
【发布时间】:2019-04-29 09:12:04
【问题描述】:

使用 powershell 我想扫描一个包含多个 txt 文件(备份日志文件)的文件夹,并在出现错误时创建一封电子邮件,其中包含包含附加到邮件的错误消息的特定 txt 文件。

目前我识别日志文件并将它们的路径写入单独的 txt 文件。

Get-ChildItem $pfad -Filter *Error*.txt -Recurse | Select-String "Error occured" | Select-Object -expandproperty Path | Out-File -FilePath $filelist

我得到一个包含这个的 txt 文件(没有标题,没有空行):

D:\Share\test2\Neues TextdokumentError.txt
D:\Share\test2\Testfile fbibgfwErroriebgfvibfvsbvf full.txt

然后我想创建一封电子邮件并附加来自该单独 txt 文件的文件。

$logfiles = Get-Content $filelist

ForEach($log in $logfiles)
  {
  Write-Host “Attaching File :- ” $log
  $attachment = New-Object System.Net.Mail.Attachment –ArgumentList $log
  $msg.Attachments.Add($attachment)
  }

这是我不断得到的结果:

Attaching File :-  D:\Share\test2\Neues TextdokumentError.txt
Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
In C:\test\Unbenannt1.ps1:43 Zeichen:3
+   $msg.Attachments.Add($attachment)
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

Attaching File :-  D:\Share\test2\Testfile fbibgfwErroriebgfvibfvsbvf full.txt
Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
In C:\test\Unbenannt1.ps1:43 Zeichen:3
+   $msg.Attachments.Add($attachment)
+   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

在英语中,错误的意思是:“不可能为具有 NULL 的表达式调用方法。”

显示的路径是正确的,文件在那里并且有内容。

感谢您的帮助!

【问题讨论】:

  • 我不熟悉 System.Net.Mail.Attachment。我个人在 PowerShell 中使用 Send-MailMessage cmdlet。但在我看来,$msg 没有被声明。你在代码的什么地方声明了 $msg?
  • 这条线是否有效>>> New-Object System.Net.Mail.Attachment –ArgumentList $log
  • @BernardMoeskops 我在定义邮件设置的部分将变量从 $msg 更改为 $mailmessage 并忽略了附件循环中的旧变量.... 1.5 小时直到我放弃.当我纠正它时,它立即起作用。谢谢你! :)

标签: powershell


【解决方案1】:

您的文件路径中似乎有空格。如果在定义$attachment 时将"$log" 放在引号中会怎样?

更好的解决方案: 为避免从文本文件中解析字符串而大惊小怪,不要将文件列表输出为文本。只需使用文件系统对象。

$logfiles = Get-ChildItem $pfad -Filter *Error*.txt -Recurse | Select-String "Error occured" -List | Select Path

(未测试,因此请检查命令是否返回您要查找的文件)

【讨论】:

  • 不是引号(之前检查过)。我将变量从 $msk 更改为 $mailmessage 并且没有在附件循环中更改它。我的错。 :( 但我改变了你建议的部分,它工作正常。这样我就不需要另一个 txt 并在之后删除它。谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2011-02-03
相关资源
最近更新 更多