Добавим это как ответ на данный момент, но на самом деле просто пытаемся отладить так, чтобы это не помещалось в комментариях.Аналогично другому ответу, но идея заключается в том, чтобы использовать его для создания тестового примера, и давайте посмотрим, сможем ли мы заставить его работать в вашем Планировщике заданий> Случай Powershell.
Пусть ваш PS запустит foo
или foo2
процедуры здесь, и я инкапсулировал инстанцирование Outlook как отдельную функцию, чтобы попытаться сохранить вещи в чистоте и изолировать ошибку.
Option Explicit
Sub foo()
Dim olApp As Object
Set olApp = GetApplication("Outlook.Application")
End Sub
Sub foo2()
Dim olApp As Object
Set olApp = GetApplication2("Outlook.Application")
End Sub
Function GetApplication2(className As String) As Object
' function to encapsulate the instantiation of an application object
Dim theApp As Object
On Error Resume Next
Set theApp = CreateObject(className)
If theApp Is Nothing Then
MsgBox "Unable to get a handle on " & className
Else
MsgBox "Successfully got a handle on " & className & ", returning to caller"
End If
Set GetApplication2 = theApp
End Function
Function GetApplication(className As String) As Object
' function to encapsulate the instantiation of an application object
Dim theApp As Object
On Error Resume Next
Set theApp = GetObject(, className)
If Err.Number <> 0 Then
MsgBox "Unable to Get" & className & ", attempting to CreateObject"
Set theApp = CreateObject(className)
End If
If theApp Is Nothing Then
Err.Raise Err.Number, Err.Source, "Unable to Get or Create the " & className & "!"
Set GetApplication = Nothing
End If
MsgBox "Successfully got a handle on Outlook Application, returning to caller"
Set GetApplication = theApp
End Function
Который я запускаю из PS как:
$excel = new-object -comobject excel.application
$file = "C:\debug\ps-excel.xlsm"
$wb = $excel.workbooks.open($file)
$excel.Run("Module1.foo")
И:
$excel.Run("Module1.foo2")
В процедуре foo
GetObject
вызывает ошибку, но это не ошибка 429, и управление переходит к CreateObject
, который успешно создает экземпляр приложения,Итак, к сожалению, я не могу воспроизвести ошибку при любой комбинации foo
/ foo2
, и, кажется, уже не открыт ли Outlooks.
Вот какое-то хакерское потенциальное решение
Итак, это немного хакерски, потому что я не думаю, что это решает основную причину (и потому что я не могу повторить вашу ошибку, это может на самом деле ничего не решить) но стоит попробовать, как вы заметили:
Важно отметить, что скрипт запускается при выходе из MS Outlook и выдает ошибки, если Outlook уже запущен
Моя идея состоит в том, чтобы просто изменить свой PS для проверки работающего экземпляра Outlook и закрыть его с помощью stop-process
Командлет.
try {
stop-process -Name "outlook" -ErrorAction Stop
Write-Host "Stopped the running instance of Outlook Application"
} catch {
Write-Host "outlook was not already running"
}
$excel = new-object -comobject excel.application
$file = "C:\debug\ps-excel.xlsm"
$wb = $excel.workbooks.open($file)
$excel.run("Module1.foo")