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