2016-03-23 12 views
0

Ich habe ein Skript, das ich aus anderen Skripten ausgekratzt. Es funktioniert, außer ich bin ziemlich neu in Powershell und bin ein Systemadministrator nicht ein Entwickler, (aber meinen Arsch aus lesen). Ich kann die scrtipt bekommen Herunterladen von Anhängen aus Posteingang in Outlook zu arbeiten, aber es müssen Anlagen aus einem Unterordner anstatt zum Download:Convert Powershell-Skript Outlook-Anhänge speichern, um sie aus dem Posteingang, aber Posteingang Unterordner zu speichern

############################# Outlook Call ############################## 

$olFolderInbox = 6 
$outlook = new-object -com outlook.application; 
$ns = $outlook.GetNameSpace("MAPI"); 
$inbox = $ns.GetDefaultFolder($olFolderInbox) 
$messages = $inbox.items 
write-host $messages.count 
$messcount = $messages.count 




foreach($message in $messages){ 


##############Save Attachments################ 

$filepath = "c:\attachments\" 
$message.attachments|foreach { 
    Write-Host $_.filename 
    $attr = $_.filename 

    $_.saveasfile((Join-Path $filepath $_.filename)) 

    $a = $_.filename 
    If ($a.Contains("")) { 
    $_.saveasfile((Join-Path $filepath $a)) 
          } 
    } 

} 



###########END########## 

Irgendwelche Ideen anyone? Wäre sehr dankbar.

Antwort

0

Wie bei COM-Objekten üblich, ist es ziemlich hässlich zu tun.

Sie sollten es tun, wie die Frage here, aber ich kann das überhaupt nicht funktionieren. $Inbox.Folders['FolderName'] gibt nichts zurück und $Inbox.Folders('FolderName') gibt einen Fehler zurück.

Hier ist, wie ich es zur Arbeit bekommen kann. Ich bin auf PowerShell v4 mit Office 2013.

Angenommen, Sie haben einen Ordner unter \\ Posteingang \ eReports \ Amazon \ StatsReports, und Sie möchten alle Nachrichten darin.

$Messages = $inbox.Folders ` 
    | ? Name -eq 'eReports' ` 
    | % Folders ` 
    | ? Name -eq 'Amazon' ` 
    | % Folders ` 
    | ? Name -eq 'StatsReports' ` 
    | % Items; 

Beachten Sie, dass die Art, wie ich ForEach-Object und Where-Object erfordern Powershell v3 bin mit. Unter früheren Versionen wäre dies erheblich ausführlicher.


Hier ist eine Vollversion des Skripts, das für mich auf Win 7 x64/Powershell v4/Office-2013 Ich habe getestet es auf ein paar verschiedenen Ordnern arbeitet, so sollte es funktionieren.

Es werden automatisch Dateien mit doppelten Namen umbenannt, wobei die Windows-Konvention zum Hinzufügen einer , dann einer (3) und so weiter.

$OutputFolder = 'C:\OutputFolder'; 

$outlook = New-Object -ComObject Outlook.Application; 
$olFolderInbox = 6; 
$ns = $outlook.GetNameSpace("MAPI"); 
$inbox = $ns.GetDefaultFolder($olFolderInbox); 
$inbox.Folders ` 
    | ? Name -eq 'eReports' ` 
    | % Folders ` 
    | ? Name -eq 'Amazon' ` 
    | % Folders ` 
    | ? Name -eq 'StatsReports' ` 
    | % Items ` 
    | % Attachments ` 
    | % { 
     $OutputFileName = Join-Path -Path $OutputFolder -ChildPath $_.FileName; 
     if (Test-Path $OutputFileName) { 
      $FileDirectoryName = [System.IO.Path]::GetDirectoryName($OutputFileName); 
      $FileNameWithoutExtension = [System.IO.Path]::GetFileNameWithoutExtension($OutputFileName); 
      $FileExtension = [System.IO.Path]::GetExtension($OutputFileName); 

      for ($i = 2; Test-Path $OutputFileName; $i++) { 
       $OutputFileName = "{0} ({1}){2}" -f (Join-Path -Path $FileDirectoryName -ChildPath $FileNameWithoutExtension), $i, $FileExtension; 
      } 
     } 
     Write-Host $OutputFileName; 
     $_.SaveAsFile($OutputFileName); 
    } 
