Powershell: Nur max. einen Runspace per Button starten?
Hallo zusammen,
seit langen habe ich mal wieder Zeit gefunden an meiner GUI weiter zu arbeiten.
In der GUI habe ich an einer Position je nach Status einen anderen Buttton, welcher dann eine andere Funktion hat.
z.B.
Funktion - Add Click: Mount Image
Ist das Image bereitgestellt, wird der Mount-Button durch einen Dismount-Button ersetzt.
Mein Problem, für das ich gerade keinen Lösungsansatz finde, ist, dass wenn ich versehentlich den Button mehrfach betätige, die nachfolgenden Funktionen auch wieder gestartet werden.
Dies möchte ich natürlich vermeiden und irgendwie absichern.
Ich hoffe das ich das einigermaßen verständlich erklärt habe.
Gibt es eine relativ einfache Möglichkeit hierfür?
Ach ja auch noch eine nebensächliche Frage, der DeleteButton wird nicht zuverlässig entfernt. Woran könnte das liegen?
Vielen Dank vorab.
Schöne Grüße
Markus2016
Button Mount:
Button Dismount:
Funktion Start Progress
seit langen habe ich mal wieder Zeit gefunden an meiner GUI weiter zu arbeiten.
In der GUI habe ich an einer Position je nach Status einen anderen Buttton, welcher dann eine andere Funktion hat.
z.B.
Funktion - Add Click: Mount Image
Ist das Image bereitgestellt, wird der Mount-Button durch einen Dismount-Button ersetzt.
Mein Problem, für das ich gerade keinen Lösungsansatz finde, ist, dass wenn ich versehentlich den Button mehrfach betätige, die nachfolgenden Funktionen auch wieder gestartet werden.
Dies möchte ich natürlich vermeiden und irgendwie absichern.
Ich hoffe das ich das einigermaßen verständlich erklärt habe.
Gibt es eine relativ einfache Möglichkeit hierfür?
Ach ja auch noch eine nebensächliche Frage, der DeleteButton wird nicht zuverlässig entfernt. Woran könnte das liegen?
Vielen Dank vorab.
Schöne Grüße
Markus2016
Button Mount:
$Script:MountImageGroupBox.Controls.Add(( Add-Button -Button "MountImageButton" -Scope "Script" -Location "280,15" -Size "120,25" -Text "Mount" ))
$Script:MountImageButton.Add_Click({
$Script:MountImageButton.Enabled = $false
IF ((Test-Path Variable:DeleteButton) -eq $true) {$Window.Controls.Remove($Script:DeleteButton)}
Start-Progress -Job ([scriptblock]::create("Mount-WindowsImage –ImagePath ""$Project\Betriebssystem\sources\install.wim"" –Index $($Settings["Index"]) -Path ""$Project\Mount"" –Optimize"))
$Settings["install.wim"] = $Script:MountImageRadioButton.Checked
$Settings["boot.wim"] = $Script:MountBootImageRadioButton.Checked
Write-Settings $Settings $Settings_xmlFile
$Window.Controls.Clear()
Set-WindowDesign
Set-Parameter_Image
Mounted-Info_GroupBox
Mounted-Add_GroupBox
Mounted-Image_GroupBox
})
Button Dismount:
$Script:MountedImageGroupBox.Controls.Add(( Add-Button -Button "DismountImageButton" -Scope "Script" -Location "280,15" -Size "120,25" -Text "Dismount" ))
$Script:DismountImageButton.Add_Click({
Start-Progress -Job ([scriptblock]::create("Dismount-WindowsImage –Path ""$Project\Mount"" -Save -CheckIntegrity -ScratchDirectory ""$Project\Temp"""))
$Window.Controls.Clear()
Set-WindowDesign
Set-Parameter_Image
Mount-Info_GroupBox
Mount-Add_GroupBox
Mount-Image_GroupBox
Delete-Project
})
Funktion Start Progress
Function Start-Progress {
param
(
[Parameter(Mandatory = $true)]
[scriptblock]$Job,
[Parameter(Mandatory = $false)]
[String]$Text = ([String]$Job).Split(" ")
)
$newPowerShell = [powershell]::Create().AddScript($Job)
$Run = $newPowerShell.BeginInvoke()
$ProgressBar = New-Object System.Windows.Forms.ProgressBar
$ProgressBar.Name = "ProgressBar"
$ProgressBar.Style = "Continuous"
$Progressbar.ForeColor = "lightblue"
$Progressbar.BackColor= "white"
$ProgressBar.Location = "340,505"
$ProgressBar.Size = "620,20"
$Window.Controls.Add($ProgressBar)
$Script:ProgressBar_Text = New-Object System.Windows.Forms.Label
$Script:ProgressBar_Text.Location = New-Object System.Drawing.Size(340,290)
$Script:ProgressBar_Text.Size = New-Object System.Drawing.Size(620,20)
$Script:ProgressBar_Text.ForeColor = "red"
$Script:ProgressBar_Text.Text = $Text
$Window.Controls.Add($Script:ProgressBar_Text)
$i = 0
while ($Run.IsCompleted -eq $false) {
$ProgressBar.Value = $i
Start-Sleep -Milliseconds 500
$i++
IF ($i -eq 101) {$i = 0}
IF ($Run.IsCompleted -eq $true) {break}
}
$Window.Controls.Remove($ProgressBar)
$Window.Controls.Remove($Script:ProgressBar_Text)
$newPowerShell.EndInvoke($Run)
$newPowerShell.Runspace.Close()
$newPowerShell.Dispose()
}
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 331879
Url: https://administrator.de/contentid/331879
Ausgedruckt am: 27.11.2024 um 13:11 Uhr
5 Kommentare
Neuester Kommentar
Setz die Eigenschaft "Enabled" des Buttons einfach auf "false" nachdem er angeklickt wurde , und fertig.
Und warum du den Button enfernst ist mir auch ein Rätsel, warum benutzt du nicht den selben Button und wechselt seine Funktion einfach über seine Beschriftung. D.h. wenn Button.Caption = "Mount" ,danach Beschriftung auf "Unmount" setzen und mounten, und dann genauso anders herum wenn "Unmount" dann Beschriftung auf Mount setzen und unmounten.
Du kannst alternativ auch einfach eine Variable setzen und prüfen ob die Variable gesetzt ist. Aber das Verhindern über disabled setzen ist das vernünftigste, hier ist dann auch kein doppeltes betätigen aus Prinzip nicht möglich.
Gruß schnappi
Und warum du den Button enfernst ist mir auch ein Rätsel, warum benutzt du nicht den selben Button und wechselt seine Funktion einfach über seine Beschriftung. D.h. wenn Button.Caption = "Mount" ,danach Beschriftung auf "Unmount" setzen und mounten, und dann genauso anders herum wenn "Unmount" dann Beschriftung auf Mount setzen und unmounten.
Du kannst alternativ auch einfach eine Variable setzen und prüfen ob die Variable gesetzt ist. Aber das Verhindern über disabled setzen ist das vernünftigste, hier ist dann auch kein doppeltes betätigen aus Prinzip nicht möglich.
Gruß schnappi
Steht oben.
Nö.
Weiterer Vorschlag steht ebenfalls noch oben.
Oder zusätzlich Button-Press Event abfangen.
Es gibt viele Wege nach Rom, wenn du sie nur falsch umsetzt ist das nicht mein Problem
Wer löscht denn bitte alle Controls??? So ein Blödsinn...
Weiterer Vorschlag steht ebenfalls noch oben.
Oder zusätzlich Button-Press Event abfangen.
Es gibt viele Wege nach Rom, wenn du sie nur falsch umsetzt ist das nicht mein Problem
Wer löscht denn bitte alle Controls??? So ein Blödsinn...