Rechenzentrum.ps1
<#
.Synopsis Definiert das ganze Rechenzentrum #> using namespace System.Collections.Generic using namespace System.Diagnostics using namespace System.Timers Set-StrictMode -Version Latest Import-LocalizedData -BindingVariable MsgTable -FileName PSRechenzentrumMessages.psd1 # Definiert das gesamte Rechenzentrum mit einer Serverliste class Rechenzentrum { [List[Server]]$Serverliste [Bool]$InitMode = $false [String]$Desciption [String]$MsgTable [Timer]$RZTimer [ScriptBlock]$SBTimerUpdate # Der Konstruktor - es wird lediglich eine Beschreibung �bergeben Rechenzentrum([String]$Description) { $this.Desciption = $Description $this.RZInit() } [void]RZInit() { $this.Serverliste = [List[Server]]::New() $this.RZTimer = [Timer]::New() # Alle 5 Sekunden wird das Kundenkonto aktualisiert $this.RZTimer.Interval = 5000 # Wird pro Timer-Tick einmal ausgef�hrt # Ganz wichtig: Der Scriptblock kann nicht auf die Instanz der # Klasse zugreifen - $this wird daher ignoriert - einzige Option # ist die Uebergabe von $this ueber den MessageData-Parameter $this.SBTimerUpdate = { $RZ = $event.MessageData # Aktualisieren des Kontostandes fuer jeden laufenden Server $RZ.Serverliste.Where{$_.Status -eq "Running"}.ForEach{ # Trickreich: Innerhalb des switch-Statements steht $_ # f�r die Enum Serversize und nicht fuer das Server-Objekt # Write-Host -Fore Cyan ($_.GetType().Name) $Server = $_ switch($_.Size) { "Small" {$Server.Konto.Kontostand += 1} "Medium" {$Server.Konto.Kontostand += 3} "Big" { $Server.Konto.Kontostand += 10 } } # Auch die Laufzeit aktualisieren $_.RunningTime += ([DateTime]::Now - $_.StartZeit).TotalSeconds } } # $Timer.Add_Elapsed($SBTimerUpdate) # Event-Handler-Registrierung in jedem Fall entfernen Unregister-Event -SourceIdentifier KontoTimer -Force -ErrorAction Ignore # Und jetzt den Event-Handler registrieren Register-ObjectEvent -InputObject $this.RZTimer -EventName Elapsed ` -Action $this.SBTimerUpdate -SourceIdentifier KontoTimer -MessageData $this # Timer starten $this.RZTimer.Start() # Setzt Admin-Berechtigungen voraus if (![EventLog]::SourceExists("PSRechenzentrum")) { [EventLog]::CreateEventSource("PSRechenzentrum", "Application") } [EventLog]::WriteEntry("PSRechenzentrum", $Script:MsgTable.RechenzentrumInitialized, "Information"); $this.InitMode = $true } [void]AddServer([Server]$RZServer) { $this.Serverliste.Add($RZServer) } [void]RemoveServer([Server]$RZServer) { try { $this.ServerListe.Remove($RZServer) } catch { # Spielt keine Rolle } } } |