If you’re looking to record the error and warning outputs from your PowerShell commands whilst keeping your console free of nasty red text, then the ErrorVariable and WarningVariable parameters are just what you’re looking for.
Let’s take a look at a quick simple example:
Get-ChildItem -Path C:\DoesNotExist\ $ErrVar = 'ErrorVariable' $ErrVar Get-ChildItem -Path C:\DoesNotExist\ -ErrorVariable ErrVar $ErrVar
Which assuming you don’t have C:\DoesNotExist\
on your workstation, then you should see output like this:
From this quick example a couple of things stand out:
* you pass the name for the Error variable in without the $
* If you resuse a variable name it’ll get clobbered, so be careful (or read on)
* The error is still output to the screen
The last one is not what we want. So one more little tweak will make that disapper
Get-ChildItem -Path C:\DoesNotExist\ -ErrorVariable ErrVar -ErrorAction SilentlyContinue $ErrVar
That’s much better, no more red text! -ErrorAction SilentlyContinue
does exactly what it says on the tin.
WarningVariable
and WarningAction
work in exactly the same way, just on Warning events rather than Errors.
Even better news is that any advanced functions you write automatically get these options:
function Test-ErrorVariable { [CmdletBinding()] Param( [string]$Path ) Process { Get-ChildItem -Path } } Test-ErrorVariable -Path c:\DoesNotExist -ErrorAction SilentlyContinue -ErrorVariable ErrVar $ErrVar
That’s it, just write an advanced function and PowerShell puts all this in behind the scenes for you
Now, what happens if you’re calling multiple commands and want to store the error output from all of them. Do you need to specify a new ErrorVariable
for each one? That could get horribly messy with auto generating variable names in a loop. Luckily there’s a built in method for handling that, prepend the variable name with +
and the new data will be added to the variable (which is an array):
Test-ErrorVariable -Path c:\DoesNotExist -ErrorAction SilentlyContinue -ErrorVariable ErrVar Test-ErrorVariable -Path c:\DoesNotExistEither -ErrorAction SilentlyContinue -ErrorVariable +ErrVar $ErrVar $ErrVar.GetType() $ErrVar[0] $ErrVar[1]
So you can reuse the same name throughout your script. Don’t worry about when to add the +
to the string, behind the scenes PS checks if the variable exists and if it doesn’t creates it the first time it’s used.
These Error and Warning paramters are very useful for collecting information about failed runs, and from hiding nasty screens of red text from end users if you don’t want to worry them.