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**。
广告