none
In einer Foreach-Schlaufe den Wert(Value) einer Hashtabelle erhöhen. RRS feed

  • Frage

  • Hallo zusammen.

    Ich schreibe gerade ein Script welches mir die Anzahl aller iPhone's mit einer gewissen Version des iOS angibt.
    Im Hashtable habe ich vorgegebene Versionen des iOS, zum Beispiel: "iOS 6.1.3*".
    Alle Handy's die das Script findet speichere ich in einer Variable ab und vergleiche sie mit der Hashtable und die Versionen, die noch nicht vorhanden sind werden hinzugefügt.

    Das alles läuft in einem Foreach ab und jetzt such ich noch einen Weg wie ich eine Variable mit allen Versionen des OS der Handys mit der Hashtable vergleichen kann und für jede Übereinstimmung bei der betreffenden den Wert um 1 erhöhen kann.

    Hier noch das Skript:

    $s = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://srv00832/powershell -Authentication Kerberos
    Import-PSSession $s -EA SilentlyContinue
    $Zaehler = 0
    $iPhoneiOS = 0
    $AppleGeraete = 0
    $iPhoneHashiOS = @{"iOS 6.0*" = 0; "iOS 6.1 *" = 0; "iOS 6.1.1 *" = 0; "iOS 6.1.2 *" = 0; "iOS 6.1.3 *" = 0; "iOS 7.0 *" = 0; "iOS 7.0.2 *" = 0; "iOS 7.0.3 *" = 0; "iOS 7.0.4 *" = 0; "iOS 7.1 *" = 0} 
    [Array]$ADUser = Get-CASMailbox -ResultSize 20 | Where {$_.HasActiveSyncDevicePartnership -eq $TRUE}
    foreach ($User in $ADUser)
    {
    	$Zaehler++
    	$AcSyDeStatisticList = Get-ActiveSyncDeviceStatistics -Mailbox $($User.SamAccountName)
        foreach ($AcSyDeStatistic in $AcSyDeStatisticList)
    	{
    		$LastSyncTime = $($AcSyDeStatistic.LastSuccessSync)
    		If ($LastSyncTime -ne $null)
    		{
    			$LastSyncDiff = $LastSyncTime - $(Get-Date)
    			If ($LastSyncDiff -gt $Zeitraum)
    			{
                    $iPhoneHashiOS | foreach-object {if($AcSyDeStatistic.DeviceOS -ne $iPhoneHashiOS){$iPhoneHashiOS.Add($AcSyDeStatistic.DeviceOS, 1)}
                    $iPhoneHashiOS = $iPhoneHashiOS | select -Unique
                    if (($($AcSyDeStatistic.DeviceOS) -eq $null) -and ($($AcSyDeStatistic.DeviceUserAgent) -like "Apple*")){$iPhoneiOS++}
                    if ($($AcSyDeStatistic.DeviceUserAgent) -like "Apple*"){$AppleGeraete++}
                  
                    }
                }
            }
        }

    Falls mir jemand helfen könnte wäre ich sehr froh darüber.

    Gruss Dominique


    Dominique Hofmann

    Montag, 24. März 2014 11:16

Antworten

  • Meinst du das so:
     

    $iPhoneHashiOS = @{"iOS 6.0*" = 0; "iOS 6.1 *" = 0; "iOS 6.1.1 *" = 0; "iOS 6.1.2 *" = 0; "iOS 6.1.3 *" = 0; "iOS 7.0 *" = 0; "iOS 7.0.2 *" = 0; "iOS 7.0.3 *" = 0; "iOS 7.0.4 *" = 0; "iOS 7.1 *" = 0} $mystring ="iOS 6.0" Foreach ($key in $iPhoneHashiOS.Keys) { if ( $mystring -like $key ) { $iPhoneHashiOS[$key] += 1 break

    } } write-output $iPhoneHashiOS

     
    Hashtables zur durchforsten ist (beim ersten mal) tricky, weil man nicht  intuitiv auf die Lösung kommt. Beim Ausgeben werden die Einträge unter "Name" und "Value" in der Tabelle aufgeführt. Mit "$myhash.Names" z.b., was logisch wäre, kommt man aber nicht weit. $myhash.Keys lautet die Liste aller Namen der Hashtable-Einträge durch die man iterieren kann.

    Die Frage ist aber noch, welches Format deine Strings zum Vergleichen genau haben. Warscheinlich ist ein REGEX-Vergleich sinnvoller als meine Lösung oben, da du hierbei manchmal mehrere Treffer haben wirst.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com
    Powershell Codesnippet Manager: Link

    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.


    Mittwoch, 26. März 2014 15:25
    Moderator
  • PowerShell ist eine Dynamische Sprache.
    Deshalb kannst du Ganz einfach neuen Member zu einer Hashtable hinzufügen.
    Aus diesem Grund ist deine Zeile mit der Hashtable Initialisierung völlig unnötig!

    Eine Hashtable

    # Leere Hashtable definieren
    $iPhoneHashiOS = @{}
    
    # Alle Key-Namen zu der Hashtable Dynamisch zufügen
    # Zur Demonstration habe ich absichtlich einige Keys doppelt in dem Array!
    ForEach($KeyName in @("iOS 6.0*","iOS 6.1*","iOS 6.1.1*","iOS 6.0*","iOS 6.1*","iOS 6.1.1*","iOS 6.1.2*","iOS 6.1.3*","iOS 7.0*","iOS 7.0.2*","iOS 7.0.3*","iOS 7.0.4*","iOS 7.1*")) {
        # der Kenyame wird der hashtable zugefügt wenn er noch nicht existiert
        # doppelte Keys sind unmöglich!
        # Der Value des Keys wird mit 0 Initialisiert
        $iPhoneHashiOS.$KeyName = 0
    }
    
    # gefüllte Hashtable anzeigen (Key und Value)
    $iPhoneHashiOS

    Die Keys in einer Hashtable sind IMMER eindeutig! Deshalb ist folgende Zeile überflüssig:

    $iPhoneHashiOS = $iPhoneHashiOS | select -Unique

    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 markiert coolmanii Montag, 31. März 2014 10:46
    Montag, 31. März 2014 09:23
  • Ist kein Problem! Du kannst beide Techniken kombinieren!

    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 markiert coolmanii Montag, 31. März 2014 10:46
    Montag, 31. März 2014 10:00

Alle Antworten

  • Meinst du das so:
     

    $iPhoneHashiOS = @{"iOS 6.0*" = 0; "iOS 6.1 *" = 0; "iOS 6.1.1 *" = 0; "iOS 6.1.2 *" = 0; "iOS 6.1.3 *" = 0; "iOS 7.0 *" = 0; "iOS 7.0.2 *" = 0; "iOS 7.0.3 *" = 0; "iOS 7.0.4 *" = 0; "iOS 7.1 *" = 0} $mystring ="iOS 6.0" Foreach ($key in $iPhoneHashiOS.Keys) { if ( $mystring -like $key ) { $iPhoneHashiOS[$key] += 1 break

    } } write-output $iPhoneHashiOS

     
    Hashtables zur durchforsten ist (beim ersten mal) tricky, weil man nicht  intuitiv auf die Lösung kommt. Beim Ausgeben werden die Einträge unter "Name" und "Value" in der Tabelle aufgeführt. Mit "$myhash.Names" z.b., was logisch wäre, kommt man aber nicht weit. $myhash.Keys lautet die Liste aller Namen der Hashtable-Einträge durch die man iterieren kann.

    Die Frage ist aber noch, welches Format deine Strings zum Vergleichen genau haben. Warscheinlich ist ein REGEX-Vergleich sinnvoller als meine Lösung oben, da du hierbei manchmal mehrere Treffer haben wirst.

    Grüße, Denniver


    Blog: http://bytecookie.wordpress.com
    Powershell Codesnippet Manager: Link

    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.


    Mittwoch, 26. März 2014 15:25
    Moderator
  • Vielen Dank für die rasche und hilfreiche Antwort.

    Jetzt habe ich aber noch eine kleine Frage:
    Ich habe ja oben im Hashtable vordefinierte iOS-Versionen und wenn jetzt eine Version kommt die neuer ist als die in der Liste, möchte ich gerne, dass diese Version zusätzlich im Hashtable noch hinzugefügt wird.

    Ist das möglich zu realisieren ?

    Gruss Dominique


    Dominique Hofmann

    Montag, 31. März 2014 07:44
  • PowerShell ist eine Dynamische Sprache.
    Deshalb kannst du Ganz einfach neuen Member zu einer Hashtable hinzufügen.
    Aus diesem Grund ist deine Zeile mit der Hashtable Initialisierung völlig unnötig!

    Eine Hashtable

    # Leere Hashtable definieren
    $iPhoneHashiOS = @{}
    
    # Alle Key-Namen zu der Hashtable Dynamisch zufügen
    # Zur Demonstration habe ich absichtlich einige Keys doppelt in dem Array!
    ForEach($KeyName in @("iOS 6.0*","iOS 6.1*","iOS 6.1.1*","iOS 6.0*","iOS 6.1*","iOS 6.1.1*","iOS 6.1.2*","iOS 6.1.3*","iOS 7.0*","iOS 7.0.2*","iOS 7.0.3*","iOS 7.0.4*","iOS 7.1*")) {
        # der Kenyame wird der hashtable zugefügt wenn er noch nicht existiert
        # doppelte Keys sind unmöglich!
        # Der Value des Keys wird mit 0 Initialisiert
        $iPhoneHashiOS.$KeyName = 0
    }
    
    # gefüllte Hashtable anzeigen (Key und Value)
    $iPhoneHashiOS

    Die Keys in einer Hashtable sind IMMER eindeutig! Deshalb ist folgende Zeile überflüssig:

    $iPhoneHashiOS = $iPhoneHashiOS | select -Unique

    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 markiert coolmanii Montag, 31. März 2014 10:46
    Montag, 31. März 2014 09:23
  • Das Problem ist, dass ich bei meinem Script eine Liste von iOS Versionen bekomme und wenn eine Version nicht in der Liste ist, das diese Version automatisch der Liste hinzugefügt wird und ich so keine Version manuell hinzufügen muss....

    Dominique Hofmann

    Montag, 31. März 2014 09:47
  • Ist kein Problem! Du kannst beide Techniken kombinieren!

    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 markiert coolmanii Montag, 31. März 2014 10:46
    Montag, 31. März 2014 10:00