As Santiago Squarzon notes, 2>&1
is a redirection (>
) that redirects output stream number 2
(the error stream) into (&
) stream number 1
(the success stream).
- When calling external programs,
2
in redirections refers to such a program's stderr output, and 1
(the default stream) to its stdout output.
What your function in effect does is to promote any error - irrespective of whether it is a non-terminating or a (statement-)terminating error - to a fatal error (script-terminating aka runspace-terminating error).
However, I propose a simpler implementation, which also avoids the use of Invoke-Expression
, which is generally to be avoided, by instead requiring that a script block ({ ... }
) rather than a string be passed as an argument:
function Assert-NoError {
param(
[scriptblock] $cmd
)
$ErrorActionPreference = 'Stop'
. $cmd
}
You would then invoke the function as follows, for example:
Assert-NoError { Get-Process test }
Note:
$ErrorActionPreference = 'Stop'
creates a local instance of the the $ErrorActionPreference
preference variable, and by setting it to Stop
ensures that any error results in a fatal error by default.
The above implementation has the added advantage that any success output that precedes an error is output before execution is aborted.