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