2016-03-23 42 views
0

他のスクリプトからスクラップしたスクリプトがあります。私はPowerShellにはかなり新しく、devではなくsysの管理者ですが(しかし、私のお尻を読んでいる)以外は動作します。私は、Outlookで受信トレイからダウンロード添付ファイルを動作させるscrtiptを得る代わりに、サブフォルダから添付ファイルをダウンロードするためにそれを必要とすることができますpowershellスクリプトをOutlookの添付ファイルを保存して、受信トレイではなく受信トレイのサブフォルダから保存するように変換します。

############################# 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########## 

任意のアイデア誰ですか?大変感謝しています。

答えて

0

いつものようにCOMオブジェクトでは、かなり醜いです。

あなたは質問hereのようにすることになっていますが、私はそれをまったく動作させることはできません。 $Inbox.Folders['FolderName']は何も返さず、$Inbox.Folders('FolderName')はエラーを返します。

ここで私はそれを動作させる方法があります。私はOffice 2013でPowerShell v4を使用しています。

\\ Inbox \ eReports \ Amazon \ StatsReportsにフォルダがあり、その中にすべてのメッセージが必要だとします。私はForEach-ObjectWhere-Objectを使用しています方法はPowerShellのV3を必要とすること

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

注意。それ以前のバージョンでは、これは相当のより冗長でしょう。


ここでそれが動作するはずですので、私は、いくつかの異なるフォルダにそれをテストしてみた勝利7のx64/PowerShellのV4 /オフィス2013年に私の作品のスクリプトのフルバージョンです。

(2)を追加し、次に(3)などを追加するというWindowsの規則に従って、名前が重複するファイルの名前が自動的に変更されます。

$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

IveはPSVersion 5.0とOffice 2010を手に入れました。このコードを追加して、変数$メッセージとフォルダ名をサブフォルダに置き換えると、結果が得られません。上記の既存のスクリプトですか?ラメに申し訳ありませんQ – Royston

+0

@Royston私の更新を見てください。 –

+0

これは私のために働いていない私は恐れている。 – 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\*.* 

これは私が必要なものを実現し、私はちょうど何のドキュメントスタックがないことを確認するために、各1の後にキル・プロセスを置くかもしれません。

しかし、達成するために残された1つは、デフォルト以外のプリンタに書き込んで既存のデフォルトを変更しないために必要なことですか?これは、vbscriptが既定のプリンタを使用して既に実行されているサーバー上で実行されるため、変更された場合はそれを駄目にします。

+0

(不要なので、-passthruパラメータを取り出した) – Royston

関連する問題