2016-06-08 34 views
0

我有一個表單,即時通訊使用刪除PowerShell中的一個ost文件,然後啓動Outlook。我認爲啓動Outlook的過程比可以刪除的更快。這是我的。刪除OST文件並運行Outlook進程

taskkill.exe /im outlook.exe /f 

    $OstPath = $Env:LocalAppData + "\Microsoft" + "\Outlook" 
    $ost = get-ChildItem $OstPath | where { $_.Extension -eq ".ost"} 
    $ost | remove-Item 

    Wait-Job $ost 

    Start-Process -FilePath "C:\Program Files\Microsoft Office 15\root\office15\outlook.exe" 
+0

_I想啓動Outlook的過程是開放比OST快可以deleted_這是否意味着你得到一個錯誤?你能確認文件正在被刪除嗎?我會在taskkill之後睡一覺,因爲從經驗來看,這些文件會在outlook被終止後繼續保持這些文件持續~10s。 – Matt

+2

我不認爲殺死outlook.exe進程是個好主意。我會建議抓住它的COM實例(如果正在運行)並告訴它退出。 –

回答

0

這是我想出了功能和作品真的很好與Office 2013和Office 2016

Function RebuildEmail 
{ 

    #COMMENT: Stops all Outlook process' and deletes .ost file then prompts to run setup. 

    $a = new-object -comobject wscript.shell 
    $intAnswer = $a.popup("This will stop Outlook and Skype for Business,`nRemoves the local copy of your email and will resynchronize from the exchange server. Be sure you have a steady internet connection! . `nDO YOU WANT TO CONTINUE?", ` 
    0,"Service Desk",4) 
    If ($intAnswer -ne 6) { 
     $a.popup("Please call the Service Desk for support.") 


     } else { 
      $a.popup("Rebuilding will begin...") 

     Stop-Process -Name ("Outlook", "Lync") 

      $n = 0 
      Do 
      { 
       If(Get-Process -Name ("outlook", "Lync") -ErrorAction silentlycontinue) 
      { 

      Stop-Process -Name ("Outlook", "Lync") -ErrorAction SilentlyContinue 

       If ($n -lt 5) 
       { 
        $ExitLoop = $false 
        $n++ 
        Start-Sleep -Seconds 3 
         If($n -eq 5){$ExitLoop = $true} 
        } 
      } 
       else {$ExitLoop = $true} 
      } 
      While ($ExitLoop -eq $false) 

     if ($n -ne 5) 
      { 
       $OstPath = $Env:LocalAppData + "\Microsoft" + "\Outlook" 
       $OSTs = Get-ChildItem $OstPath | where { $_.Extension -eq ".ost"} 
       $OSTs | Remove-Item 

       Start-Sleep -s 3 

      foreach ($ost in $OSTs) 
       { 
        $FilePath = $OstPath + "\" + $ost 
        $n = 0 
      Do 
      { 
       if(Test-Path $FilePath) 
        { 
          Remove-Item $FilePath 
          Start-Sleep -Seconds 5 
          $ExitLoop = $false 
          $n++ 
          if($n -eq 5){$ExitLoop = $true} 
        } 
       else {$ExitLoop = $true} 
      } 

      While ($ExitLoop -eq $false) 
       if($n -ne 5) 
       { 
        $a = new-object -comobject wscript.shell 
        $intAnswer = $a.popup("The local copy of your email was successfully removed.", ` 
        0,"Service Desk",0) 
       } 
       else 
       { 
        $a = new-object -comobject wscript.shell 
        $intAnswer = $a.popup("Unfortunatley, your local copy couldn't be removed. Please call the Service Desk.", ` 
        0,"Service Desk",0) 
       } 
      } 
     } 
     else 
     { 
       $a = new-object -comobject wscript.shell 
       $intAnswer = $a.popup("Outlook was unable to close. Please call the Service Desk.", ` 
       0,"Service Desk",0) 
     } 

    Start-Process -FilePath "C:\Program Files\Microsoft Office 15\root\office15\outlook.exe" -ErrorAction SilentlyContinue 
    Start-Process -FilePath "C:\Program Files (x86)\Microsoft Office\root\Office16\outlook.exe" -ErrorAction SilentlyContinue 
    Start-Process -FilePath "C:\Program Files\Microsoft Office 15\root\office15\lync.exe" -ErrorAction SilentlyContinue 
    Start-Process -FilePath "C:\Program Files (x86)\Microsoft Office\root\Office16\lync.exe" -ErrorAction SilentlyContinue 

    Start-Sleep -s 30 

    $a = new-object -comobject wscript.shell 
    $intAnswer = $a.popup("Please allow a few minutes to update folders. Call the Service Desk if issue persist.", ` 
    0,"Service Desk",0) 

      } 
}