Как я могу поймать ошибку макроса файла Excel в Powershell? - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть запланированный сценарий PowerShell, который открывает Excel, открывает файл и запускает макрос.Если возникает ошибка, мне нужно отобразить ее в оболочке и прервать скрипт.(Я не могу позволить скрипту повиснуть во время ожидания ввода пользователя)

Вот мой текущий скрипт ($ excelDataPath определен ранее в скрипте)

$Excel = New-Object -ComObject "Excel.Application"
$Excel.DisplayAlerts = $false
$Excel.AskToUpdateLinks = $false
$Excel.Visible = $true

$Workbook = $Excel.Workbooks.Open($excelDataPath)
$Excel.Run("Macro1")
$Workbook.Save()
$Workbook.Close($true)

Спасибо

1 Ответ

0 голосов
/ 12 декабря 2018

Я думаю, с точки зрения PowerShell, это перехватит и отобразит возникшее исключение:

try {
    $Excel = New-Object -ComObject "Excel.Application"
    $Excel.DisplayAlerts = $false
    $Excel.AskToUpdateLinks = $false
    $Excel.Visible = $true

    $Workbook = $Excel.Workbooks.Open($excelDataPath)
    $Excel.Run("Macro1")
    $Workbook.Save()
    $Workbook.Close($true)
    $Excel.Close()
}
catch {
    $exception = $_.Exception
    while ($exception.InnerException) {
        $exception = $exception.InnerException
    }
    # Throw a terminating error. 
    throw $exception
}
finally {
    # IMPORTANT! Always release the comobjects used from memory when done
    if ($Workbook) { [System.Runtime.Interopservices.Marshal]::ReleaseComObject($Workbook) | Out-Null }
    if ($Excel)    { [System.Runtime.Interopservices.Marshal]::ReleaseComObject($Excel) | Out-Null }
    [System.GC]::Collect()
    [System.GC]::WaitForPendingFinalizers()
}

Однако, что касается макрокода VBA, который вы нам не показывали, вам придетсяпроверьте, что он делает с любыми ошибками через VBA On Error Error .Особенно заявления Err.Raise и Throw.

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