PowerShell 的 Get-Error cmdlet 有什么作用?


Get-Error cmdlet 是在 PowerShell v7 中引入的。它显示当前会话中最近的错误消息。

当你检查此命令的 Get-Member 时,其输出为 PSExtendedError 格式,因此此命令产生的任何输出都非常详细,因此此命令对排查错误消息非常有帮助。

PS C:\> Get-Error | gm
TypeName: System.Management.Automation.ErrorRecord#PSExtendedError

我们将在 PowerShell 控制台中编写一个最终会生成错误的命令。

PS C:\> Get-ChildItem c:
otexist Get-ChildItem: Cannot find path 'C:
otexist' because it does not exist.

上述目录不存在。让我们使用 Get-Error cmdlet 查看此错误的详细信息。

PS C:\> Get-Error
Exception :
Type : System.Management.Automation.ItemNotFoundException
ErrorRecord :
Exception :
Type : System.Management.Automation.ParentContainsErrorRecordException
Message : Cannot find path 'C:
otexist' because it does not exist. HResult : -2146233087 TargetObject : C:
otexist CategoryInfo : ObjectNotFound: (C:
otexist:String) [], ParentContainsErrorRecordException FullyQualifiedErrorId : PathNotFound ItemName : C:
otexist SessionStateCategory : Drive TargetSite : Name : GetChildItems DeclaringType : System.Management.Automation.SessionStateInternal, System.Management.Automation, Version=7.0.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 MemberType : Method Module : System.Management.Automation.dll StackTrace : at System.Management.Automation.SessionStateInternal.GetChildItems(String path, Boolean recurse, UInt32 depth, CmdletProviderContext context) at Microsoft.PowerShell.Commands.GetChildItemCommand.ProcessRecord() Message : Cannot find path 'C:
otexist' because it does not exist. Source : System.Management.Automation HResult : -2146233087 TargetObject : C:
otexist CategoryInfo : ObjectNotFound: (C:
otexist:String) [Get-ChildItem], ItemNotFoundException FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand InvocationInfo : MyCommand : Get-ChildItem ScriptLineNumber : 1 OffsetInLine : 1 HistoryId : 94 Line : Get-ChildItem c:
otexist PositionMessage : At line:1 char:1 + Get-ChildItem c:
otexist + ~~~~~~~~~~~~~~~~~~~~~~~~~ InvocationName : Get-ChildItem CommandOrigin : Internal ScriptStackTrace : at <ScriptBlock>, <No file>: line 1 PipelineIterationInfo :

正如你在上述输出中看到的,它包含错误消息、异常详细信息、调用名称、错误的行号等。你也可以单独访问每个部分。

例如

PS C:\> (Get-Error).InvocationInfo
MyCommand : Get-ChildItem
BoundParameters : {}
UnboundArguments : {}
ScriptLineNumber : 1
OffsetInLine : 1
HistoryId : 94
ScriptName :
Line : Get-ChildItem c:
otexist PositionMessage : At line:1 char:1 + Get-ChildItem c:
otexist + ~~~~~~~~~~~~~~~~~~~~~~~~~ PSScriptRoot : PSCommandPath : InvocationName : Get-ChildItem PipelineLength : 0 PipelinePosition : 0 ExpectingInput : False CommandOrigin : Internal DisplayScriptPosition :
PS C:\> (Get-Error).InvocationInfo.PositionMessage
At line:1 char:1
+ Get-ChildItem c:
otexist + ~~~~~~~~~~~~~~~~~~~~~~~~~

你也可以使用 Get-Error 作为管道输入,为此,你需要将错误输入作为管道。最好的方法是将 $Error 变量作为输入对象传递。无论错误以何种视图(普通、类别或简洁)显示,Get-Error 命令都会将其转换为精确的视图。

例如

$error | Get-Error

你还可以使用 -Newest 参数获取当前控制台中最新错误的数量。例如:

Get-Error -Newest 2

每当我们使用上述命令时,你都可以看到错误由错误索引分隔。在上面的示例中,我们检索了两个最新的错误,因此将有两个错误索引:**ErrorIndex 0** 和 **ErrorIndex 1**。

更新于:2020年9月19日

681 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告