Com utilitzar PowerShell Try Catch Finalmente per gestionar els errors

15 de juliol de 2021 10258 Vistes Altra informació important sobre PowerShell Try

Un PowerShell Prova Catch El bloc s'utilitza per gestionar errors en els scripts de PowerShell. Quan utilitzeu PowerShell Prova Catch bloc per a scripts podeu aconseguir el següent:





  1. Feu que el vostre script continuï executant-se malgrat un error
  2. Mostra i gestiona millor els missatges d'error

En aquesta guia, aprendràs a utilitzar Powershell Prova Catch blocs per gestionar missatges d'error de finalització a PowerShell. A més, aprendràs a incloure el Finalment bloc en a Prova Catch bloc.



La guia comença amb la sintaxi del Prova Catch bloc.

Navega per temes de publicació



PowerShell Prova Catch Sintaxi

Sintaxi de PowerShell Try Catch

La sintaxi de PowerShell Prova Catch és…



|_+_|

El Prova és la part del bloc que voleu que PowerShell controli per detectar errors. Aquest és el bloc amb els scripts originals que poden retornar un error de finalització.

Quan es produeix un error al bloc Try, PowerShell desa l'error a la variable automàtica $Error (més informació sobre això més endavant).



D'altra banda, t ell agafar declaració de PowerShell Prova Catch block gestiona els errors generats al bloc try. També podeu especificar els tipus d'errors que es gestionen dins de Atrapar bloc de declaracions.



la millor manera de veure jocs de nfl a kodi

El Finalment block es pot utilitzar per alliberar qualsevol recurs que l'script ja no necessita.

Tipus habituals d'errors d'excepció a PowerShell Prova Catch

Tipus d'errors a PowerShell Try Catch

Podeu gestionar diferents tipus d'errors en un bloc Try Catch de PowerShell. Per exemple, podeu gestionar errors específics.

A més, podeu gestionar missatges d'error genèrics. Tanmateix, per gestionar tipus específics d'errors, cal conèixer el tipus d'error.

més endavant en aquesta guia, aprendràs que els missatges d'error es guarden a la variable automàtica $error. A més, també es poden desar errors a la variable de canalització $_.

A més, els errors desats a la variable automàtica $error es guarden en una matriu. Per ajudar a explicar-ho, executem una ordre que retorni un missatge d'error de finalització:

Per esborrar tots els errors desats anteriorment al fitxer $error variable automàtica, abans d'executar l'ordre següent, primer, executeu $error.Clear() comandament. |_+_| No hi ha cap registre d'esdeveniments anomenat Systerr, de manera que l'ordre del bloc Prova llançarà un missatge d'error.

Sorprenentment, l'ordre no mostrava cap missatge d'error. Aleshores, què va passar amb el missatge d'error?

Es desa a la variable automàtica $error! Per mostrar l'error de l'última ordre, desada a la variable $error, executeu l'ordre...

|_+_|

El resultat de l'ordre mostra els detalls de l'error desats a la variable automàtica $error. La informació d'error té una secció anomenada FullyQualifiedErrorId .

Per a aquest error específic, el FullyQualifiedErrorId té dos conjunts d'informació: System.InvalidOperationException i Microsoft.PowerShell.Commands.GetEventLogCommand .

La informació que ens interessa és System.InvalidOperationException . Aquest és un tipus d'error que podeu agafar al bloc PowerShell Try Catch.

Per obtenir el nom d'aquesta excepció de PowerShell, executeu l'ordre següent:

|_+_|

Aquí està, System.InvalidOperationException !

En les properes subseccions, parlaré dels errors d'excepció d'excepció Try Catch comuns de PowerShell.

PowerShell Try Catch CommandNotFoundException Error

Si executeu una ordre que no existeix a PowerShell o Microsoft Command Prompt, rebreu un missatge d'error. Per exemple, si executeu el Get-File comanda, rebreu un missatge d'error perquè aquesta ordre no és un cmdlet de PowerShell vàlid.

Aquí teniu una captura de pantalla del resultat de l'ordre a PowerShell...

Error de PowerShell Try Catch CommandNotFoundException

Com podeu veure a la captura de pantalla, el tipus d'excepció (FullyQualifiedErrorId) és CommandNotFoundException .

Com que es tracta d'un error de finalització, impedirà que l'script continuï. Per evitar que aquest error finalitzi el vostre script, embolcalleu l'ordre en a Prova Catch bloc.

