none
$error bzw. $? auswerten und in Textdatei ausgeben RRS feed

  • Frage

  • Moin!

    Ich habe ein Problem und weiß nicht wo das Problem liegt..

    Folgender Code:

    If($error -gt 0){
            Out-File -Append C:\PowerShellResult.txt -InputObject 'Es sind Fehler aufgetreten! Bitte überprüfen Sie C:\Errors.txt'
            $error[0..100] | Out-File C:\Errors.txt       
            }
            else
            {
            Out-File -Append C:\PowerShellResult.txt -InputObject 'Es sind keine Fehler aufgetreten!'
    }

    Ich bekomme immer die Fehlermeldung, dass die Abschließende "}" in der Anweisung fehlt.

    Getestete Alternativen:

    IF($error.Caption(0..100)){} etc. ergibt immer den gleichen Fehler. Daran liegt es wohl nicht.

    Ohne IF(){}else{} also:

    $error(0..100) | Out-File C:\Errors.txt

    Klappt wunderbar..

    Ähnlich wenig Erfolg habe ich wenn ich mit:

    If($?){
            Out-File -Append C:\PowerShellResult.txt -InputObject 'Es sind Fehler aufgetreten! Bitte überprüfen Sie C:\Errors.txt'
            $error[0..100] | Out-File C:\Errors.txt       
            }
            else
            {
            Out-File -Append C:\PowerShellResult.txt -InputObject 'Es sind keine Fehler aufgetreten!'
    }

    "$error[0..100]" kann ich natürlich nicht einfach durch "$?[0]" ersetzen, weil ich die Fehlermeldung und nicht "True" in der Textdatei haben möchte. Zudem möchte ich die If-Abfrage ja nicht nach jedem Befehl schreiben.

    Bin noch lang kein Profi!

    Was übersehe ich da??

    Montag, 11. August 2014 19:32

