捕获Invoke-Expression输出并重定向stderr时吞噬异常

时间:2013-06-20 14:33:39

标签: powershell

我想从Invoke-Expression调用中捕获并记录所有输出(重定向stderr),但是通过这样做,通常会抛出的任何异常似乎都被吞下。

假设c:\ temp \ test已经存在,此命令将抛出异常:

PS U:\> $cmd = "mkdir c:\temp\test"
PS U:\> $output = Invoke-Expression $cmd
New-Item : Item with specified name C:\temp\test already exists.
At line:38 char:24
+         $scriptCmd = {& <<<<  $wrappedCmd -Type Directory @PSBoundParameters }
    + CategoryInfo          : ResourceExists: (C:\temp\test:String) [New-Item], IOException
    + FullyQualifiedErrorId : DirectoryExist,Microsoft.PowerShell.Commands.NewItemCommand

但是,如果我重定向stderr,那么没有任何反应:

PS U:\> $cmd = "mkdir c:\temp\test 2>&1"
PS U:\> $output = Invoke-Expression $cmd
PS U:\>

这是一个简化的例子,我在函数中使用Invoke-Expression进行多种类型的调用,并记录输出。所以这不仅仅是让这个电话工作的问题。

此外,不捕获输出也会正确抛出异常:

PS U:\> $cmd = "mkdir c:\temp\test 2>&1"
PS U:\> Invoke-Expression $cmd
New-Item : Item with specified name C:\temp\test already exists.
At line:38 char:24
+         $scriptCmd = {& <<<<  $wrappedCmd -Type Directory @PSBoundParameters }
    + CategoryInfo          : ResourceExists: (C:\temp\test:String) [New-Item], IOException
    + FullyQualifiedErrorId : DirectoryExist,Microsoft.PowerShell.Commands.NewItemCommand

我看到$ Error实际上包含异常,但我不知道我是否可以确定它只包含与Invoke-Expression调用相关的错误。

但问题是。如何从Invoke-Expression捕获所有输出(包括stderr),仍然会抛出异常?

1 个答案:

答案 0 :(得分:2)

$Error是一个缓冲错误的数组。最新错误存储在$error[0]中。您可以将其与$LASTEXITCODE$?

结合使用

对于您的情况,我认为-ErrorVariable更合适。这是一个常见的变量。有关详细信息,请参阅get-help about_commonparameters。语法为-ErrorVariable [+]<variable-name>。例如,以下命令创建$e变量,然后将Invoke-Expression中的任何错误存储在其中:

Invoke-Expression $cmd -ErrorVariable e

请注意,$e可能包含多个错误。

因此,要回答有关如何捕获所有输出的问题,并仍然显示错误:

$output = Invoke-Expression $cmd -ErrorVariable e