2016-03-23 16 views
0

Diğer komut dosyalarından alıntıladığım bir komut dosyası var. Ben powershell için oldukça yeni ve bir sys admin bir dev değil, (ama benim kıçımı kapalı okuma) dışında çalışır. Ben bakış açısına gelen kutusundan indirirken ekleri işe scrtipt almak yerine bir alt ekleri indirmek için ihtiyacınız olabilir:Powershell betiği outlook eklentilerini, gelen kutusu değil gelen kutusu alt klasöründen kaydetmek için dönüştürün.

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

Herhangi Fikirler herkes? Büyük minnettar olurdum.

cevap

0

COM Objects ile her zamanki gibi, yapmak oldukça çirkin.

here sorusu gibi yapmalısınız, ancak bunu hiç işe alamıyorum. $Inbox.Folders['FolderName'] hiçbir şey döndürmez ve $Inbox.Folders('FolderName') bir hata döndürür.

İşte işe nasıl alabilirim. Office 2013 ile PowerShell v4 kullanıyorum.

\\ Inbox \ eReports \ Amazon \ StatsReports'ta bir klasörünüz olduğunu ve içindeki tüm iletilerin olmasını istediğinizi varsayalım. Ben ForEach-Object ve Where-Object kullanıyorum yolu PowerShell v3 gerektirdiğini

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

Not. Önceki sürümlerin altında bu önemli ölçüde daha ayrıntılı olacaktır.


İşte Win üzerinde benim için çalışan script tam versiyonu 7 x64/PowerShell v4/Ofis 2013 çalışması lazım bu yüzden, birkaç farklı klasörleri test ettik.

otomatik bir (2), ardından (3) ve benzeri ekleyerek Windows kongre sonrasında adı aynı olan dosyaları yeniden adlandırır.

$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

Yardım için teşekkürler, Ive PSVersion 5.0 ve Office 2010 var. Bu kodu eklediğimde ve alt klasörümdeki $ messages ve klasör adını değiştirdiğimde sonucu almıyorum, kodunuzu nereye koyarım? Yukarıdaki mevcut betik? Topal için özür dilerim Q – Royston

+0

@Royston Güncellemeyi görün. –

+0

Bu benim için çalışmıyor korkarım. – 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\*.* 

Bu işte ihtiyacım olan şey yapar, ben sadece sıkışmış hiçbir doktor olduğundan emin olmak için her birinden sonra bir öldürme işlemini koyabilir.

Fakat - 1 Varsayılan olarak, varsayılan olmayan bir yazıcıya yazmak ve var olan varsayılanı değiştirmek için buna ihtiyacım var mı? Bu, zaten çalışan bir vbscript ile çalışan bir sunucuda çalışır.

+0

(-passthru parametresini gereksiz olduğu için çıkardık) – Royston

İlgili konular