Benutzer mit den meisten Antworten
Powershell Bingo Skript

Frage
-
Hallo zusammen,
ich habe dieses Skript mit Powershell 2.0 geschrieben und es hat einwandfrei funktioniert. Mit Powershell 5.0 wird nur eine Zahl gezogen sonst passiert weiter nichts und es werden auch keine Fehler in der Konsole angezeigt. Ich weiß wo anzusetzen ist. Hat hier vielleicht jemand eine Idee dazu?
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") $form = New-Object System.Windows.Forms.Form $form.StartPosition = "CenterScreen" $form.Size = New-Object System.Drawing.Size(700,500) $form.Text = "Bingo v.0.1" function Get-Number{ $loop = $true while($loop -eq $true){ $neueZahl = Get-Random -InputObject (1..75) -Count 1 if($zahlen -notcontains $neueZahl){ $loop = $false } } echo "$neueZahl" [array]$zahlen += $neueZahl } $font = New-Object System.Drawing.Font("Times New Roman",18,[System.Drawing.FontStyle]::Italic) $Button = New-Object System.Windows.Forms.Button $Button.Location = New-Object System.Drawing.Size(300,300) $Button.Size = New-Object System.Drawing.Size(75,23) $Button.Text = "Neue Zahl" $Button.Add_Click({ if(($label1 -ne $null) -and ($label2 -ne $null)){ $label1.Dispose() $label2.Dispose() } if($zahlen.Length -eq 75){ $label1.Dispose() $label2.Dispose() $label3 = New-Object System.Windows.Forms.Label $label3.Location = New-Object System.Drawing.Size(10,50) $label3.Size = New-Object System.Drawing.Size(400,600) $label3.Font = $font $label3.Controls.Clear() $label3.Text = "Das Spiel ist beendet. Alle Zahlen gezogen" $form.Controls.Add($label3) } if($zahlen.Length -le 74){ $neueZahl = Get-Number [array]$zahlen += $neueZahl $letzteZahl = $zahlen.Length if($letzteZahl -gt 0){ $label2 = New-Object System.Windows.Forms.Label $label2.Location = New-Object System.Drawing.Size(300,50) $label2.Size = New-Object System.Drawing.Size(150,250) $label2.Font = $font $label2.Text = "Letzte Zahl "+$zahlen[$letzteZahl-2] $form.Controls.Add($label2) } $label1 = New-Object System.Windows.Forms.Label $label1.Location = New-Object System.Drawing.Size(10,50) $label1.Size = New-Object System.Drawing.Size(400,400) $label1.Font = $font $label1.Controls.Clear() $label1.Text = $neueZahl $form.Controls.Add($label1) } }) $form.Controls.Add($Button) [void] $form.ShowDialog()
Viele Grüße
Ali
Antworten
-
Dein Script ist leider sehr unübersichtlich und wenig strukturiert. Das macht eine Fehlersuche sehr mühsam.
Aber eine perfekte Gelegenheit, an einem relativ einfachen Script Debugging zu üben! :)
Ich würde das Script zuallererst nach folgendem Muster neu strukturieren:- Erst alle Formelemente, dann die Funktionen.
- Der Code in Add_Click gehört auch in eine eigene Funktion. Innerhalb der Funktionen erfolgt keine überflüssige und ressourcenintensive Neuerzeugung von Labels etc. sondern nur eine Änderung des Inhalts (Label.Text = "...."). Damit sparst du die auch die ganzen .dispose().
- Bei der Gelgenheit überprüfst du mal deine Variablenbezeichnungen. Du hast z.b. ein Label "Letzte Zahl" was sich auf die zuletzt gezogene bezieht, benutzt aber
$letzteZahl für die Anzahl(!) der Arrayelemente ($zahlen.Length). Sowas provoziert geradezu Fehler.
Falls du dann nicht breits den Fehler gefunden hast, testest du erneut, am besten im ISE oder einem anderen Editor, und setzt entweder:
- an wichtigen Stellen Breakpoints oder
- lässt den Inhalt von Variablen in die Konsole ausgeben
und überprüfst so die Inhalte der einzelnen Variablen und Zustände der Formobjekte.
So solltest du relativ schnell dem Problem auf den Grund gehen können und hast ausserdem fürs nächste mal, strukturierte Fehlersuche gelernt. :)
Grüße, Denniver
- Bearbeitet Denniver ReiningMVP, Moderator Donnerstag, 8. Juni 2017 15:14
- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Dienstag, 13. Juni 2017 11:05
- Als Antwort markiert Denniver ReiningMVP, Moderator Mittwoch, 14. Juni 2017 23:50
-
Hallo,
ich kann dir zumindest sagen, dass bei mir in PowerShell 4.0 dasselbe passiert. Wenn ich dein Echo in der Funktion durch Write-Host ersetze, wird mir aber immer eine neue Zahl angezeigt. Das Ziehen scheint also zu funktionieren.
Viele Grüße
Christoph
Ja, das habe ich auch gesehen. Aber. Beim Dispose werden die Controls nicht entfernt. Vermutlich landen die neuen hinter den alten.
Du solltest versuchen, den Text in den Labels zu ändern statt die Labels neu zu generieren.
Evgenij Smirnov
I work @ msg services ag, Berlin -> http://www.msg-services.de
I blog (in German) @ http://it-pro-berlin.de
my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
Exchange User Group, Berlin -> http://exusg.de
Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Dienstag, 13. Juni 2017 11:05
- Als Antwort markiert Denniver ReiningMVP, Moderator Mittwoch, 14. Juni 2017 23:51
Alle Antworten
-
Hallo,
ich kann dir zumindest sagen, dass bei mir in PowerShell 4.0 dasselbe passiert. Wenn ich dein Echo in der Funktion durch Write-Host ersetze, wird mir aber immer eine neue Zahl angezeigt. Das Ziehen scheint also zu funktionieren.
Viele Grüße
Christoph
-
Hallo,
ich kann dir zumindest sagen, dass bei mir in PowerShell 4.0 dasselbe passiert. Wenn ich dein Echo in der Funktion durch Write-Host ersetze, wird mir aber immer eine neue Zahl angezeigt. Das Ziehen scheint also zu funktionieren.
Viele Grüße
Christoph
Ja, das habe ich auch gesehen. Aber. Beim Dispose werden die Controls nicht entfernt. Vermutlich landen die neuen hinter den alten.
Du solltest versuchen, den Text in den Labels zu ändern statt die Labels neu zu generieren.
Evgenij Smirnov
I work @ msg services ag, Berlin -> http://www.msg-services.de
I blog (in German) @ http://it-pro-berlin.de
my stuff in PSGallery --> https://www.powershellgallery.com/profiles/it-pro-berlin.de/
Exchange User Group, Berlin -> http://exusg.de
Windows Server User Group, Berlin -> http://www.winsvr-berlin.de
Mark Minasi Technical Forum, reloaded -> http://newforum.minasi.com- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Dienstag, 13. Juni 2017 11:05
- Als Antwort markiert Denniver ReiningMVP, Moderator Mittwoch, 14. Juni 2017 23:51
-
Das Skript ist allgemein für die recht kleine Aufgabe ziemlich lang und umständlich. Deine Zahl kannst du z.B. ganz einfach so ziehen:
1..75 | Get-Random -count 75
Dann hast du alle Zahlen in zufälliger Reihenfolge und brauchst sie nur noch hintereinander aufzublenden, wenn man auf den Button klickt. In einem Zufallsprozess ist es egal, ob die Reihenfolge am Anfang insgesamt oder stückweise gezogen wird. -
Dein Script ist leider sehr unübersichtlich und wenig strukturiert. Das macht eine Fehlersuche sehr mühsam.
Aber eine perfekte Gelegenheit, an einem relativ einfachen Script Debugging zu üben! :)
Ich würde das Script zuallererst nach folgendem Muster neu strukturieren:- Erst alle Formelemente, dann die Funktionen.
- Der Code in Add_Click gehört auch in eine eigene Funktion. Innerhalb der Funktionen erfolgt keine überflüssige und ressourcenintensive Neuerzeugung von Labels etc. sondern nur eine Änderung des Inhalts (Label.Text = "...."). Damit sparst du die auch die ganzen .dispose().
- Bei der Gelgenheit überprüfst du mal deine Variablenbezeichnungen. Du hast z.b. ein Label "Letzte Zahl" was sich auf die zuletzt gezogene bezieht, benutzt aber
$letzteZahl für die Anzahl(!) der Arrayelemente ($zahlen.Length). Sowas provoziert geradezu Fehler.
Falls du dann nicht breits den Fehler gefunden hast, testest du erneut, am besten im ISE oder einem anderen Editor, und setzt entweder:
- an wichtigen Stellen Breakpoints oder
- lässt den Inhalt von Variablen in die Konsole ausgeben
und überprüfst so die Inhalte der einzelnen Variablen und Zustände der Formobjekte.
So solltest du relativ schnell dem Problem auf den Grund gehen können und hast ausserdem fürs nächste mal, strukturierte Fehlersuche gelernt. :)
Grüße, Denniver
- Bearbeitet Denniver ReiningMVP, Moderator Donnerstag, 8. Juni 2017 15:14
- Als Antwort vorgeschlagen Denniver ReiningMVP, Moderator Dienstag, 13. Juni 2017 11:05
- Als Antwort markiert Denniver ReiningMVP, Moderator Mittwoch, 14. Juni 2017 23:50