markus2016
Goto Top

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. face-smile

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()
} 

Content-Key: 331879

Url: https://administrator.de/contentid/331879

Ausgedruckt am: 28.03.2024 um 19:03 Uhr

Mitglied: 132658
132658 11.03.2017 aktualisiert um 13:16:26 Uhr
Goto Top
Setz die Eigenschaft "Enabled" des Buttons einfach auf "false" nachdem er angeklickt wurde face-smile, 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
Mitglied: Markus2016
Markus2016 11.03.2017 um 14:11:11 Uhr
Goto Top
Hallo schnappi,

danke für den Tipp.

Der Mount-Button wird bereits direkt nachdem er angeklickt wurde auf "Enabled" gesetzt.
$Script:MountImageButton.Enabled = $false
Das hatte ich bereits ausprobiert.
Ändert aber nichts.
Das Problem ist, dass der Dismount-Button durch den vorher ausgeführten Mehrfachklick gleich wieder geklickt wird.
Das wiederholt sich so oft wie geklickt wurde.

Gibt es evtl. eine Möglichkeit, dass sich PS nur einen "Klick" merkt?

Schöne Grüße

Markus2016
Mitglied: 132658
132658 11.03.2017 um 14:27:02 Uhr
Goto Top
Steht oben.
Mitglied: Markus2016
Markus2016 11.03.2017 um 15:30:46 Uhr
Goto Top
Hallo schnappi,

den Vorschlag mit Button.Caption hatte ich nicht überlesen.
Da ich nach der Bereitstellung des Image aber die GUI über
$Window.Controls.Clear()
leere und der neue Inhalt überhaupt nicht mehr mit dem vorherigen identisch ist, bis auf die Position des Mount- / Dismount-Button, hat dieser Ansatz nach meiner Einschätzung eher Nachteile für mein Script.
Sorry, das hätte ich vorher vielleicht dazuschreiben sollen.

Schöne Grüße

Markus2016
Mitglied: 132658
132658 11.03.2017 aktualisiert um 16:32:13 Uhr
Goto Top
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 face-smile
Wer löscht denn bitte alle Controls??? So ein Blödsinn...