1

我想从 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

但是,如果我重定向标准错误,那么什么也不会发生:

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),并且仍然抛出异常?

4

1 回答 1

2

$Error是一个缓冲错误的数组。最近的错误存储在$error[0]. 您可以将其与$LASTEXITCODEand结合使用$?

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

Invoke-Expression $cmd -ErrorVariable e

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

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

$output = Invoke-Expression $cmd -ErrorVariable e
于 2013-06-20T16:28:48.077 回答