Powershell GUI automatisch aktualisieren und trotzdem Eingaben ermöglichen
Hallo zusammen,
ich bin gerade dabei, mir Powershell etwas besser beizubringen und habe mir deshalb als Ziel gesetzt, ein Programm zu schreiben, das den DAX Kurs abrufen und in einer GUI ausgeben kann. Das Ganze funktioniert soweit auch schon, aber mein nächstes Ziel ist es, dass sich der DAX Kurs in regelmäßigen Abständen automatisch updatet (wenn der Button aktiviert ist), ich jedoch auch weiterhin die Buttons noch drücken kann (um das Ganze wieder zu deaktivieren) oder auch manuell upzudaten. Mein Problem ist, wenn ich ein start-sleep einfüge, dann schläft Powershell ja wirklich die Zeit und es kann nichts in die GUI eingefügt werden.
Mein Code sieht aktuell so aus:
Gibt es jetzt eine Möglichkeit, für $ButtonAutoUpdate.Add_Click etwas zu schreiben, das alle 30 Minuten (oder wie auch immer) automatisch die Function GUI ausführt, aber nicht das Ganze GUI zum erliegen bringt? Ich habe schon ein paar Stunden mit der Suche verbracht und auch hoffnungsvolle Ansätze gefunden, die sich aber dann irgendwie wieder in Luft aufgelöst haben.
Vielen Dank schon mal
ich bin gerade dabei, mir Powershell etwas besser beizubringen und habe mir deshalb als Ziel gesetzt, ein Programm zu schreiben, das den DAX Kurs abrufen und in einer GUI ausgeben kann. Das Ganze funktioniert soweit auch schon, aber mein nächstes Ziel ist es, dass sich der DAX Kurs in regelmäßigen Abständen automatisch updatet (wenn der Button aktiviert ist), ich jedoch auch weiterhin die Buttons noch drücken kann (um das Ganze wieder zu deaktivieren) oder auch manuell upzudaten. Mein Problem ist, wenn ich ein start-sleep einfüge, dann schläft Powershell ja wirklich die Zeit und es kann nichts in die GUI eingefügt werden.
Mein Code sieht aktuell so aus:
# Konsole ein und ausblenden
Add-Type -Name Window -Namespace Console -MemberDefinition '
[DllImport("Kernel32.dll")]
public static extern IntPtr GetConsoleWindow();
[DllImport("user32.dll")]
public static extern bool ShowWindow(IntPtr hWnd, Int32 nCmdShow);
'
function Show-Console {
$consolePtr = [Console.Window]::GetConsoleWindow()
#5 show
[Console.Window]::ShowWindow($consolePtr, 5)
}
function Hide-Console {
$consolePtr = [Console.Window]::GetConsoleWindow()
#0 hide
[Console.Window]::ShowWindow($consolePtr, 0)
}
Function DaxKurs{
# Startzeit
$Startzeit = Get-date
# Neues Web Client Objekt erstllen
$webClient = New-Object System.Net.WebClient
# Daten herunterladen
$StringWeb = $webClient.DownloadString('http://www.finanzen.net/index/Dax')
# Wichtige Daten in String suchen
$IntStart = $StringWeb.IndexOf("ISIN: DE0008469008")
$StringAusgang = $StringWeb.Substring($IntStart,285)
# Kurs berechnen
$IntStartKurs = $StringAusgang.IndexOf("quoteBox") + 18
$IntEndeKurs = $StringAusgang.IndexOf("<span>PKT</span>")
$StringKurs = $StringAusgang.Substring($IntStartKurs, $IntEndeKurs-$IntStartKurs)
# Veränderung berechnen
$StringAusgang = $StringAusgang.SubString($IntEndeKurs + 16)
$IntEndeVeraenderung = $StringAusgang.IndexOf("<span>PKT</span>")
$StringVeraenderung = $StringAusgang.Substring($IntEndeVeraenderung - 10,10)
$StringVeraenderung = $StringVeraenderung -replace '"',"" -replace ">","" -replace "a","" -replace "b","" -replace "c","" -replace "d","" -replace "e","" -replace "f","" -replace "g","" -replace "h","" -replace "i","" -replace "j","" -replace "k","" -replace "l","" -replace "m","" -replace "n","" -replace "o","" -replace "p","" -replace "q","" -replace "r","" -replace "s","" -replace "t","" -replace "u","" -replace "v","" -replace "w","" -replace "x","" -replace "y","" -replace "z",""
# Prozentuale Veränderung berechnen
$IntEndeProzentual = $StringAusgang.IndexOf("<span>%</span>")
$StringProzentual = $StringAusgang.Substring($IntEndeProzentual - 10,10)
$StringProzentual = $StringProzentual -replace '"',"" -replace ">","" -replace "a","" -replace "b","" -replace "c","" -replace "d","" -replace "e","" -replace "f","" -replace "g","" -replace "h","" -replace "i","" -replace "j","" -replace "k","" -replace "l","" -replace "m","" -replace "n","" -replace "o","" -replace "p","" -replace "q","" -replace "r","" -replace "s","" -replace "t","" -replace "u","" -replace "v","" -replace "w","" -replace "x","" -replace "y","" -replace "z",""
# Uhrzeit
$IntStartUhrzeit = $StringAusgang.IndexOf("timeSlot") + 10
$StringUhrzeit = $StringAusgang.Substring($IntStartUhrzeit,12)
# Endzeit
$Endzeit = get-date
# Dauer berechnen
$Dauer = NEW-TIMESPAN –Start $Startzeit –End $Endzeit
clear
write-host Kurs vom $StringUhrzeit
write-host $StringKurs Punkte
write-host $StringVeraenderung Punkte
write-host $StringProzentual Prozent
$global:Uhrzeit = $StringUhrzeit
$global:Kurs = $StringKurs + " Punkte"
$global:Veraenderung = $StringVeraenderung + " Punkte"
$global:Prozentual = $StringProzentual + " %"
}
Function GUI{
# Variable ob Auto Update eingeschaltet ist
$global:AutoUpdate = 0
<#
.Size(Breite,Höhe)
#>
# Die ersten beiden Befehle holen sich die .NET-Erweiterungen (sog. Assemblys) für die grafische Gestaltung in den RAM.
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
[System.Windows.Forms.Application]::EnableVisualStyles();
# Die nächste Zeile erstellt aus der Formsbibliothek das Fensterobjekt.
$objFenster = New-Object System.Windows.Forms.Form
$objFenster.AutoScroll = $True
# Fenster Parameter bestimmem
$objFenster.StartPosition = "CenterScreen"
$objFenster.Size = New-Object System.Drawing.Size(350,250)
$objFenster.Text = "DAX-Kurs"
# Label für Bezeichnungen
# Letzte Aktualisierung
$LabelBezUhrzeit = New-Object System.Windows.Forms.Label
$LabelBezUhrzeit.Location = New-Object System.Drawing.Size(10,45)
$LabelBezUhrzeit.Size = New-Object System.Drawing.Size(150,20)
$LabelBezUhrzeit.Text = "Letzte Aktualisierung:"
$LabelBezUhrzeit.Name = "BezUhrzeit"
$objFenster.Controls.Add($LabelBezUhrzeit)
# aktueller Kurs
$LabelBezKurs = New-Object System.Windows.Forms.Label
$LabelBezKurs.Location = New-Object System.Drawing.Size(10,65)
$LabelBezKurs.Size = New-Object System.Drawing.Size(150,20)
$LabelBezKurs.Text = "Aktueller Kurs:"
$LabelBezKurs.Name = "BezKurs"
$objFenster.Controls.Add($LabelBezKurs)
# aktuelle Veränderung
$LabelBezVeraenderung = New-Object System.Windows.Forms.Label
$LabelBezVeraenderung.Location = New-Object System.Drawing.Size(10,85)
$LabelBezVeraenderung.Size = New-Object System.Drawing.Size(150,20)
$LabelBezVeraenderung.Text = "Aktuelle Veränderung:"
$LabelBezVeraenderung.Name = "BezVeraenderung"
$objFenster.Controls.Add($LabelBezVeraenderung)
# aktuelle Veränderung [%]
$LabelBezProzent = New-Object System.Windows.Forms.Label
$LabelBezProzent.Location = New-Object System.Drawing.Size(10,105)
$LabelBezProzent.Size = New-Object System.Drawing.Size(150,20)
$LabelBezProzent.Text = "Aktuelle Veränderung [%]:"
$LabelBezProzent.Name = "BezProzent"
$objFenster.Controls.Add($LabelBezProzent)
# Automatisches Update aktivieren
$LabelBezUpdate = New-Object System.Windows.Forms.Label
$LabelBezUpdate.Location = New-Object System.Drawing.Size(10,128)
$LabelBezUpdate.Size = New-Object System.Drawing.Size(150,20)
$LabelBezUpdate.Text = "Automatisches Update:"
$LabelBezUpdate.Name = "BezAutoUpdate"
$objFenster.Controls.Add($LabelBezUpdate)
# Automatisches Update Häufigkeit
$LabelBezHaeufigkeit = New-Object System.Windows.Forms.Label
$LabelBezHaeufigkeit.Location = New-Object System.Drawing.Size(10,158)
$LabelBezHaeufigkeit.Size = New-Object System.Drawing.Size(150,20)
$LabelBezHaeufigkeit.Text = "Update Häufigkeit [min]:"
$LabelBezHaeufigkeit.Name = "BezAutoUpdate"
$objFenster.Controls.Add($LabelBezHaeufigkeit)
# Label für Werte
# Label für Uhrzeit
$LabelUhrzeit = New-Object System.Windows.Forms.Label
$LabelUhrzeit.Location = New-Object System.Drawing.Size(160,45)
$LabelUhrzeit.Size = New-Object System.Drawing.Size(100,20)
$LabelUhrzeit.Text = "10:30:00 Uhr"
$LabelUhrzeit.Name = "Uhrzeit"
$objFenster.Controls.Add($LabelUhrzeit)
# Label für Kurs
$LabelKurs = New-Object System.Windows.Forms.Label
$LabelKurs.Location = New-Object System.Drawing.Size(160,65)
$LabelKurs.Size = New-Object System.Drawing.Size(200,20)
$LabelKurs.Text = "Kurs"
$LabelKurs.Name = "Kurs"
$objFenster.Controls.Add($LabelKurs)
# Label für Veränderung
$LabelVeraenderung = New-Object System.Windows.Forms.Label
$LabelVeraenderung.Location = New-Object System.Drawing.Size(160,85)
$LabelVeraenderung.Size = New-Object System.Drawing.Size(200,20)
$LabelVeraenderung.Text = "Veränderung"
$LabelVeraenderung.Name = "Veraenderung"
$objFenster.Controls.Add($LabelVeraenderung)
# Label für Veränderung
$LabelProzent = New-Object System.Windows.Forms.Label
$LabelProzent.Location = New-Object System.Drawing.Size(160,105)
$LabelProzent.Size = New-Object System.Drawing.Size(200,20)
$LabelProzent.Text = "Prozent"
$LabelProzent.Name = "Prozent"
$objFenster.Controls.Add($LabelProzent)
# Button für Aktualisierung
$ButtonUpdate = New-Object System.Windows.Forms.Button
$ButtonUpdate.Location = New-Object System.Drawing.Size(10,10)
$ButtonUpdate.Size = New-Object System.Drawing.Size(80,23)
$ButtonUpdate.Text = "aktualisieren"
$ButtonUpdate.Name = "Aktualisieren"
$ButtonUpdate.DialogResult = "None"
$ButtonUpdate.Add_Click({
DaxKurs
$LabelUhrzeit.Text = $Uhrzeit
$LabelKurs.Text = $Kurs
$LabelVeraenderung.Text = $Veraenderung
$LabelProzent.Text = $Prozentual
})
$objFenster.Controls.Add($ButtonUpdate)
# Button automatisch Aktualisierung an/aus
$ButtonAutoUpdate = New-Object System.Windows.Forms.Button
$ButtonAutoUpdate.Location = New-Object System.Drawing.Size(160,125)
$ButtonAutoUpdate.Size = New-Object System.Drawing.Size(80,23)
$ButtonAutoUpdate.Text = "aktivieren"
$ButtonAutoUpdate.Name = "Aktualisieren"
$ButtonAutoUpdate.DialogResult = "None"
$ButtonAutoUpdate.Add_Click({
if($AutoUpdate -eq 0){
$AutoUpdate = 1
$ButtonAutoUpdate.Text = "deaktivieren"
} else {
$AutoUpdate = 0
$ButtonAutoUpdate.Text = "aktivieren"
}
})
$objFenster.Controls.Add($ButtonAutoUpdate)
# Textfeld für Update Häufigkeit
$TextboxHaeufigkeit = New-Object System.Windows.Forms.TextBox
$TextboxHaeufigkeit.Location = New-Object System.Drawing.Size(160,155)
$TextboxHaeufigkeit.Size = New-Object System.Drawing.Size(30,20)
$TextboxHaeufigkeit.Text = 60
$objFenster.Controls.Add($TextboxHaeufigkeit)
# Button automatisch Aktualisierung an/aus
$ButtonHaufigkeitOK = New-Object System.Windows.Forms.Button
$ButtonHaufigkeitOK.Location = New-Object System.Drawing.Size(195,155)
$ButtonHaufigkeitOK.Size = New-Object System.Drawing.Size(30,19)
$ButtonHaufigkeitOK.Text = "OK"
$ButtonHaufigkeitOK.Name = "Aktualisieren"
$ButtonHaufigkeitOK.DialogResult = "None"
$ButtonHaufigkeitOK.Add_Click({
$global:Haeufigkeit = $TextboxHaeufigkeit.Text
write-host $Haeufigkeit
})
$objFenster.Controls.Add($ButtonHaufigkeitOK)
# Die letzte Zeile sorgt dafür, dass unser Fensterobjekt auf dem Bildschirm angezeigt wird. Das muss immer am Ende stehen.
[void] $objFenster.ShowDialog()
}
GUI
Gibt es jetzt eine Möglichkeit, für $ButtonAutoUpdate.Add_Click etwas zu schreiben, das alle 30 Minuten (oder wie auch immer) automatisch die Function GUI ausführt, aber nicht das Ganze GUI zum erliegen bringt? Ich habe schon ein paar Stunden mit der Suche verbracht und auch hoffnungsvolle Ansätze gefunden, die sich aber dann irgendwie wieder in Luft aufgelöst haben.
Vielen Dank schon mal
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 275643
Url: https://administrator.de/forum/powershell-gui-automatisch-aktualisieren-und-trotzdem-eingaben-ermoeglichen-275643.html
Ausgedruckt am: 25.04.2025 um 17:04 Uhr
3 Kommentare
Neuester Kommentar

Moin,
wurde hier schon mal besprochen inkl. Beispiel. Stichwort MultiThreading
For beginners: Simple Variante mit Timer (System.Windows.Forms.Timer)
For the advanced users, mit Runspaces:
Gruß jodel32
p.s. Bitte nutze Code-Tags für deinen Programm-Code. Das lässt sich auch nachträglich noch nachholen.
wurde hier schon mal besprochen inkl. Beispiel. Stichwort MultiThreading
For beginners: Simple Variante mit Timer (System.Windows.Forms.Timer)
For the advanced users, mit Runspaces:
Gruß jodel32
p.s. Bitte nutze Code-Tags für deinen Programm-Code. Das lässt sich auch nachträglich noch nachholen.

Schön das du es geschafft hast.
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen.
Danke und schönes Wochenende.
Wenns das dann war, den Beitrag bitte noch auf gelöst setzen.
Danke und schönes Wochenende.