2009-06-19 63 views
7

PowerShell是一个奇怪的.bat和.NET混合。在.bat中,你检查命令的errorlevel和stderr输出。在.NET中,你捕捉异常。在PowerShell中进行错误处理的正确方法是什么?

cmdlet如何返回错误?当他们失败或者他们设置了$时,他们是否会抛出异常?代替?这是可配置的吗?

我还假设我在PowerShell中调用的.NET函数将始终引发异常,并且不会被shell自动捕获并转换为错误。那是对的吗?

也许我真的应该问的是:什么是一个很好的文章,所有这一切呢?看起来像很多像我这样的工程师,他们在cmd的.bat和.NET方面都有经验,他们都很想知道我们应该如何在这个勇敢的新时代中做些事情。

回答

9

对于个人的cmdlet,有一个叫-ErrorAction参数。可能的值是SilentlyContinue,Stop,Continue或Enquire。您也可以指定一个名为$ errorpreference的全局变量来指定这些选项中的任何一个。

在V1中,您可以使用陷阱关键字。有一个pretty good, concise article描述了在V2中添加的陷阱和try/catch/finally语法之间的主要区别。

下面是使用陷阱语句的一个简单的例子,第一个是一个特异性异常类型,第二个是一个通用的包罗万象的错误陷阱所以,或许是在V2CTP3取出

trap {"Other terminating error trapped" } 
trap [System.Management.Automation.CommandNotFoundException] 
     {"Command error trapped"} 
1/$null 
+0

正是我需要的,非常感谢! – scobi 2009-06-20 04:21:33

0

我认为Posh是所有.Net。大多数在.Net中工作的概念应该在Posh中工作。

对于错误处理,您可以使用Try..catch。也可以“陷阱”错误并指定您自己的一组指令以在错误条件下执行。

我会极力推荐的内置帮助:

Get-Help about_Errors 
Get-Help about_Trap 
+0

但没有about_errors或about_trap。而你的回应总结了我的问题来自哪里。Posh是.NET-y,我知道try-catch等,但它并不真正帮助我解答任何问题。 – scobi 2009-06-19 20:45:02

相关问题