+0

Danke für die Hilfe, ich habe PSVersion 5.0 und Office 2010. Wenn ich diesen Code in obwohl und ersetzen Sie die Variable $ Nachrichten und Ordnername mit meinem Unterordner Ich bekomme nicht das Ergebnis, wo würde ich Ihren Code in der bestehendes Skript oben? Sorry für die lahme Q – Royston

+0

@Royston Siehe mein Update. –

+0

Das funktioniert nicht für mich, fürchte ich. – Royston

0
$OutputFolder = 'C:\tests'; 
$ErrorActionPreference= 'silentlycontinue' 
$outlook = New-Object -ComObject Outlook.Application; 
$olFolderInbox = 6; 
$ns = $outlook.GetNameSpace("MAPI"); 
$inbox = $ns.GetDefaultFolder($olFolderInbox); 
$inbox.Folders ` 
    | ? Name -eq 'colour' ` 
    | % Items ` 
    | % Attachments ` 
    | % { 
     $OutputFileName = Join-Path -Path $OutputFolder -ChildPath $_.FileName; 
     if (Test-Path $OutputFileName) { 
      $FileDirectoryName = [System.IO.Path]::GetDirectoryName($OutputFileName); 
      $FileNameWithoutExtension = [System.IO.Path]::GetFileNameWithoutExtension($OutputFileName); 
      $FileExtension = [System.IO.Path]::GetExtension($OutputFileName); 

      for ($i = 2; Test-Path $OutputFileName; $i++) { 
       $OutputFileName = "{0} ({1}){2}" -f (Join-Path -Path $FileDirectoryName -ChildPath $FileNameWithoutExtension), $i, $FileExtension; 
      } 
     } 
     Write-Host $OutputFileName; 
     $_.SaveAsFile($OutputFileName) 
    } 

Remove-Item -Path C:\tests\*.jpg 
Remove-Item -Path C:\tests\*.png 

Start-Process –FilePath “c:\tests\*.docx” –Verb Print -PassThru 
Start-Process –FilePath “c:\tests\*.xlsx” –Verb Print -PassThru 
Start-Process –FilePath “c:\tests\*.doc” –Verb Print -PassThru 
Start-Process –FilePath “c:\tests\*.xls” –Verb Print -PassThru 
Start-Process –FilePath “c:\tests\*.pptx” –Verb Print -PassThru 
Start-Process –FilePath “c:\tests\*.ppt” –Verb Print -PassThru 
Start-Process –FilePath “c:\tests\*.xls” –Verb Print -PassThru 
Start-Process –FilePath “c:\tests\*.msg” –Verb Print -PassThru 
Start-Process –FilePath “c:\tests\*.xlsm” –Verb Print -PassThru 
Start-Process –FilePath “c:\tests\*.rtf” –Verb Print -PassThru 
Start-Process –FilePath “c:\tests\*.pdf” –Verb Print -PassThru ` 
%{sleep 3;$_} 
Remove-Item -Path C:\tests\*.* 

Dadurch wird erreicht, was ich brauche, kann ich in einem Prozess zu töten setzen nur nach jeder sicherzustellen, dass es keine doc klemmt.

Aber - die 1 Sache, die noch zu erledigen ist, brauche ich dies, um auf einen nicht standardmäßigen Drucker zu schreiben und den bestehenden Standard nicht zu ändern? Dies wird auf einem Server ausgeführt, auf dem bereits ein VBScript unter Verwendung des Standarddruckers ausgeführt wird, so dass es bei Änderungen verwechselt wird.

+0

(den -passthru-Parameter entfernt, weil es unnötig war) – Royston

Verwandte Themen