none
Werte einlesen, auswerten und nur bei Abweichung eine Meldung generieren RRS feed

  • Frage

  • Hallo,

    als Ausgabe eines Vergleiches bekomme ich folgende Werte

    Days              : 0
    Hours             : 0
    Minutes           : 0
    Seconds           : 19
    Milliseconds      : 101
    Ticks             : 191016900
    TotalDays         : 0,000221084375
    TotalHours        : 0,005306025
    TotalMinutes      : 0,3183615
    TotalSeconds      : 19,10169
    TotalMilliseconds : 19101,69

    Jetzt möchte ich alle diese Werte nacheinander prüfen lassen ob diese null oder größer als 0 sind. Eine If/Else Anweisung ist wohl etwas unsauber programmiert da ja hintereinander nur If Anweisungen wären. Jetzt habe ich von dem Befehl Switch gelesen und denke das ich mit diesem Befehl in die richtite Richtung gehe.

    Mein Problem ist das alle Beisspiele die ich zu switch gesehen habe irgendwie nicht ganz zu übernehmen sind weil ich z.B. folgendes Beispiel nicht ganz verstehebzw. den Sinn nicht sehe

    PS> $tag = "tag5"
    PS> switch ($tag){
    tag1 {"Montag"; break}
    tag2 {"Dienstag"; break}
    tag3 {"Mittwoch"; break}
    tag4 {"Donnerstag"; break}
    tag5 {"Freitag"; break}
    tag6 {"Samstag"; break}
    tag7 {"Sonntag"; break}
    tag5 {"Zu viele Tage"; break}
    }

    Freitag

    In meinem Fall sollen ja oben genannte Werte nacheinander geprüft werden und sobald ein Wert größer 0 ist soll eine Ausgabe erscheinen die z.B. lautet Wert.... ist größer 0. Das break ist denke ich in meinem Fall wichtig da die Abfrage gleich aufhören soll sobald ein Wert größer 0 ist. Ich weis jetzt nicht so recht wie meine switch Anweisung aussehen soll. Könnt ihr mir da etwas auf die Sprünge helfen.

    Dienstag, 20. Mai 2014 19:24

Antworten

  • @Brima
    PowerShell erzeugt und Verarbeitet Objekte, um das fehleranfällige Textparsen zu vermeiden!

    Sorry Brima! Aber ich denke, wenn man in der PowerShell aus einem Objekt Text erzeugt ist das, das Falschest was man machen kann.
    Da musst du aber sehr, sehr müde gewesen sein...

    @makrumm

    Du möchtest für jedes Element etwas ausführen. Dafür gibt es in PowerShell die ForEach Schleife.

    Ich würde es so machen:

    # Timespan Objekt erzeugen
    $Timespan = New-TimeSpan (Get-Date) (get-date).AddDays(1) 
    
    # diese Array enthält die Namen der Properties vom TimeSpan Objekt, in der reihenfolge in der wir Sie Abfreagen wollen
    $PropertyNameArray = @('Days','Hours','Minutes','Second','Milliseconds','Ticks','TotalDays','TotalHours','TotalMinutes','TotalSeconds','TotalMilliseconds')
    
    # Für jedes Element im $PropertyNameArray wird etwas ausgeführt
    ForEach($PropertyName in $PropertyNameArray){
      
      # Testen ob das Property grösser 0 ist
      Write-Host "Ich Teste das Property: $PropertyName ob es grösser als 0 ist"
      If($Timespan.$PropertyName -gt 0) {
        
        # Property ist grösser als 0, Ausgabe erzeugen
        @{$PropertyName = $Timespan.$PropertyName}
        
        # ForEach Schleife sofort verlassen
        break
      }
    
      # Bonus Abfrage!
      # das Letzte Property das wir testen ist 'TotalMilliseconds'
      # wenn diese auch nicht grösser 0 ist dann haben wir keinen Wert gefunden!
      If(($PropertyName -eq 'TotalMilliseconds') -and  ($Timespan.$PropertyName -le 0)) {
        Throw 'Kein Element im TimeSpan gefunden, das Grösser als 0 ist!'
      }
    }


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    • Als Antwort vorgeschlagen brima Mittwoch, 21. Mai 2014 07:41
    • Als Antwort markiert Alex Pitulice Freitag, 30. Mai 2014 10:59
    Mittwoch, 21. Mai 2014 06:27

