Debugging Monad Scripts, Part 2: $error
Did your command or script fail and/or report an error? We hope to have a proper script debugger in a future version, but until then, MSH has some handy features to help you figure out what went wrong. In this series of blog entries, I will present some of those features. Thanks to Jim Truher [MSFT], Bruce Payette [MSFT], and Jeff Jones [MSFT] for their help in putting this together.
See the Windows “Monad” Shell Beta 2 Documentation Pack (http://www.microsoft.com/downloads/details.aspx?FamilyID=8a3c71d1-18e5-49d7-952a-c55d694ecee3&displaylang=en) for general information about Monad.
Part 1: http://blogs.msdn.com/monad/archive/2005/11/04/489138.aspx (Terminating vs. Non-Terminating Errors, ErrorRecord)
Jon Newman [MSFT]
Errors occurring in MSH commands or scripts will be stored in $error. $error is always on, so you can use it even for errors which you can’t reproduce (or would rather not repeat).
$error is an ArrayList containing the most recent errors: $error is the most recent error, $error the one before that, etc. $MaximumErrorCount (default 256) is the maximum number of errors which will be stored before the oldest is discarded.
So, when you see errors, you should have a look at $error. Note that any new error will move $error to $error, so you’ll probably want to copy $error to another shell variable before investigating it, e.g.
MSH C:\temp> start-service $servicename
start-service : Cannot bind argument to parameter ‘ServiceName’ because it is null.
At line:1 char:14
+ start-service <<<< $servicename
MSH C:\temp> $savethis = $error
MSH C:\temp> $savethis.GetType().Name
MSH C:\temp> $savethis.InvocationInfo.MyCommand
CommandType Name Definition
———– —- ———-
Cmdlet start-service start-service [-ServiceName] String [-PassThru…
Note that Exception objects will in some cases also appear in $error. In particular, the “throw” script command may add both an ErrorRecord and a RuntimeException to $error.
[Edit: Monad has now been renamed to Windows PowerShell. This script or discussion may require slight adjustments before it applies directly to newer builds.]