Get-Error cmdlet در PowerShell v7 معرفی شد. جدیدترین پیام های خطا را از
جلسه جاری نمایش می دهد.
هنگامی که عضو get این دستور را بررسی می کنید، خروجی آن به صورت 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.
دایرکتوری بالا وجود ندارد. بیایید با استفاده از cmdlet Get-Error نمای دقیقی از این خطا داشته باشیم.
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, : 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 را به عنوان شی ورودی ارسال کنید. فرقی نمی کند که خطاها در کدام نمای (Normal، Category یا Concise) باشند، دستور Get-Error آن را به نمای دقیق تبدیل می کند.
مثلا
$error | Get-Error
همچنین می توانید با استفاده از پارامتر -Newest تعداد آخرین خطاهای کنسول فعلی را دریافت کنید. به عنوان
مثال،
Get-Error -Newest 2
هر زمان که از دستور بالا استفاده می کنیم، می بینید که خطاها با Error Index از هم جدا شده اند. در مثال بالا، ما دو آخرین خطا را بازیابی کرده ایم، بنابراین دو شاخص خطا وجود خواهد داشت. ErrorIndex 0 و ErrorIndex 1 .