Загрузка вложения .xlsx из Outlook определенной даты с помощью Powershell

У меня есть приведенный ниже сценарий. Этот $Tests показывает список вложений .xlsx определенной даты, но не может загрузить и выдает ошибку. Пожалуйста, найдите приведенный ниже сценарий.

Add-type -assembly "Microsoft.Office.Interop.Outlook"
$olDefaultFolders = "Microsoft.Office.Interop.Outlook.olDefaultFolders" -as [type]
$outlook = New-Object -comobject Outlook.Application
$mapi = $outlook.GetNameSpace(“MAPI”)
$inbox = $mapi.GetDefaultFolder(6)
$FilePath= "c:\temp\Test\"
$subfolder = $inbox.Folders | Where-Object {$_.Name -eq “Test”}
$mail=$subfolder.Items |Select-Object -Property "ReceivedTime",@{name="Attachments";expression={$_.Attachments|%{$_.DisplayName}}} | Where-Object{$_.attachments -match ".xlsx" -and ($_.receivedtime -match "9/15/2020")} | Select-Object "attachments"
$Test = $mail.attachments
foreach ($out in $test) {$_.attachments|foreach {
Write-Host $_.filename
$Filename = $_.filename
If ($out.Contains("xlsx")) {
$_.saveasfile((Join-Path $FilePath "$out")) }}}

Я могу фильтровать вложения .xlsx с определенной датой. Но после этого я не знаю, как их сохранить/скачать.


person Sai Yeshwanth    schedule 15.09.2020    source источник
comment
Пожалуйста, вставьте свой код в свой вопрос, а не добавляйте его как снимок экрана. Если кто-то хочет использовать код для редактирования, он должен быть в виде текста, а не в виде картинки. При вставке в ваш вопрос отметьте код и нажмите CTRL+K, чтобы отформатировать его как код.   -  person Adis1102    schedule 15.09.2020
comment
в цикле for вы ссылаетесь на $email, но в предыдущей строке вы используете $mail? может в этом проблема? и, пожалуйста, как сказал @Adis1102, вставьте свой код в вопрос.   -  person Guenther Schmitz    schedule 15.09.2020
comment
Привет, Код был обновлен. Пожалуйста, посмотрите на это   -  person Sai Yeshwanth    schedule 15.09.2020
comment
так каков результат вашего текущего скрипта?   -  person Guenther Schmitz    schedule 15.09.2020
comment
Вы не можете вызвать метод для выражения с нулевым значением. В строке: 17 символов: 5 + $_.saveasfile((Join-Path $FilePath $out)) }}} + ~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : InvokeMethodOnNull   -  person Sai Yeshwanth    schedule 15.09.2020


Ответы (1)


Работа с com-объектами в powershell может быть довольно утомительной. Я рекомендую вам очень хорошо ознакомиться с Get-Member. Вы действительно должны допросить каждый объект. Я упростил ваш сценарий, а также тщательно его протестировал. Он загрузит каждое соответствующее вложение (имя) из каждого письма соответствия (дата получения).

Add-type -assembly "Microsoft.Office.Interop.Outlook"
$olDefaultFolders = "Microsoft.Office.Interop.Outlook.olDefaultFolders" -as [type]
$outlook = New-Object -comobject Outlook.Application
$mapi = $outlook.GetNameSpace(“MAPI”)
$inbox = $mapi.GetDefaultFolder(6)
$FilePath= "c:\temp\Test\"
$subfolder.Items | Where-Object {$_.receivedtime -match "9/20/2020" -and $($_.attachments).filename -match '.xlsx'} | foreach {
    $filename = $($_.attachments | where filename -match '.xlsx').filename
    foreach($file in $filename)
    {
        Write-Host Downloading $file to $filepath -ForegroundColor green
        $outpath = join-path $filepath $file
        $($_.attachments).saveasfile($outpath)
    }
}

Вы можете использовать это для большего количества встроенного подхода.

Add-type -assembly "Microsoft.Office.Interop.Outlook"
$olDefaultFolders = "Microsoft.Office.Interop.Outlook.olDefaultFolders" -as [type]
$outlook = New-Object -comobject Outlook.Application
$mapi = $outlook.GetNameSpace(“MAPI”)
$inbox = $mapi.GetDefaultFolder(6)
$FilePath= "c:\temp\Test\"
$subfolder.Items | Where-Object {$_.receivedtime -match "9/20/2020" -and $($_.attachments).filename -match '.xlsx'} | foreach {
    foreach($attachment in $($_.attachments | where filename -match '.xlsx'))
    {
        Write-Host Downloading $attachment.filename to $filepath -ForegroundColor green
        $attachment.SaveAsFile((join-path $FilePath $attachment.filename))
        
    }
}
person Doug Maurer    schedule 20.09.2020