încercați / captură bloc în PowerShell este de a gestiona Erorile care sunt produse în script-ul. Pentru a fi specific, erorile ar trebui să fie erori de terminare. Blocul final din PowerShell nu este obligatoriu să scrie de fiecare dată împreună cu Try/Catch, dar va fi executat indiferent dacă apare sau nu eroarea.deci, atunci când utilizați blocul de încercare, blocul de captură este obligatoriu, dar nu în cele din urmă bloc.
-
încercați / blocați bloc cu eroare de terminare − mai jos este exemplul de eroare de terminare fără a bloca în cele din urmă.,
Exemplu
try{ This is not allowed "This is Allowed"}catch{ Write-Host "Error occured" -BackgroundColor DarkRed}
Ieșire
În exemplul de mai sus, ne-am reveni ceva care nu este permis, dar a doua linie a fost autentic, deși acesta nu a putut executa datorită încheiere de eroare.scopul nostru este să surprindem excepția și mesajul de eroare generat în blocul Try. După cum știm, eroarea este stocată în variabila $Error. Dacă verificați ieșirea variabilei $ error, puteți obține întreaga vizualizare, dar ori de câte ori executați orice script și gestionați Erorile, asigurați-vă că ștergeți Erorile vechi folosind $error.,clear () comanda sau de a folosi noua consola PowerShell. În cazul în care cunoașteți locația specifică a variabilei de eroare într-o matrice, puteți utiliza direct acest lucru. De exemplu, $error
putem vedea care sunt toate proprietățile variabilei $Error.
PS C:\WINDOWS\system32> $Error | Get-Member | Select Name, MemberTypeName MemberType---- ----------Equals MethodGetHashCode MethodGetObjectData MethodGetType MethodToString MethodCategoryInfo PropertyErrorDetails PropertyException PropertyFullyQualifiedErrorId PropertyInvocationInfo PropertyPipelineIterationInfo PropertyScriptStackTrace PropertyTargetObject PropertyPSMessageDetails ScriptProperty
există câteva proprietăți de mai sus sunt utile pentru a găsi detaliile de excepție și de eroare. Să le vedem și le putem folosi și în blocul de captură.
prima proprietate InvocationInfo., Puteți utiliza, de asemenea, $Error, dar aceasta este singura eroare generată până acum, așa că folosim direct $Error, dar nu puteți obține pop-up-ul de autosugestie cu variabila $error direct.
PS C:\WINDOWS\system32> $Error.InvocationInfoMyCommand :BoundParameters : {}UnboundArguments : {}ScriptLineNumber : 3OffsetInLine : 5HistoryId : 50ScriptName :Line : This is not allowedPositionMessage : At line:3 char:5 + This is not allowed + ~~~~PSScriptRoot :PSCommandPath :InvocationName : ThisPipelineLength : 0PipelinePosition : 0ExpectingInput : FalseCommandOrigin : InternalDisplayScriptPosition :
puteți obține informații specifice de la Linie și PositionMessage așa cum se arată mai jos.verificați acum proprietățile excepțiilor.
PS C:\WINDOWS\system32> $Error.ExceptionThe term 'This' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
Mesajul de Excepție,
PS C:\WINDOWS\system32>$error.Exception.MessageThe term 'This' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
puteți folosi alte proprietăți care credeți că va fi de ajutor pentru a afișa mesajul de eroare. Vom folosi câteva dintre acestea în blocul de captură pentru a prinde eroarea., Pe măsură ce lucrăm cu eroarea curentă, vom folosi $_. pentru a face față erorii/excepției curente.
ieșire
Error Message: The term 'This' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.Error in Line: This is not allowedError in Line Number: 3Error Item Name:
așa cum am văzut mai sus nu a existat nici un bloc în cele din urmă, dar încercați / captură a continuat să funcționeze. Puteți adăuga blocul final pentru a șterge variabilele și erorile și pentru a afișa orice mesaj.
-
încercați / Bloc de captură cu eroare Non-terminare.,
după Cum am văzut în exemplul de mai sus că Încetarea de erori pot fi controlate cu blocul Try/Catch, dar Non-Încheiere erori nu pot pentru că sunt built-in cmdlets și funcțiile generate de erori și implicit preferința pentru acțiune de Eroare este Continuă și, prin urmare, următoarea comandă continua să ruleze chiar dacă eroarea nu este tratată.
PS C:\WINDOWS\system32> $ErrorActionPreferenceContinue
Pentru a forța Non-Încheiere de eroare la Încheierea eroare de care avem nevoie pentru a schimba fie $ErrorActionPreference variabilă pentru a Opri sau necesitatea de a utiliza ErrorAction parametru cu valoare., Aici, vom folosi parametrul ErrorAction așa cum avem nevoie pentru o comandă specifică și nu pentru întregul script.
Exemplu
Ieșire
Error Message: Cannot find any service with service name 'WhichService'.Error in Line: Get-Service WhichService -ErrorAction StopError in Line Number: 4Error Item Name:This is going to run anyway
după Cum puteți vedea în exemplul de mai sus, Ia-Serviciul produce non-încheiere de eroare și putem converti în încheiere eroare de –ErrorAction Opri parametru și aceeași excepție a fost prins de Bloc Catch.
-
manipularea manuală excepție specifică
Dacă doriți să se ocupe de un anumit tip de excepție, atunci puteți furniza numele excepție în blocul de captură., Pentru a cunoaște numele excepției, trebuie să obțineți proprietatea variabilei $Error și este GetType(). În exemplul de mai jos, trebuie să găsim numele excepției din ieșirea erorii de mai jos.
exemplu
Să presupunem că eroarea dvs. este stocată în variabila $Error, trebuie să executați comanda de mai jos pentru a obține numele excepției de utilizat în blocul catch.
$Error.Exception.GetType().FullName
PS C:\WINDOWS\system32> $Error.Exception.GetType().FullNameSystem.Management.Automation.MethodInvocationException
Ai excepție de tip nume cu comanda de mai sus, puteți utiliza aceeași în bloc catch deci, bloc catch va prinde doar ca excepție specifică.,
ieșire
-
prinde mai multe PowerShell excepție.
puteți prinde, de asemenea, mai multe excepții în PowerShell. Pentru aceasta, puteți utiliza un singur bloc de încercare și mai multe blocuri de captură.
exemplu
Output
Cannot find path 'C:\temp\cominfo1.html' because it does not exist.Setting up ErrorActionPreference to the Default value
aici, în prima comandă, eroare generată astfel încât următoarea comandă nu se va executa. Dacă prima comandă nu generează nicio eroare, atunci următoarea comandă va fi verificată și dacă apare excepția, atunci se va executa Catch cu acel bloc de excepție specific.,
Dacă nu doriți să se ocupe de mai multe excepții și încă mai aveți nevoie de unele comenzi de erori pot fi ignorate, dar nu ar trebui să treacă prin bloc catch astfel încât următoarea comandă poate executa atunci puteți folosi Ignora sau SilentlyIgnore în ErrorAction Parametru.