none
Powershell Bingo Skript RRS feed

  • 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

    Mittwoch, 7. Juni 2017 19:59

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

    Donnerstag, 8. Juni 2017 13:50
    Moderator
  • 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

    Donnerstag, 8. Juni 2017 06:27

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

    Donnerstag, 8. Juni 2017 06:03
  • 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

    Donnerstag, 8. Juni 2017 06:27
  • 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.
    Donnerstag, 8. Juni 2017 08:45
  • 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

    Donnerstag, 8. Juni 2017 13:50
    Moderator
  • Ist der Fehler denn inzwischen gefunden?
    Freitag, 9. Juni 2017 10:30