#powershell #scripting #powershell-4.0
#powershell #создание сценариев #powershell-4.0
Вопрос:
У меня есть приведенный ниже сценарий. Этот $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:tempTest"
$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 с определенной датой. Но после этого я не знаю, как их сохранить / загрузить.
Комментарии:
1. Пожалуйста, вставьте свой код в свой вопрос, а не добавляйте его как скриншот. Если кто-то хочет использовать код для редактирования, он должен быть в виде текста, а не рисунка. При вставке в ваш вопрос отметьте код и нажмите CTRL K, чтобы отформатировать его как код.
2. в вашем цикле for вы ссылаетесь на
3. Привет, код был обновлен. Пожалуйста, ознакомьтесь с этим
4. итак, каков результат вашего текущего сценария?
5. Вы не можете вызвать метод для выражения с нулевым значением. В строке: 17 символ: 5 $_.saveasfile((Соединительный путь $FilePath «$ out»)) }}} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Информация о категории: Недопустимая операция: (:) [], исключение RuntimeException FullyQualifiedErrorId: InvokeMethodOnNull
Ответ №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:tempTest"
$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:tempTest"
$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))
}
}