none
Mit Powershell Countdown erstellen RRS feed

  • Frage

  • Hallo zusammen,

    ich möchte vorweg nehmen das ich in der Powershell Programmierung recht neu bin. Für ein kleines Nebenprojekt habe ich bereits folgendes erstellt:

    #Assemblys holen
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
    
    #Fensterobjekt erstellen
    $objForm = New-Object System.Windows.Forms.Form
    
    #Position/Groesse
    $objForm.StartPosition = "CenterScreen"
    $objForm.Size = New-Object System.Drawing.Size(500,300)
    
    #Schriftart
    $objForm.Font= New-Object System.Drawing.Font("Broadway",18,[System.Drawing.FontStyle]::Bold)
    
    #Ueberschrift
    $objForm.Text = "Counter"
    
    [datetime]$Countdown = "11/10/2015 00:00"
    $count = ($Countdown-(get-date))
    
    #Größe Daten
    $breite = 60
    $hoehe = 30
    
    #Tage
    $Tage = New-Object System.Windows.Forms.Label
    $Tage.Location = New-Object System.Drawing.Point(10,50)
    $Tage.Size = New-Object System.Drawing.Size($breite,$hoehe)
    $Tage.BackColor = "Transparent"
    $Tage.Text = $count.Days
    $Tage.Name = "Tage"
    $objForm.Controls.Add($Tage)
    
    #Stunden
    $Stud = New-Object System.Windows.Forms.Label
    $Stud.Location = New-Object System.Drawing.Point(75,50)
    $Stud.Size = New-Object System.Drawing.Size($breite,$hoehe)
    $Stud.BackColor = "Transparent"
    $Stud.Text = $count.Hours
    $Stud.Name = "Stunden"
    $objForm.Controls.Add($Stud)
    
    #Minuten
    $Min = New-Object System.Windows.Forms.Label
    $Min.Location = New-Object System.Drawing.Point(140,50)
    $Min.Size = New-Object System.Drawing.Size($breite,$hoehe)
    $Min.BackColor = "Transparent"
    $Min.Text = $count.Minutes
    $Min.Name = "Minuten"
    $objForm.Controls.Add($Min)
    
    #Sekunden
    $Sek = New-Object System.Windows.Forms.Label
    $Sek.Location = New-Object System.Drawing.Point(205,50)
    $Sek.Size = New-Object System.Drawing.Size($breite,$hoehe)
    $Sek.BackColor = "Transparent"
    $Sek.Text = $count.Seconds
    $Sek.Name = "Sekunden"
    $objForm.Controls.Add($Sek)
    
    #Anzeigen Fensterobjekt
    [void] $objForm.ShowDialog()
    
    

    Beim Starten des Skripts erscheint ein Fenster mit der aktuell verbleibenden Zeit. Allerdings wird die Zeit nicht aktualisiert. Ich habe es schon mit $objForm.refresh() versucht, auch als Button, aber da tut sich nichts. Ich vermute das Problem ist, das die Variable $count nicht neu geladen wird. Nach einer Recherge denke ich das ich timer verwenden muss. Allerdings bin ich hier überfragt an welcher Stelle ich was eintragen muss.

    Ich hoffe das mir jemand helfen kann, rein logisch denke ich das sich das Fenster jede Sekunde neu laden muss.
    Für Antworten bzw. Hinweise danke ich schon jetzt recht herzlich.

    Viele Grüße
    Suschi

    Montag, 15. Juni 2015 14:28

Antworten

  • Du brauchst zuerst ein Timerobjekt. Dieses führt dir dann in einem gebenden Intervall (in Millisekunden) deine Zeitberechnungen durch. Du musst ausserdem nicht die Form aktualisieren, sondern nur dein Label auf dem die Zeit erscheinen soll, neu beschreiben.
     
    Also z.b. so:
     

    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
    
    #Form
    $objForm = New-Object System.Windows.Forms.Form
    $objForm.StartPosition = "CenterScreen"
    $objForm.Size = "500,190"
    $objForm.Font= New-Object System.Drawing.Font("Broadway",18,[System.Drawing.FontStyle]::Bold)
    $objForm.Text = "Counter"
     
    #Time Label
    $timeLB= New-Object System.Windows.Forms.Label
    $timeLB.Location = "75,50"
    $timeLB.Size = "350,30"
    $objForm.Controls.Add($timeLB)
    
    #Timer
    $timer1 = New-Object system.Windows.Forms.Timer
    $Timer1.Interval = 500
    $Timer1.add_Tick({  
    	[datetime]$Countdown = "11/10/2015 00:00"
    	$count = ($Countdown-(get-date))
    	$timeLB.Text = "$($count.Days) T  $($count.Hours) H   $($count.Minutes) M  $($count.Seconds) S"
    })
    $timer1.start()
    
    #Anzeigen 
    [void] $objForm.ShowDialog()
     
    Was passiert denn am 10.11. um 0 Uhr? :)
     
    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.

    Montag, 15. Juni 2015 16:00
    Moderator

Alle Antworten

  • Du brauchst zuerst ein Timerobjekt. Dieses führt dir dann in einem gebenden Intervall (in Millisekunden) deine Zeitberechnungen durch. Du musst ausserdem nicht die Form aktualisieren, sondern nur dein Label auf dem die Zeit erscheinen soll, neu beschreiben.
     
    Also z.b. so:
     

    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
    
    #Form
    $objForm = New-Object System.Windows.Forms.Form
    $objForm.StartPosition = "CenterScreen"
    $objForm.Size = "500,190"
    $objForm.Font= New-Object System.Drawing.Font("Broadway",18,[System.Drawing.FontStyle]::Bold)
    $objForm.Text = "Counter"
     
    #Time Label
    $timeLB= New-Object System.Windows.Forms.Label
    $timeLB.Location = "75,50"
    $timeLB.Size = "350,30"
    $objForm.Controls.Add($timeLB)
    
    #Timer
    $timer1 = New-Object system.Windows.Forms.Timer
    $Timer1.Interval = 500
    $Timer1.add_Tick({  
    	[datetime]$Countdown = "11/10/2015 00:00"
    	$count = ($Countdown-(get-date))
    	$timeLB.Text = "$($count.Days) T  $($count.Hours) H   $($count.Minutes) M  $($count.Seconds) S"
    })
    $timer1.start()
    
    #Anzeigen 
    [void] $objForm.ShowDialog()
     
    Was passiert denn am 10.11. um 0 Uhr? :)
     
    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.

    Montag, 15. Juni 2015 16:00
    Moderator
  • Hallo Denniver,

    vielen lieben Dank. Du hast ja sogar Code gespart, und das sieht besser aus wie meins und ist jetzt auch einfacher zu handeln. Ich hab zwar versucht den Timer in meinen ursprünglichen Code einzufügen, bin aber kläglich gescheitert. Nochmals danke.

    Grüße
    Suschi

    P.S. Ist für jemanden zum Geburtstag^^

    Dienstag, 16. Juni 2015 06:57