重新启动 MS Outlook 时出错,但 "sleep 30" 修复了错误

Error while restarting MS Outlook, but "sleep 30" fixes error

脚本正文:

$Outlook = [Runtime.InteropServices.Marshal]::GetActiveObject("Outlook.Application")
$Outlook.quit()
Get-Process OUTLOOK -ErrorAction SilentlyContinue | Wait-Process -ErrorAction SilentlyContinue
Start-Process "C:\Program Files (x86)\Microsoft Office\root\Office16\OUTLOOK.EXE"
#sleep 30
$Outlook = [Runtime.InteropServices.Marshal]::GetActiveObject("Outlook.Application")
$NameSpace = $Outlook.getNamespace("MAPI")
$NameSpace.stores | where {$_.ExchangeStoreType -eq 3} | Select-Object DisplayName,FilePath

我想重新启动 MS Outlook 并获取 PST 文件列表。代码无法运行并出现错误:

Exception calling "GetActiveObject" with "1" argument(s): "Operation unavailable (Exception from HRESULT: 0x800401E3 (MK_E_UNAVAILABLE))"
At C:\open1\restart-outlook.ps1:6 char:1
+ $Outlook = [Runtime.InteropServices.Marshal]::GetActiveObject("Outloo ...

如果我取消注释第 5 行中的“sleep 30”,代码将起作用。但计算机不同,有些需要“睡眠 120”才能让 MS Outlook 完全运行。除了在代码中加入“sleep”运算符之外,还有其他方法吗?

无需使用Marshal.GetActiveObject方法两次获取Outlook的运行实例。通常,当您想要获取已经 运行 的实例时使用它,而不是由您的代码启动。但是,即使您创建一个新的 Application 实例来自动化它,您也会得到相同的结果,因为 Outlook 是一个单例 - 您不能同时启动两个实例。

我建议不要在代码中使用睡眠语句,而是处理应用程序 class 的 MAPILogonComplete 事件,该事件在用户登录系统后触发。因此,在事件处理程序中您可以获得所有必需的信息。