方法调用失败,因为[System.String]不包含名为“ saveasfile”的方法

时间:2019-10-29 06:11:40

标签: powershell outlook

我有一个Powershell脚本,可以下载Outlook邮件附件。 但我收到以下错误:

方法调用失败,因为[System.String]不包含名为'saveasfile'的方法。

我使用了以下脚本

Add-Type -Assembly "Microsoft.Office.Interop.Outlook"
$Outlook = New-Object -ComObject Outlook.Application
$Namespace = $Outlook.GetNameSpace("MAPI")
$inbox = $mapi.GetDefaultFolder(6)
$saveFilePath = "C:\temp\"
$subfolder = $inbox.Folders | Where-Object {$_.Name -eq “REPORTS”}

$mail = $subfolder.Items | Select-Object -Property Subject,SentOn,@{name="Attachments";expression={$_.Attachments|%{$_.DisplayName}}} | Where-Object{$_.attachments -match ".html" -and ($_.SentOn -gt '29-Oct-19 12:00:00 AM')} 

foreach ($email in $mail)
{
    if ($email.attachments.count -ge 1)
    {
        foreach ($attachment in $email.attachments)
        {
        $filename = $attachment.filename 
        $attachment.saveasfile((join-path $savefilepath $filename))
        }
    }
}

请让我知道如何解决此错误。

1 个答案:

答案 0 :(得分:0)

Outlook的Attachments属性的枚举器返回一个String键,而不是一个实际的附件对象(这就是为什么使用无类型或弱类型的语言(如PowerShell)与COM配合使用的原因。

PowerShell 想要用作功能性流水线语言(这是要调试的PITA)-有时使用老式的命令性代码会更容易:

For( $i = 0; $i -le $email.Attachments.Count; $i++ ) {
    $attachment = $email.Attachments.Item( $i )
    $attachment.SaveAsFile( ( Join-Path $savefilepath $filename ) )
}

顺便说一句,您不需要if ($email.attachments.count -ge 1)语句,因为For( $i = 0; $i...循环也会检查.Attachments.Count属性。