Si embolcallem aquest error en un bloc Try Catch de PowerShell, PowerShell suprimirà l'error. A més, impedirà que finalitzi el vostre script.

Tanmateix, tot i que es suprimeix l'error, es desa a la variable $error. Com és habitual, abans d'executar l'ordre següent, primer esborra els errors desats a la variable $error.

|_+_|

Si voleu executar l'ordre a PowerShell en lloc de PowerShell ISE, escriviu les ordres en una sola línia tal com es mostra a continuació:

|_+_|

A continuació, per mostrar l'error, executeu...

|_+_|

Com he esmentat a la introducció principal d'aquesta secció, per mostrar l'ID d'excepció d'aquest error, executeu l'ordre següent:

|_+_|

El nom complet de l'excepció és System.Management.Automation.CommandNotFoundException .

PowerShell Try Catch ManagementObjectNotFoundException Error

Quan executeu una ordre en una sessió de PS remota amb la informació incorrecta, PowerShell retorna un ManagementObjectNotFoundException error.

Un escenari típic és quan us connecteu a Office 365 amb PowerShell. A continuació, executeu l'ordre Get-User però proporcioneu l'usuari incorrecte identitat .

Error de PowerShell Try Catch ManagementObjectNotFoundException

Per detectar aquest error amb PowerShell Try Catch, utilitzeu una ordre semblant a la següent:

|_+_| Atrapar el ManagementObjectNotFoundException error amb PowerShell Try, Catch és especialment complicat. Has d'utilitzar el ErrorAcció paràmetre i especificar Atura . En cas contrari, fins i tot amb l'opció Try, Catch, l'error encara es mostrarà.

Finalment, per obtenir el nom de l'excepció, utilitzeu l'ordre següent:

|_+_|

L'ordre retorna el tipus d'excepció com Automatització.Gestió.Sistema.Excepció remota . Aleshores, què és ManagementObjectNotFoundException ?

ManagementObjectNotFoundException és el motiu de l'excepció, tal com confirma l'ordre següent:

|_+_|

PowerShell Try Catch UnauthorizedAccessException Error

Un altre error comú d'excepció de PowerShell és UnauthorizedAccessException . Aquest tipus d'error es produeix quan intenteu accedir a un element que no teniu almenys un permís de lectura.

Per il·lustrar aquest exemple, vaig negar als usuaris autenticats l'accés a un fitxer específic del meu ordinador.

Error de PowerShell Try Catch UnauthorizedAccessException

Ara, si intento accedir al fitxer amb l'ordre Get-Content, rebo un missatge d'accés denegat.

|_+_|

Per evitar que es mostri aquest error, executeu l'ordre dins del bloc PowerShell Try Catch tal com es mostra a continuació...

|_+_|

Malauradament, l'ordre anterior no atura l'error que es mostra. El motiu és que no es tracta d'un error final.

Per aturar l'error, incloeu-lo ErrorAcció paràmetre i especificar Atura .

|_+_|

Ara, l'ordre suprimeix l'error. Per mostrar el tipus d'excepció, executeu l'ordre següent...

|_+_|

El tipus d'excepció és System.UnauthorizedAccessException .

Hi ha més tipus d'errors d'excepció dels que es tracta en aquesta secció. Només vaig cobrir els tipus d'excepcions més habituals.

Com capturar excepcions específiques amb PowerShell Try Catch

Com capturar excepcions específiques amb PowerShell Try Catch

L'última secció va parlar de les excepcions comunes de PowerShell i de com trobar el tipus d'excepció. Aquesta secció tractarà com utilitzar aquesta informació per capturar tipus específics de missatges d'error.

A la secció de sintaxi d'aquesta guia, vaig dir que la sintaxi general d'un PowerShell Try Catch Finally és...

|_+_|

