Powershell: Timer-Funktion und Progressbar-Funktion
Hallo zusammen,
ich benötige bei 2 Funktionen in Powershell etwas Unterstützung:
Fall-1:
Ich habe eine Timer-Funktion die eine Anzahl(X) Sekunden abläuft bevor ein Installationsprozess gestartet wird:
Diese Funktion arbeitet wie gewünscht die Anzahl(X) Sekunden ab bevor der nächste Schritt folgt.
Es gibt aber einen "Abbruch"-Button der in diesem Zeitraum gedrückt werden kann, damit der Installationsprozess abgebrochen werden kann (deswegen diese 5 Minuten Wartezeit vor der eigentlich Installation).
Die CancelButton Funktion sieht wie folgt aus:
Jemand eine Ahnung wie man es realisieren könnte? IF-Bedienung? in Batch hätte es ich es mit einer IF-Bediengung und dann einem Goto realisiert.
Wo ich grade von Batch fasel das kommt in Fall-2:
Gleiches Script (selbe GUI). Batch wird mittels Click-Funktion gestartet.
Jedoch füllt sich die Progressbar nicht während des Laufs der Batch sondern, erst nachdem diese durchgelaufen ist.
Danke im Vorraus.
Gruß, Sascha
ich benötige bei 2 Funktionen in Powershell etwas Unterstützung:
Fall-1:
Ich habe eine Timer-Funktion die eine Anzahl(X) Sekunden abläuft bevor ein Installationsprozess gestartet wird:
function Waittimer {
$pbTimer = 1*3000
$pbLength = $pbTimer / 100
$pbTimer..0 | Foreach-Object {
$pbMin = [int](([string]($pbTimer/60)).split('.'))
$Timerlabel.text = 'Starte Installation in: ' + $pbMin + ' Min ' + ($pbTimer % 60) + ' Sek'
Start-Sleep -Seconds 1
$pbTimer --
}
$Timerlabel.Hide()
$Installlabel.Show()
}
Es gibt aber einen "Abbruch"-Button der in diesem Zeitraum gedrückt werden kann, damit der Installationsprozess abgebrochen werden kann (deswegen diese 5 Minuten Wartezeit vor der eigentlich Installation).
Die CancelButton Funktion sieht wie folgt aus:
$CancelButton_Click = {
EnabledButtons
[System.Windows.Forms.MessageBox]::Show('Installationsprozess wurde abgebrochen.', 'Abbruch', 0)
$ProgressBar.Hide()
$Installlabel.Hide()
$CancelButton.visible = $false
}
Wo ich grade von Batch fasel das kommt in Fall-2:
Gleiches Script (selbe GUI). Batch wird mittels Click-Funktion gestartet.
$SButton_Click = {
DisabledButtons
$CancelButton.visible = $true
Mail
$Maillabel.Hide()
$Timerlabel.Show()
Waittimer
$ServerTimer.Start()
$ProgressBar.Show()
IF ($ProgressBar.Value = $ProgressBar.Maximum) {
Start-Process C:\DailyBuild\install_script\server.bat -Wait
EnabledButtons
}
}
Danke im Vorraus.
Gruß, Sascha
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 242605
Url: https://administrator.de/contentid/242605
Ausgedruckt am: 22.11.2024 um 05:11 Uhr
8 Kommentare
Neuester Kommentar
Hallo Sascha,
entweder mit einem separaten Thread wie hier demonstriert:
Powershell GUI bleibt während einer While schleife hängen...
Alternativ gibt es auch das CMDLet Write-Progress wenn eine Progressbar für die Konsole ausreicht.
Eine einfachere Methode eine Batch laufen zu lassen und darauf zu warten das diese beendet wurde ist das folgende Konstrukt:
Beispiel um auf die Fertigstellung eines Befehls oder Batch zu warten um während dessen etwas anderes zu tun
Grüße Uwe
entweder mit einem separaten Thread wie hier demonstriert:
Powershell GUI bleibt während einer While schleife hängen...
Alternativ gibt es auch das CMDLet Write-Progress wenn eine Progressbar für die Konsole ausreicht.
Eine einfachere Methode eine Batch laufen zu lassen und darauf zu warten das diese beendet wurde ist das folgende Konstrukt:
Beispiel um auf die Fertigstellung eines Befehls oder Batch zu warten um während dessen etwas anderes zu tun
# Ping starten und in der Konsole weiterarbeiten (nicht warten ! also ohne -wait)
$proc = Start-Process "ping.exe" -ArgumentList "-n 4 127.0.0.1" -NoNewWindow -PassThru
# die Schleife arbeitet solange bis der Prozess beendet wurde.
while(!$proc.HasExited){
# tu hier was du willst
write-host "." -NoNewline
sleep -Milliseconds 200
}
Write-host "Finished"
Hallo Sascha,
Yip, ein neuer Runspace
Wenn das nicht verständlich ist, mach es wie oben unter der Alternative beschrieben, ist eventuell einfacher für dich.
Grüße Uwe
Yip, ein neuer Runspace
Und wie kann ich eine function bei ... aufrufen
deine Function darin aufrufen, du musst aber beachten das du so aus dem separaten Thread kein Update deiner Controls im ersten Thread machen kannst (CrossThread-Exception), deswegen habe ich hier mit einer synced Hashtable gearbeitet, um die Progressbar aus dem zweiten Thread upzudaten.Wenn das nicht verständlich ist, mach es wie oben unter der Alternative beschrieben, ist eventuell einfacher für dich.
Grüße Uwe
pack den Funktionsaufruf in einen Scriptblock den du einer Property der Hashtable zuweist, und rufe dann diesen Scriptblock auf:
# deine Function
function enableButtons(){ ........}
#Funktionsaufruf in eine Property der Hashtable packen
$syncHash.enableButtonsDelegate = {enableButtons}
#im RunSpace Thread rufst du dann den Scriptblock so auf (das & am Anfang nicht vergessen)
&$syncHash.enableButtonsDelegate