highspeed1
Goto Top

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

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: 23.12.2024 um 13:12 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ß