Al bloc catch de la sintaxi, podeu veure el [tipus d'error]. Aquí és on especifiqueu el tipus d'error que voleu detectar en aquest bloc.

Per exemple, per detectar errors UnauthorizedAccessException, utilitzeu les declaracions següents...

|_+_|

Per executar l'ordre a PowerShell, especifiqueu les declaracions en una sola línia. La primera part de la instrucció – $error.Clear() – esborra qualsevol error desat a la variable $error.

|_+_|

Com afegir múltiples Atrapar Blocs en un PowerShell Prova Catch Declaració

A la introducció d'aquesta secció, us vaig mostrar com detectar un tipus específic d'excepció al fitxer Atrapar bloc. Podeu especificar múltiples

Aquí teniu un exemple...

|_+_|

En aquest exemple, el primer agafar block gestiona els tipus d'excepcions especificats. A més, el segon agafar block handles gestiona errors genèrics.

Com extreure l'excepció d'error amb PowerShell Try Catch

L'última subsecció tractava com especificar diversos blocs de captura per gestionar diferents tipus d'excepcions. En aquesta subsecció, aprendràs a extreure els detalls de l'error en una excepció.

Per il·lustrar-ho, utilitzaré un exemple que vaig fer servir abans. Executeu aquesta declaració de PowerShell a PowerShell.

|_+_|

Ara executeu només el $error...

|_+_|

Tot i que es desa informació múltiple a la variable $error, el missatge d'error real es destaca a la captura de pantalla següent.

Com extreure els detalls de l'error amb PowerShell Try Catch

Si voleu registrar aquest error en un fitxer de text, només cal que registreu els detalls reals de l'error. Per extreure aquest error, utilitzeu l'ordre següent:

|_+_|

L'ordre extreu el missatge d'error real Es denega l'accés a la ruta 'D:PS-Tutorialfolder-names.txt'.

Podeu escriure aquest missatge d'error en un fitxer de registre si inclou un Fora de fitxer comanda al bloc Catch.

|_+_| Vaig incloure el Adjuntar paràmetre a Fora de fitxer comanda per permetre el registre de diverses entrades sense sobreescriure les entrades anteriors.

Per facilitar la comprensió de l'última ordre, la tornaré a escriure en el format d'script següent...

|_+_|

Com incloure A Finalment Bloqueja a PowerShell Prova Catch Declaració

Com incloure un Finally Block a PowerShell Try Catch Statement

Podeu incloure a Finalment bloquejar a PowerShell Prova Catch Declaració. La sintaxi és

|_+_|

El finalment block es pot utilitzar per alliberar qualsevol recurs que l'script ja no necessita.

Un bloc Finally s'executa encara que utilitzeu CTRL+C per aturar l'script. El bloc també s'executarà si una paraula clau Exit atura l'script des d'un bloc Catch.

A l'últim exemple, tenia la instrucció que escriu el registre d'errors en un fitxer de text al fitxer Atrapar bloc. No obstant això, el millor lloc per tenir aquesta declaració és en a Finalment bloc.

Vegeu l'script modificat a continuació...

|_+_|

Informació útil addicional sobre PowerShell Try Catch

Altra informació important sobre PowerShell Try

En aquesta secció compartiré informació senzilla però útil sobre PowerShell Try Catch.

Com esborrar PowerShell Proveu de capturar la variable automàtica $Error

La variable automàtica $error té a Clar Mètode. Podeu utilitzar aquest mètode per esborrar tots els errors desats a la variable automàtica $error.

Per esborrar tots els errors desats a la variable automàtica $error per a la sessió actual de PowerShell, executeu l'ordre següent.

|_+_|

Com mostrar un missatge d'error personalitzat a PowerShell Try Catch Block

Per mostrar un missatge d'error personalitzat en un PowerShell Try Catch Block, utilitzeu la paraula Llançar. Aquí teniu un exemple...

|_+_|

Aquí teniu el resultat d'aquest script a PowerShell ISE.

Com mostrar un missatge d'error personalitzat a PowerShell Try Catch Block

Com obtenir informació sobre la categoria d'errors a PowerShell Try Catch

La variable automàtica $error té una propietat anomenada CategoryInfo. Per veure aquesta propietat i altres propietats i mètodes, executeu l'ordre següent...

|_+_|

Es crida una de les propietats retornades per l'última ordre Informació de categoria .

Per accedir a aquesta informació, executeu l'ordre següent.

|_+_|

Aquesta ordre retorna múltiples subpropietats.

Com obtenir informació sobre la categoria d'errors a PowerShell Try Catch

Es pot accedir a cadascuna d'aquestes subpropietats afegint el nom de la subpropietat després d'un punt. Per exemple, per mostrar les subpropietats del motiu, executeu l'ordre següent.

com combinar dues carpetes a Windows 10
|_+_|

Com utilitzar Write-Host per mostrar missatges d'error a PowerShell Try Catch

Igual que la propietat CategoryInfo a l'última subsecció, la variable automàtica $error també té una propietat anomenada Excepció . Per mostrar l'excepció en un error, executeu l'ordre següent:

|_+_|

Malauradament, si intenteu mostrar aquesta informació amb l'ordre Write-Host, no funciona com s'esperava.

|_+_|

Aquí teniu el resultat d'aquesta comanda a PowerShell...

Com utilitzar Write-Host per mostrar missatges d'error a PowerShell Try Catch

Com podeu veure, l'ordre mostra un munt d'altres dades. La bona notícia és que $error.Excepció té una altra propietat anomenada Missatge .

Podeu trucar a aquesta subpropietat afegint-la a $error.Excepció , com això…

|_+_|

A més, podeu utilitzar Escriptura-amfitrió comanda per mostrar aquesta informació d'error...

|_+_|

L'última ordre ara mostra el missatge d'error real...

Excepte que hi ha un motiu específic per utilitzar-lo Escriptura-amfitrió com es mostra a l'última ordre, simplement podeu mostrar el mateix missatge d'error amb $error.Excepció comandament.

Com crear una taula hash en un PowerShell Try Catch Block

Hi ha dues maneres habituals de crear un Taula hash de PowerShell en un bloc Try Catch.

  1. Podeu crear una taula hash amb diversos parells clau/valor dins del bloc Prova
  2. Alternativament, podeu crear una única taula hash de clau/valor amb el clau fora del Prova Catc h i el valor dins del Prova Catc bloc h.

Aquí teniu un exemple del primer mètode...

|_+_|

Com podeu veure, el hasttable es troba dins de Prova Catc bloc h...

D'altra banda, podeu crear una única clau de taula hash amb el valor definit dins de a Prova Catc bloc h. Aquí teniu un exemple...

|_+_|

Per confirmar que l'últim script produeix una taula hash de PowerShell, després d'executar l'script, vaig cridar els valors desats a la variable $hashtable.

Com podeu veure pel resultat de l'última ordre, té un parell Nom/Valor!

PowerShell Try Catch Exemples

PowerShell Try Catch Exemples

En aquesta darrera secció, tractaré diversos exemples de l'aplicació de PowerShell Try Catch.

Com utilitzar PowerShell Prova Catch Amb Get-Childitem

L'ordre Get-Childitem pot retornar diversos errors. Per il·lustrar els dos errors habituals, utilitzaré les dues ordres següents:

|_+_|

El camí correcte al fitxer de text utilitzat a l'última ordre és D:PS-Tutorialfilelist.txt.

Tanmateix, a la primera ordre vaig incloure un espai després de D:PS-Tutorial. Això va provocar un error (determinarem els detalls de l'error en breu).

A més, a la segona ordre, vaig especificar el camí correcte, però vaig utilitzar el nom de fitxer incorrecte. Això va provocar un error.

|_+_| Com utilitzar PowerShell Try Catch amb Get-Childitem

A continuació, per obtenir més informació sobre aquests errors, executaré les ordres en un PowerShell Prova Catch bloc.

|_+_|

La nostra primera tasca és determinar els tipus d'error que retornen les ordres. Per obtenir aquesta informació, executeu les ordres següents...

|_+_|

Aquests són els resultats de les ordres...

Com utilitzar PowerShell Try Catch per exportar els errors Get-WMIObject amb Export-csvEls errors desats a la variable automàtica $error s'emmagatzemen en una matriu de PowerShell . S'accedeix a cada objecte de la matriu afegint [0], [1] al final de la matriu. 0 representa el primer element de la matriu mentre que 1 representa el segon element i així successivament.

Torneu a obtenir més informació sobre els errors llançats pel Get-Childitem L'ordre, segons els tipus d'error, podem modificar el nostre bloc Try Catch per capturar aquests 2 tipus d'errors...

|_+_|

La nostra segona tasca és mostrar els missatges d'error reals. Aquesta comanda farà la feina:

|_+_|

L'ordre mostra els dos missatges d'error...

Com utilitzar PowerShell Prova Catch Per exportar errors de Get-WMIObject amb Export-csv

En aquesta subsecció, exportaré els errors generats quan executi Get-WMIObject en un ordinador remot en un fitxer CSV amb el Exportar-csv comandament.

Primer, vegem els detalls de l'error generats quan intenteu connectar-vos a un ordinador remot fora de línia Get-WMIObject . Per il·lustrar-ho, executeu l'ordre següent...

|_+_|

L'ordre ha generat un missatge d'error perquè Ordinador no és un nom de PC vàlid.

Com detectar errors de procés d'obtenció amb PowerShell Try Catch Statement

Seguint, per gestionar l'error, executaré l'ordre dins de Prova bloc d'a Prova Catch declaració.

|_+_|

A la primera línia del Prova bloc, he definit la variable $ComputerName. Llavors, a la segona línia, vaig executar el Get-WmiObject comandament.

A més, en el Atrapar bloc, vaig crear els detalls de l'error i els vaig exportar a un fitxer CSV amb Exportar-csv .

Aquí hi ha una explicació detallada del guió a Prova bloc:

analitzador wifi per a Windows 8
  1. A la línia 1, vaig crear una variable $path que especifica on vull desar el fitxer CSV
  2. Aleshores, a la línia 2, vaig utilitzar l'ordre Get-Date per crear un nom de fitxer per al fitxer CSV. El nom del fitxer té el format, aaaaMMdd_HHmmss.csv
  3. A la línia 3, vaig crear un objecte buit desat en una variable anomenada $data
  4. A continuació, a la línia 4, vaig afegir la columna 'Nom de l'ordinador' a l'objecte que vaig crear a la línia 3. La columna pren la variable $ComputerName.
  5. A la línia 5, he afegit el volum 'Missatge d'error' que desarà els missatges d'error, $error.Exception.Message
  6. A continuació, a la línia 6, vaig crear una variable $csvfilepath que combina les variables $path i $csvfilename per crear un camí complet al fitxer CSV
  7. Finalment, a la línia 7, vaig introduir la informació desada a la variable $data ($ComputerName i $error.Exception.Message) a Exportar-csv i va desar el fitxer a $csvfilepath
El NoTypeInformation El paràmetre de l'ordre Export-csv elimina la informació de tipus. Per obtenir més informació, llegiu la nostra guia, Powershell NoTypeInformation: aplicacions i exemples

La captura de pantalla següent mostra el CSV creat per l'script...

Com detectar errors de procés d'obtenció amb PowerShell Prova Catch Declaració

Si executeu l'ordre Get-Process amb un ID de procés que no existeix, tornarà a Microsoft.PowerShell.Commands.ProcessCommandException error.

Per capturar aquest tipus específic d'excepció, executeu una ordre semblant a la següent:

|_+_|

Aquí teniu el resultat de l'script a PowerShell ISE.

Alternativament, podeu definir un missatge d'error personalitzat modificant l'script tal com es mostra a continuació...

|_+_|

Ara l'script retorna el missatge d'error personalitzat...

Com detectar errors de Get-Mailbox amb PowerShell Prova Catch Declaració

Si us connecteu a Office 365 PowerShell i executeu el Get-Mailbox contra un usuari que no existeix, obtindreu un missatge d'error. Alguns usuaris han informat que tenen problemes per capturar el missatge d'error Get-Mailbox comandament.

Per provar aquest escenari, després de connectar-nos al nostre Compte d'Office 365 mitjançant PowerShell, vaig executar l'script següent:

|_+_| L'usuari, Pius, no existeix al nostre compte d'Office 365.

L'script ha retornat el missatge d'error L'operació no s'ha pogut realitzar perquè no s'ha pogut trobar l'objecte 'Pius' a 'AM6PR05A05DC002.EURPR05A005.PROD.OUTLOOK.COM ‘.

Aquí teniu la captura de pantalla...

Tanmateix, si Prova Catch detecta l'error, proveu d'afegir el tipus d'excepció tal com es mostra a l'ordre modificada següent:

|_+_|

Això és tot: la nostra guia completa i actualitzada sobre PowerShell Prova Catch Final ly! Espero que us hagi estat útil?

Si us ha semblat útil, si us plau voteu Sí a la pregunta Va ser útil aquesta publicació a continuació.

Alternativament, podeu fer una pregunta, deixar un comentari o proporcionar més comentaris amb el formulari Deixa una resposta que es troba al final d'aquesta pàgina.

Finalment, per obtenir més zones S de tecnologia de PowerShell, visiteu la nostra pàgina de guia de instruccions de Windows PowerShell. També pot ser que la nostra pàgina de treball des d'inici sigui molt útil.

Referències i lectura addicional

  1. Sobre Try Catch Finally
  2. Sobre Trap
  3. PowerShell Array i Add to Array: aplicacions i exemples
  4. Powershell For Loop explicat: sintaxi i exemples