none
Test-Connection Script mit 2 Ausgaben? RRS feed

  • Frage

  • Hallo,

    Ich kämpfe gerade mit folgendem Problem:

    Ich möchte ein Test-Connection auf ein Ziel am Ende eine Standleitung (Entfernter Standort) machen.

    Das Ergebnis möchte ich sowohl am Bildschirm, als auch in einer Logdatei haben. Sollte die Verbindung weg sein, sollte sowohl am Bildschirm, als auch in der Log-Datei eine Fehlermeldung mit Zeitstempel stehen.

    Ich möchte das Log länger laufen lassen und benötige dazu auch den Zeitstempel.

    Folgendes Konstrukt hab ich schon hinbekommen, funktioniert aber nur teilweise:

    1. $Source = Read-Host "Ping-Ziel eingeben"
    2. if(Test-Connection $Source -count 1 -quiet) {Test-Connection $Source -count 1 | Format-Table @{n='TimeStamp';e={Get-Date}}, Address, ProtocolAddress, ResponseTime  -AutoSize | Tee-Object -file c:\temp\test-connection.txt -append} else  {Write-Host -ForegroundColor Red "$Source NICHT erreichbar!" }

    Das if prüft, ob die Verbindung da ist oder nicht, wenn ja, erfolgt ein Test-Connection mit Anzeige des Zeitstempels, Ziel und Antwortzeit. Das wird gleichzeitig in eine Datei geschrieben und funktioniert auch.

    Wenn die Verbindung weg ist, wird auf dem Bildschirm eine Ausgabe gemacht, die ich aber nicht in die Datei bekomme.

    Wie muss ich das ändern, das die Ausgabe im Fehlerfall ebenfalls MIT Zeitstempel sowohl auf dem Bildschirm UND in die Datei geschrieben werden?

    Kann man das auch eleganter lösen?

    Ich danke schon mal.


    Rene Hubert - Systemadministrator - DRK KH Lichtenstein gGmbH


    • Bearbeitet Hubi Freitag, 4. Januar 2013 10:46
    Freitag, 4. Januar 2013 10:39

Antworten

  • Hallo Hubi!

    Die Format-xxx Cmdlets sind fast nicht dafür geeignet um Objekte zu erzeugen oder in der Pipline weitergereicht zu werden!
    Diese sind hauptsächlich dazu da, um eine Bildschirmausgabe zu formatieren!
    Deshalb sollten die Format-xxx Cmdlets grundsätzlich als letztes in der Pipeline stehen!
    Hier wäre Export-CSV die bessere Wahl!

    Einen –Append Parameter gibt es nicht bei Tee-Object nicht deshalb müssen wir hier Out-File nutzen!
    Hier wäre alternativ wieder besser  Export-CSV zu nutzen, leider hat auch dies erst ab PowerShell 3.0 einen
    -Append Parameter.
    Deshalb nutze ich hier die Text Verbindungen mit dem Plus-Zeichen.

    Bitte benutze hier im Forum die Möglichkeit Code auch als Code zu Posten!
    Bitte gewöhne dir an den Code ordentlich einzurücken, dann kann man ihn leichter lesen (so wie meinen Code)!
    DANKE!

    Ich würde es so machen:

    # Pfad zur Logdatei festlegen 
    $LogDatei = "c:\temp\test-connection.txt"
    
    # Ziel Computernamen abfragen
    $Source = Read-Host "Ping-Ziel eingeben"
    
    # Ping Zeit festhalten und im deutschen Format Formatieren
    $PingTime = [String](Get-Date -UFormat "%d.%m.%Y %H:%M:%S")
    
    # Pingen
    $PingTest = Test-Connection $Source -count 1 -ErrorAction silentlycontinue # Fehlermeldung unterdrücken
    
    # Wenn Zielcomputer nicht erreichbar ist, dann ist $PingTest = $Null
    If ($PingTest -eq $Null) {
       # Ziel ist NICHT erreichbar!
             
       # Ausgabe objekt erstellen
       $OutObject = '' | Select-Object @{Name="TimeStamp"; Expression = {$PingTime}}, @{Name="Address"; Expression = {$Source}}, ProtocolAddress, ResponseTime
       
       # Ausgabe auf dem Bilschirm
       Write-Host -ForegroundColor Red "Ziel Computer:  $Source ist nicht erreichbar!" 
       $OutObject | Format-Table -AutoSize
       
       # Objekt ausgabe in Datei
       $OutObject | Out-File $LogDatei -Append
       
       # Alternative CSV ausgabe mit semicolas (Kommentarzeichen # in der nächten Zeile entfernen)
       # [String]$OutObject.TimeStamp + ";" + [String]$OutObject.Address + ";" + [String]$OutObject.ProtocolAddress + ";" + [String]$OutObject.ResponseTime | Out-File $LogDatei -Append
        
    }
    Else {
       # Ziel ist erreichbar!
      
       # Ausgabe objekt erstellen
       $OutObject = $PingTest | Select-Object @{Name="TimeStamp"; Expression = {$PingTime}}, Address, ProtocolAddress, ResponseTime 
       
       # Ausgabe auf dem Bilschirm
       $OutObject | Format-Table -AutoSize
       
       # Objekt ausgabe in Datei
       $OutObject | Out-File $LogDatei -Append
       
       # Alternative CSV ausgabe mit semicolas getrennte Werte (Kommentarzeichen # in der nächten Zeile entfernen)
       # [String]$OutObject.TimeStamp + ";" + [String]$OutObject.Address + ";" + [String]$OutObject.ProtocolAddress + ";" + [String]$OutObject.ResponseTime | Out-File $LogDatei -Append
       
    }


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!


    • Bearbeitet Peter Kriegel Freitag, 4. Januar 2013 12:59
    • Als Antwort markiert Hubi Freitag, 4. Januar 2013 13:40
    Freitag, 4. Januar 2013 12:58