Alle Antworten

  • Hallo,

    also Switch dient eher dazu einen Wert auf verschiedene Bedingungen zu pruefen, du willst aber verschiedene Objekteigenschaften  eines Objektes, hier System.TimeSpan auf >= 0 pruefen.

    Mir ist irgendwie nicht ganz klar warum denn die einzelnen Werte sind immer >=0, es sei denn du baust einen TimeSpan in die Vergangenheit, dann sie aber immer <=0 wie im folgenden Beispiel

    Vermutlich ist mir deshalb und weil ich muede bin auf die schnelle nichts bessere eingefallen wie das hier:

    Days              : -1
    Hours             : 0
    Minutes           : 0
    Seconds           : 0
    Milliseconds      : 0
    Ticks             : -864000000000
    TotalDays         : -1
    TotalHours        : -24
    TotalMinutes      : -1440
    TotalSeconds      : -86400
    TotalMilliseconds : -86400000

    $ZeitSpanne = New-TimeSpan (Get-Date) (get-date).AddDays(-1) 
    $ZeitSpannenArray = (($ZeitSpanne | Out-String).Trim().Replace(',','.') -split ('\n')).split(":").trim()
    $i = 1
    do {
        if ([int64]$ZeitSpannenArray[$i] -ge 0) {
            Write-Host "Der Wert von $($ZeitSpannenArray[$i - 1]) ist >= 0 und zwar $($ZeitSpannenArray[$i])"        
        }
        $i += 2
    } until ($i -gt $ZeitSpannenArray.Count)
    Der Wert von Hours ist >= 0 und zwar 0
    Der Wert von Minutes ist >= 0 und zwar 0
    Der Wert von Seconds ist >= 0 und zwar 0
    Der Wert von Milliseconds ist >= 0 und zwar 0
    Bei einem Span in die Zukunft also $ZeitSpanne = New-TimeSpan (get-date).AddDays(-1) (Get-Date)  wuerde die Ausgabe so aussehen:
    Days              : 1
    Hours             : 0
    Minutes           : 0
    Seconds           : 0
    Milliseconds      : 0
    Ticks             : 864000000000
    TotalDays         : 1
    TotalHours        : 24
    TotalMinutes      : 1440
    TotalSeconds      : 86400
    TotalMilliseconds : 86400000
    
    Der Wert von Days ist >= 0 und zwar 1
    Der Wert von Hours ist >= 0 und zwar 0
    Der Wert von Minutes ist >= 0 und zwar 0
    Der Wert von Seconds ist >= 0 und zwar 0
    Der Wert von Milliseconds ist >= 0 und zwar 0
    Der Wert von Ticks ist >= 0 und zwar 864000000000
    Der Wert von TotalDays ist >= 0 und zwar 1
    Der Wert von TotalHours ist >= 0 und zwar 24
    Der Wert von TotalMinutes ist >= 0 und zwar 1440
    Der Wert von TotalSeconds ist >= 0 und zwar 86400
    Der Wert von TotalMilliseconds ist >= 0 und zwar 86400000

    Beste Gruesse

    brima 



    Dienstag, 20. Mai 2014 21:08
  • @Brima
    PowerShell erzeugt und Verarbeitet Objekte, um das fehleranfällige Textparsen zu vermeiden!

    Sorry Brima! Aber ich denke, wenn man in der PowerShell aus einem Objekt Text erzeugt ist das, das Falschest was man machen kann.
    Da musst du aber sehr, sehr müde gewesen sein...

    @makrumm

    Du möchtest für jedes Element etwas ausführen. Dafür gibt es in PowerShell die ForEach Schleife.

    Ich würde es so machen:

    # Timespan Objekt erzeugen
    $Timespan = New-TimeSpan (Get-Date) (get-date).AddDays(1) 
    
    # diese Array enthält die Namen der Properties vom TimeSpan Objekt, in der reihenfolge in der wir Sie Abfreagen wollen
    $PropertyNameArray = @('Days','Hours','Minutes','Second','Milliseconds','Ticks','TotalDays','TotalHours','TotalMinutes','TotalSeconds','TotalMilliseconds')
    
    # Für jedes Element im $PropertyNameArray wird etwas ausgeführt
    ForEach($PropertyName in $PropertyNameArray){
      
      # Testen ob das Property grösser 0 ist
      Write-Host "Ich Teste das Property: $PropertyName ob es grösser als 0 ist"
      If($Timespan.$PropertyName -gt 0) {
        
        # Property ist grösser als 0, Ausgabe erzeugen
        @{$PropertyName = $Timespan.$PropertyName}
        
        # ForEach Schleife sofort verlassen
        break
      }
    
      # Bonus Abfrage!
      # das Letzte Property das wir testen ist 'TotalMilliseconds'
      # wenn diese auch nicht grösser 0 ist dann haben wir keinen Wert gefunden!
      If(($PropertyName -eq 'TotalMilliseconds') -and  ($Timespan.$PropertyName -le 0)) {
        Throw 'Kein Element im TimeSpan gefunden, das Grösser als 0 ist!'
      }
    }


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    • Als Antwort vorgeschlagen brima Mittwoch, 21. Mai 2014 07:41
    • Als Antwort markiert Alex Pitulice Freitag, 30. Mai 2014 10:59
    Mittwoch, 21. Mai 2014 06:27
  • Hallo,

    @Peter: Ja desalb habe ich geschrieben das ich muede bin :-) aber ich dachte mir lieber ne schlechte Loesung wie gar keine. :-)

    sorry, fuer den flaschen Post eben, hier jetzt eine andere Loesung .

    $ZeitSpanne = New-TimeSpan (get-date) (get-date).addDays(4)
    $ZeitSpanne | Get-Member -MemberType Properties | Select-Object -expandproperty Name | Where-Object {$($ZeitSpanne.$($_)) -ge 0} | ForEach-Object {write-host "$_ >= 0 Wert $($ZeitSpanne.$($_))"}
    
    
    

    Beste Gruesse

    brima


    • Bearbeitet brima Mittwoch, 21. Mai 2014 07:41
    Mittwoch, 21. Mai 2014 07:41
  • @Brima

    Den Ansatz die Properties vorher auszulesen hatte ich auch!
    Hier hat du aber keinen Einfluss auf die Reihenfolge in der die Properites abgefragt werden.

    Ich glaube es sollte sichergestellt werden das Days vor Hours und Hours vor Minutes usw. abgefragt werden.

    Deshalb habe ich die Property Namen in eine Array getan. Damit lege ich auch die Reihenfolge fest.
    Nicht Elegant aber Funktional ;-)


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Mittwoch, 21. Mai 2014 08:07
  • ich danke euch erst mal für die vorgeschlagenen Ansätze und ich denke das ich daraus was machen kann. Falls ich scheitern sollte würde ich mich nochmal melden.
    Mittwoch, 21. Mai 2014 11:47