第三方实用程序的异常处理不起作用

时间:2012-02-16 08:47:19

标签: powershell powershell-v2.0 cleartool

我正在尝试在powershell中使用cleartool命令。

如果命令失败,它应该捕获异常并执行操作。但它并没有被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命令是否不适用于非.net相关的东西?

2 个答案:

答案 0 :(得分:2)

我从未在powershell脚本中看到过用于cleartool的异常机制 (我看到的那对夫妇在“how to find root[folder] for each component using cleartool?”和“How to describe recommend baseline with pipeline”中。

old thread (2006, so for the first version of Powershell)说明了使用$?

的错误管理机制
cleartool lsco -cview -s . |
foreach {
  cleartool diff -pred -opt -sta "$_"
  if ($?) {
    cleartool unco -rm "$_"
  } else {
    cleartool ci -nc "$_"
  }
}

要使用您的机制,您可能希望在Invoke-Command中封装您的cleartool调用,并从包装函数返回状态代码,如“catching return code of a command with “invoke-command” - Powershell 2”中所述。

或者,您可以尝试拨打CAL commands as in this script

,而不是直接调用cleartool

答案 1 :(得分:2)

由于cleartool是一个外部exe文件,因此它不会在PowerShell环境中抛出异常。

根据IBM documentation:如果通过在交互模式下输入quit命令退出cleartool,则退出状态为0.单命令模式的退出状态取决于命令是否成功(零退出状态)或生成错误消息(非零退出状态)。

在PowerShell中,您可以使用$LASTEXITCODE var获得此非零退出状态。因此,正如@VonC解释的那样,您可以使用$?检查单命令是否有效,然后使用$LASTEXITCODE来获取特定错误。