Обработка исключений для сторонней утилиты не работает - PullRequest
2 голосов
/ 16 февраля 2012

Я пытаюсь использовать команду cleartool в powershell.

Если команда не выполнена, она должна перехватить исключение и выполнить действие.Но он не был перехвачен catch {}

try { 
       #If $viewname not exist it will throw error
       cleartool lsview $ViewName
    }
catch {

    # If list view fails , it means View doesn't exist. So create view
    Write-host "Create view"
    cleartool mkview -tag $ViewName -nsh $ccViews$ViewName".vws"

}

Когда команды в try терпят неудачу, он не вызывает выражения в catch.

Не работает ли команда catch с non .netсвязанные вещи?

Ответы [ 2 ]

2 голосов
/ 16 февраля 2012

Поскольку cleartool является внешним exe-файлом, он не создает исключений в среде PowerShell.

Согласно документации IBM : Если вы выйдете из cleartool, введя команду выхода в интерактивном режимесостояние выхода равно 0. Состояние выхода из режима одиночной команды зависит от того, была ли команда выполнена успешно (нулевое состояние выхода) или сгенерировано сообщение об ошибке (ненулевое состояние выхода).

В PowerShell вы можете получить это ненулевое значениестатус выхода с $LASTEXITCODE вар.Как объясняет @VonC, вы можете использовать $?, чтобы проверить, работает ли одиночная команда, а затем $LASTEXITCODE, чтобы получить конкретную ошибку.

2 голосов
/ 16 февраля 2012

Я никогда не видел механизм исключений, используемый в сценарии powershell для cleartool.
(Пара, которую я видел, была в ", как найти root [папку] для каждого компонента, использующего cleartool? ", и в" Как описать рекомендуемую базовую линию с конвейером ").

Этот старый поток (2006 г., так что для первой версии Powershell) иллюстрирует этот механизм управления ошибками с использованием $?:

cleartool lsco -cview -s . |
foreach {
  cleartool diff -pred -opt -sta "$_"
  if ($?) {
    cleartool unco -rm "$_"
  } else {
    cleartool ci -nc "$_"
  }
}

Чтобы использовать ваш механизм, вы можете инкапсулировать вызов cleartool в команду Invoke-Command и вернуть код состояния из функции-оболочки, как описано в « перехвате возврата».код команды с «invoke-command» - Powershell 2".

Или вместо прямого вызова cleartool вы можете попробовать вызвать команды CAL, как в этом сценарии .

...