Alle Antworten

  • Hallo Hubi!

    Die Format-xxx Cmdlets sind fast nicht dafür geeignet um Objekte zu erzeugen oder in der Pipline weitergereicht zu werden!
    Diese sind hauptsächlich dazu da, um eine Bildschirmausgabe zu formatieren!
    Deshalb sollten die Format-xxx Cmdlets grundsätzlich als letztes in der Pipeline stehen!
    Hier wäre Export-CSV die bessere Wahl!

    Einen –Append Parameter gibt es nicht bei Tee-Object nicht deshalb müssen wir hier Out-File nutzen!
    Hier wäre alternativ wieder besser  Export-CSV zu nutzen, leider hat auch dies erst ab PowerShell 3.0 einen
    -Append Parameter.
    Deshalb nutze ich hier die Text Verbindungen mit dem Plus-Zeichen.

    Bitte benutze hier im Forum die Möglichkeit Code auch als Code zu Posten!
    Bitte gewöhne dir an den Code ordentlich einzurücken, dann kann man ihn leichter lesen (so wie meinen Code)!
    DANKE!

    Ich würde es so machen:

    # Pfad zur Logdatei festlegen 
    $LogDatei = "c:\temp\test-connection.txt"
    
    # Ziel Computernamen abfragen
    $Source = Read-Host "Ping-Ziel eingeben"
    
    # Ping Zeit festhalten und im deutschen Format Formatieren
    $PingTime = [String](Get-Date -UFormat "%d.%m.%Y %H:%M:%S")
    
    # Pingen
    $PingTest = Test-Connection $Source -count 1 -ErrorAction silentlycontinue # Fehlermeldung unterdrücken
    
    # Wenn Zielcomputer nicht erreichbar ist, dann ist $PingTest = $Null
    If ($PingTest -eq $Null) {
       # Ziel ist NICHT erreichbar!
             
       # Ausgabe objekt erstellen
       $OutObject = '' | Select-Object @{Name="TimeStamp"; Expression = {$PingTime}}, @{Name="Address"; Expression = {$Source}}, ProtocolAddress, ResponseTime
       
       # Ausgabe auf dem Bilschirm
       Write-Host -ForegroundColor Red "Ziel Computer:  $Source ist nicht erreichbar!" 
       $OutObject | Format-Table -AutoSize
       
       # Objekt ausgabe in Datei
       $OutObject | Out-File $LogDatei -Append
       
       # Alternative CSV ausgabe mit semicolas (Kommentarzeichen # in der nächten Zeile entfernen)
       # [String]$OutObject.TimeStamp + ";" + [String]$OutObject.Address + ";" + [String]$OutObject.ProtocolAddress + ";" + [String]$OutObject.ResponseTime | Out-File $LogDatei -Append
        
    }
    Else {
       # Ziel ist erreichbar!
      
       # Ausgabe objekt erstellen
       $OutObject = $PingTest | Select-Object @{Name="TimeStamp"; Expression = {$PingTime}}, Address, ProtocolAddress, ResponseTime 
       
       # Ausgabe auf dem Bilschirm
       $OutObject | Format-Table -AutoSize
       
       # Objekt ausgabe in Datei
       $OutObject | Out-File $LogDatei -Append
       
       # Alternative CSV ausgabe mit semicolas getrennte Werte (Kommentarzeichen # in der nächten Zeile entfernen)
       # [String]$OutObject.TimeStamp + ";" + [String]$OutObject.Address + ";" + [String]$OutObject.ProtocolAddress + ";" + [String]$OutObject.ResponseTime | Out-File $LogDatei -Append
       
    }


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!


    • Bearbeitet Peter Kriegel Freitag, 4. Januar 2013 12:59
    • Als Antwort markiert Hubi Freitag, 4. Januar 2013 13:40
    Freitag, 4. Januar 2013 12:58
  • Danke, das bringt mich schon weiter.

    Zwar umfangreicher als mein Zeugs, aber auch besser lesbar.

    Ich gelobe Besserung, was die Schreibweise angeht.


    Rene Hubert - Systemadministrator - DRK KH Lichtenstein gGmbH

    Freitag, 4. Januar 2013 13:53
  • Supi!

    Es ist in PowerShell IMMER eine gute Idee Objekte als Ergebnis zu erzeugen (wie oben gezeigt).
    Wie das geht habe ich hier in meinem Blog erklärt:

    PowerShell eigene Objekte erstellen Custom Objects
    http://www.admin-source.de/BlogDeu/463/powershell-eigene-objekte-erstellen-custom-objects

    Schönes Wochenende!


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    Freitag, 4. Januar 2013 14:33
  • ..
    Hier wäre alternativ wieder besser  Export-CSV zu nutzen, leider hat auch dies erst ab PowerShell 3.0 einen
    -Append Parameter.

     Hallo,

    wenn du eine csv haben willst, dann kannst du doch convertto-csv nutzen und dies in out-file pipen mit -append?

    Gruss

    Bastian

    Samstag, 5. Januar 2013 13:32
  • @baschuel

    Grundsätzlich hast du recht! Aber....

    Bei jedem Aufruf von ConverTo-CSV wird die Headerzeile mit den Spaltenüberschriften generiert und in die Datei geschrieben.
    Das entspricht nicht den CSV Format!
    siehe Wikipedia und RFC 4180!http://de.wikipedia.org/wiki/CSV_%28Dateiformat%29
    und http://tools.ietf.org/html/rfc4180

    Die Headerzeile muss dann jedes mal entfernt werden, sonnst erscheinen die zusätzlichen Headerzeilen später beim einlesen als Daten.
    Das Entfernen habe ich mir erspart, indem ich einfach meine CSV Zeile "dumm" mit Text selbst erstelle.
    Man könnte die Ergebnisse auch erst mal in einem Array sammeln und dann als CSV ausgeben, das klappt hier aber nicht, da das Script wahrscheinlich immer wieder neu gestartet wird (täglich oder so...).


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!


    Montag, 7. Januar 2013 06:43
  • Hallo,

    ich hab das, wie vorgeschlagen, mit csv gemacht. Die Kopfzeile brauch ich nicht zwingend. Es ging nur darum, regelmäßig über einen Zeitraum Aussetzer in unserer Leitung zu protokollieren, und das möglichst mit Zeitstempel.

    Ich sollte wirklich langsam mal einen Kurs besuchen! ;-)


    Rene Hubert - Systemadministrator - DRK KH Lichtenstein gGmbH

    Montag, 7. Januar 2013 19:02