Время ожидания MS Access ComObject от powershell - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть скрипт powershell, который создает MS Access ComObject и использует его для запуска макроса в базе данных MS Access, как показано ниже:

$ AccessDb = New-Object -ComObject Access.Application

try{ 

 foreach($file in $Files)
  { 
    ...
    $AccessDb.DoCmd.RunMacro('mcrScr')
    ...
 }

}
catch { ... }

Проблема в том, что при возникновении ошибок во время выполнения MS Access выдает ошибки в интерактивном окне или диалоговом окне, что приводит к зависанию PowerShell;просто ждет закрытия окна и, следовательно, макросы для других файлов .mdb не запускаются.Я пробовал варианты из онлайновых статей для тайм-аута этого куска моего кода $ AccessDb.DoCmd.RunMacro ('mcrScr'), если он выполняется больше, чем х секунд.Я использовал задания, runspace и [system.diagnostics.stopwatch], но не увенчался успехом.Есть ли лучший подход для этого?У меня закончились варианты.

Редактировать: @Paul, в ответ на ваш комментарий я добавляю, как я использую runspace для решения проблемы.

function Script-Timeout {
    param([scriptblock]$Command,[int]$Timeout)

    $Runspace = [runspacefactory]::CreateRunspace()
    $Runspace.Open()

    $PS = [powershell]::Create().AddScript($Command)
    $PS.Runspace = $Runspace

    $chk = $PS.BeginInvoke()
    if($chk.AsyncWaitHandle.WaitOne($Timeout))
    {
     $PS.EndInvoke($chk)
    }
    else
    {
       
       throw "Command taking too long to run. Timeout exceeded." 
       $PS.EndInvoke($chk)
    }


}

Функция Script-Timeout затем используется в той части моего скрипта, которая выполняет макрос MS Acess, как показано ниже:

Try{
    forEach($mdbfile in Files)
    {
        ...
        Script-Timeout -Command {
             $AccessDb= New-Object -ComObject Access.Application
            $AccessDb.OpenCurrentDatabase($mdbfile)

            $AccessDb.DoCmd.RunMacro('mcrUpdate') 

            $AccessDb.CloseCurrentDatabase() 
            } -Timeout 20
        ...    
     }
 }
 catch
 {
  #catch exception
 }

Я искусственно создал ошибку времени выполнения в VBA, которая выдает диалоговое окно с сообщением об ошибке.Таким образом, часть скрипта RunMacro, если он запустится, повесит PowerShell.Именно здесь я ожидаю, что пространство выполнения прервет выполнение макроса из powershell через x секунд.Проблема с пространством выполнения состоит в том, что макрос MS Access не запускается вообще.В режиме отладки powershell я вижу, что блок if функции script-timeout всегда успешно выполняется с или без искусственной ошибки времени выполнения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...