У меня есть скрипт 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 всегда успешно выполняется с или без искусственной ошибки времени выполнения