highspeed1

Powershell - Anzeige im Fenster soll sich jede Sekunde ändern und Beenden wenn fertig

Hallo.

Ich möchte das die Anzeige im Fenster sich jede Sekunde ändert. Wenn der $Counter bei 10 angekommen ist soll sich das Fenster schließen.

$Counter = 0

while ($Counter -lt 10)
{
    Add-Type -AssemblyName System.Windows.Forms
    Add-Type -AssemblyName System.Drawing

    $form = New-Object System.Windows.Forms.Form
    $form.Text = "PrgKopfWop.ps1 - Dateneingabe Teilegrunddaten"  
    $form.Size = New-Object System.Drawing.Size(500,500)
    $form.StartPosition = 'CenterScreen'  

    $label_Counter = New-Object System.Windows.Forms.Label
    $label_Counter.Location = New-Object System.Drawing.Point(10,10)
    $label_Counter.Size = New-Object System.Drawing.Size(100,20)
    $label_Counter.Text = "Counter: $Counter"  

    $Form.Controls.Add($label_Counter)

    $form.Topmost = $true

    $form.ShowDialog()

    sleep 1
    $Counter = $Counter + 1
}

Wie kann man das umsetzen?

Aktuell ist das Verhalten des Skrips so:
Wenn man das Fenster schließt kommt eine Verweilzeit von einer Sekunde und dann wird das Fernster erneut aufgebaut mit dem neuen Text.

Könnt ihr mir da helfen?

Gruß
Christoph
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 7955803872

Url: https://administrator.de/forum/powershell-anzeige-im-fenster-soll-sich-jede-sekunde-aendern-und-beenden-wenn-fertig-7955803872.html

Ausgedruckt am: 10.05.2025 um 11:05 Uhr

chkdsk
Lösung chkdsk 26.07.2023 um 13:10:34 Uhr
Goto Top
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

$Counter = 0

$form = New-Object System.Windows.Forms.Form
$form.Text = "PrgKopfWop.ps1 - Dateneingabe Teilegrunddaten"  
$form.Size = New-Object System.Drawing.Size(500, 500)
$form.StartPosition = 'CenterScreen'  

$label_Counter = New-Object System.Windows.Forms.Label
$label_Counter.Location = New-Object System.Drawing.Point(10, 10)
$label_Counter.Size = New-Object System.Drawing.Size(100, 20)

$form.Controls.Add($label_Counter)

$form.Topmost = $true

$form.Add_Shown({
    while ($Counter -lt 10) {
        $label_Counter.Text = "Counter: $Counter"  
        $Counter++
        Start-Sleep -Seconds 1
    }
    $form.Close()
})

$form.ShowDialog()
7907292512
Lösung 7907292512 26.07.2023 aktualisiert um 14:29:05 Uhr
Goto Top
Oder mit Timer dann blockiert der UI Thread nicht.
Add-Type -A System.Windows.Forms
Add-Type -A System.Drawing

$form = New-Object System.Windows.Forms.Form -P @{
    ClientSize = '300,300'  
    Text = "Counter"  
    add_Closed = {
        $timer.Dispose()
    }
    add_Load = {
        $timer.Start()
    }
    ControlBox = $false
    TopMost = $true
}
    
$lbl = New-Object System.Windows.Forms.Label -P @{
    Dock = 'Fill'  
    TextAlign = 'MiddleCenter'  
    Text = '0'  
    Font = [System.Drawing.Font]::new('Calibri',70)  
}
$timer = New-Object System.Windows.Forms.Timer -P @{
    Interval = 1000
    add_Tick = {
        if ($form.Counter -eq 10){
            $form.Close()
        }
        $lbl.Text = (++$form.Counter)
    }
}
$form | Add-Member -MemberType NoteProperty -Name Counter -Value 0
$form.Controls.Add($lbl)
[void]$form.ShowDialog()
Gruß Siddius
HighSpeed1
HighSpeed1 26.07.2023 um 13:24:41 Uhr
Goto Top
Danke für eure schnellen Antworten.

Diesen Befehl kannte ich noch nicht:

$form.Add_Shown

Gruß
7907292512
7907292512 26.07.2023 aktualisiert um 13:39:40 Uhr
Goto Top
Dann solltest du dir die Doku mal anschauen, da gibt's noch eine Menge mehr face-smile
Form Klasse (Ereignisse).

Den Events lassen sich dann alle mit der Methode add_[EVENTNAME] des Controls Scriptblöcke als Handler zuweisen.

Gruß