Antworten

  • Hi,

    >>Ich bekomme immer die Fehlermeldung, dass die Abschließende "}" in der Anweisung fehlt.
     

    Das ist seltsam, denn zumindest dein Code oben hat keinen Klammerfehler. Das Problem wird wohl im Rest deines Skriptes liegen. Oder es ist ein kurioser Formatierungsfehler (tritt im ISE manchmal auf). Kopiere mal deinen Code oben wieder zurück in ein leeres Script in deinem Editor. Das läuft fehlerfrei.

    $error ist übrigens keine numerische Variable, daher solltest du auch nicht "-gt 0" benutzen. Das mag funktionieren, ich würd mich aber nicht drauf verlassen. $error ist entweder leer (kein Fehler) oder hat einen Inhalt (Fehler), daher reicht die Abfrage IF ($error) { ... }.

    Abgesehen davon ist es schon etwas kurios erst am Ende alle Fehler auszuschütten. :-) Das mag vielleicht Sinn machen wenn du z.B. hundertfach File-Zugriffsfehler erwartest, aber auch dann würde ich halt die Filenamen loggen und nicht immer wieder die komplette Fehlermeldung rausschreiben.

    Normalerweise aber, versucht man immer Fehler dort abzufangen und zu behandeln wo sie auftreten und nicht hinterher ein großes File mit Fehlermeldungen zu haben von denen du nicht mal weißt wann und wo genau sie aufgetreten sind.
      
    >>Zudem möchte ich die If-Abfrage ja nicht nach jedem Befehl schreiben.

    In der Regel kann ja auch nicht bei jedem Befehl ein Fehler auftreten. Es gilt die Stellen zu lokalisieren wo Fehler mit höherer Wahrscheinlichkeit auftreten und dort auf die zu erwartenden Fehler zu reagieren. Der Nebeneffekt davon ist, das du so auch merkst wo die Schwachstellen in deinem Code sind und ihn gleich so anpassen kannst das die Fehlerwahrscheinlichkeit geringer wird.

    Alternativ kannst du auch wenigstens einen Funktionsaufruf einfügen z.b.:

    if ($error) { MyErrorLogFunction }

    In der Funktion "MyErrorLogFunction" definierst du dann was bei einem Fehler passieren soll, Logging und/oder Consolen-Ausgabe etc. Und vergiss nicht $error wieder zu löschen. ($error.clear())
    So kannst du den Fehlermeldungen vor dem Loggen z.b auch einen Zeitstempel verpassen und einen Zeilenumbruch am Ende, was das Ganze dann bedeutend besser lesbar macht.

    Du kannst diese Funktion dann im Laufe der Zeit verfeinern, z.b. mit Fehlercodes die du der Funktion mitgibst  (z.b 1,2 oder 3) die dann z.b. bei einem schweren Fehler (3) das Script abbrechen, bei einem Leichten (1) nur loggen etc.

    So etwas schreibt man sich ein mal richtig, mit Variablen an den richtigen Stellen (z.b. für den Log-filename) dann kannst du das in allen deinen Scripten nutzen.

    Darüber hinaus kannst du noch dann alle unbehandelten Ausnahmefehler mit einer generellen Trap abfangen und du hast eine eine vernünftige Fehlerbehandlung für dein Script.

    Gute Fehlerbehandlung ist das A und O eines gutes Scriptes. Und ja, eine gute Fehlerbehandlung verdoppelt schnell die Anzahl der Codezeilen und verlängert die Entwicklungszeit um 5-10%. Das hast du allerdings schnell, gerade bei etwas größeren Scripten, beim ersten Fehler den du Debuggen musst wieder raus.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v3: Link
    (Schneller, besser + einfacher scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.


    Dienstag, 12. August 2014 00:26
    Moderator

Alle Antworten

  • Hi,

    >>Ich bekomme immer die Fehlermeldung, dass die Abschließende "}" in der Anweisung fehlt.
     

    Das ist seltsam, denn zumindest dein Code oben hat keinen Klammerfehler. Das Problem wird wohl im Rest deines Skriptes liegen. Oder es ist ein kurioser Formatierungsfehler (tritt im ISE manchmal auf). Kopiere mal deinen Code oben wieder zurück in ein leeres Script in deinem Editor. Das läuft fehlerfrei.

    $error ist übrigens keine numerische Variable, daher solltest du auch nicht "-gt 0" benutzen. Das mag funktionieren, ich würd mich aber nicht drauf verlassen. $error ist entweder leer (kein Fehler) oder hat einen Inhalt (Fehler), daher reicht die Abfrage IF ($error) { ... }.

    Abgesehen davon ist es schon etwas kurios erst am Ende alle Fehler auszuschütten. :-) Das mag vielleicht Sinn machen wenn du z.B. hundertfach File-Zugriffsfehler erwartest, aber auch dann würde ich halt die Filenamen loggen und nicht immer wieder die komplette Fehlermeldung rausschreiben.

    Normalerweise aber, versucht man immer Fehler dort abzufangen und zu behandeln wo sie auftreten und nicht hinterher ein großes File mit Fehlermeldungen zu haben von denen du nicht mal weißt wann und wo genau sie aufgetreten sind.
      
    >>Zudem möchte ich die If-Abfrage ja nicht nach jedem Befehl schreiben.

    In der Regel kann ja auch nicht bei jedem Befehl ein Fehler auftreten. Es gilt die Stellen zu lokalisieren wo Fehler mit höherer Wahrscheinlichkeit auftreten und dort auf die zu erwartenden Fehler zu reagieren. Der Nebeneffekt davon ist, das du so auch merkst wo die Schwachstellen in deinem Code sind und ihn gleich so anpassen kannst das die Fehlerwahrscheinlichkeit geringer wird.

    Alternativ kannst du auch wenigstens einen Funktionsaufruf einfügen z.b.:

    if ($error) { MyErrorLogFunction }

    In der Funktion "MyErrorLogFunction" definierst du dann was bei einem Fehler passieren soll, Logging und/oder Consolen-Ausgabe etc. Und vergiss nicht $error wieder zu löschen. ($error.clear())
    So kannst du den Fehlermeldungen vor dem Loggen z.b auch einen Zeitstempel verpassen und einen Zeilenumbruch am Ende, was das Ganze dann bedeutend besser lesbar macht.

    Du kannst diese Funktion dann im Laufe der Zeit verfeinern, z.b. mit Fehlercodes die du der Funktion mitgibst  (z.b 1,2 oder 3) die dann z.b. bei einem schweren Fehler (3) das Script abbrechen, bei einem Leichten (1) nur loggen etc.

    So etwas schreibt man sich ein mal richtig, mit Variablen an den richtigen Stellen (z.b. für den Log-filename) dann kannst du das in allen deinen Scripten nutzen.

    Darüber hinaus kannst du noch dann alle unbehandelten Ausnahmefehler mit einer generellen Trap abfangen und du hast eine eine vernünftige Fehlerbehandlung für dein Script.

    Gute Fehlerbehandlung ist das A und O eines gutes Scriptes. Und ja, eine gute Fehlerbehandlung verdoppelt schnell die Anzahl der Codezeilen und verlängert die Entwicklungszeit um 5-10%. Das hast du allerdings schnell, gerade bei etwas größeren Scripten, beim ersten Fehler den du Debuggen musst wieder raus.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com

    Kostenloser Powershell Snippet Manager v3: Link
    (Schneller, besser + einfacher scripten.)

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.


    Dienstag, 12. August 2014 00:26
    Moderator
  • Moin Denniver,

    holla die Waldfee, das war fix und ausführlich!

    Vielen Dank dafür!

    Ich habe letzt Nacht weiter daran gearbeitet. Schreibe ich den gesamten If-Part in einem Ein-Zeiler, klappt alles wunderbar..

    In neugestarteter ISE oder neugestartetet PS-Konsole tritt allerdings wieder der Fehler auf wenn ich es wie oben formatiere.

    Kurz zum Hintergrund weshalb ich $error[0..100] ausgebe:

    Insgesamt gibt es nur so um die 20 Befehle/Einstellungen die durch das Script gesetzt werden. Es läuft zusammen mit MDT bei der Rechnerinstallation. Die Errors.txt soll zunächst nur ein Indiz sein DASS etwas fehlschlug. In PowerShellResult.txt stehen nachher auch sämtlichen "Erfolge" drin.

    Was den Wert von $error angeht habe ich oben die "falsche" Bedingung gepostet. (Hab ja vieles probiert..) - In meiner jetzigen Version steht dort natürlich If($error.count -gt 0){}

    Jetzt fange ich an für den meisten Kram Variablen zu setzen. Was das Logging angeht finde ich die Idee ziemlich top! (Wahrscheinlich standard oder ?)

    Ich werde also auch eine Funktion bauen die mir das gewünschte Logging ausgibt.

    Vielen Dank noch mal für die Fixe Antwort!

    Wenn du noch Ideen oder Vorschläge hast, gerne her damit.

    Gruß

    Byvust

    Dienstag, 12. August 2014 08:19