none
IF Abfrage- und While-Schleifenprobleme RRS feed

  • Frage

  • Hallo,

    Ich möchte in Powershell überprüfen, ob ein dort gestartetes Fenster normal Beendet wurde, einen falschen Wert eingegeben wurde oder ob ein richtiger Wert eingegeben wurde. Bei einem Falschen Wert soll alles wiederholen, beim Beenden halt Beenden und bei einem richtigen Wert solls weitergehen (while beenden).

    Hier mal mein Code-Problem (SerialConsole.ps1)

    $Help = @"
    .\SerialConsole.ps1
    ***PowerShell Serielle Konsole***
    ********von Pascal Gesell********
    Autor: Pascal Gesell
    Setzte die PowerShell execution policy auf 'RemoteSigned' um
    dieses Script ausführen zu können.
    PS> Set-ExecutionPolicy RemoteSigned
    "@
    
    $stat = $null
    $schleife = $true
    
    function MainGUI
    {
    	[Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null
    	[Reflection.Assembly]::LoadWithPartialName("System.Drawing") | Out-Null
    	
    	$frm = New-Object System.Windows.Forms.Form
    	$btn1 = New-Object System.Windows.Forms.Button
    	$btn2 = New-Object System.Windows.Forms.Button
    	$txtbox1 = New-Object System.Windows.Forms.TextBox
    	$lbl1 = New-Object System.Windows.Forms.Label
    	$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
    	
    	$Handler_btn2_Click=
    	{
    		$stat = "X"
    		$frm.close()
    	}
    
    	$Handler_btn1_Click=
    	{
    		If($txtbox1.Text.Contains("COM") -eq $true)
    		{
    			$stat = "Y"
    			$frm.Close()
    		}
    		else
    		{
    			[System.Windows.Forms.MessageBox]::Show("Ungültiger Wert","Fehler",[System.Windows.Forms.MessageBoxButtons]::OK,[System.Windows.Forms.MessageBoxIcon]::Exclamation)
    			$stat = "N"
    			$frm.Close()
    		}
    	}
    	
    	$OnLoadForm_StateCorrection=
    	{
    		$frm.WindowState = $InitialFormWindowState
    	}
    	#Size: Weite, Höhe
    	$frm.Text = "PE-GUI"
    	$frm.Name = "frm"
    	$frm.ClientSize = New-Object System.Drawing.Size(200,60)
    	$frm.ShowIcon = $false
    	$frm.MinimizeBox = $false
    	$frm.MaximizeBox = $false
    	$frm.CancelButton = $btn1
    	
    	$btn1.Name = "btn1"
    	$btn1.Size = New-Object System.Drawing.Size(65,20)
    	$btn1.Text = "Verbinden"
    	$btn1.Location = New-Object System.Drawing.Size(130,30)
    	$btn1.add_Click($Handler_btn1_Click)
    	$frm.Controls.Add($btn1)
    	
    	$btn2.Name = "btn2"
    	$btn2.Size = New-Object System.Drawing.Size(65,20)
    	$btn2.Text = "Beenden"
    	$btn2.Location = New-Object System.Drawing.Size(130,5)
    	$btn2.add_Click($Handler_btn2_Click)
    	$frm.Controls.Add($btn2)
    	
    	$txtbox1.Name = "txtbox1"
    	$txtbox1.Size = New-Object System.Drawing.Size(115, 20)
    	$txtbox1.Location = New-Object System.Drawing.Size(5, 30)
    	$frm.Controls.Add($txtbox1)
    	
    	$lbl1.Name = "lbl1"
    	$lbl1.Text = "COM-PORT:"
    	$lbl1.Size = New-Object System.Drawing.Size(150, 20)
    	$lbl1.Location = New-Object System.Drawing.Size(5, 8)
    	$frm.Controls.Add($lbl1)
    	
    	$InitialFormWindowState = $frm.WindowState
    	$frm.add_Load($OnLoadForm_StateCorrection)
    	$frm.ShowDialog() | Out-Null
    }
    
    If ($Host.Name -match 'ise')
    {
    	Write-Host "Warnung: Dieses Script muss in der Konsole ausgeführt werden`n`Rechts-Klick auf dem Script und wähle 'Mit PowerShell ausführen'"
    	break;
    }
    
    while($schleife -eq $true)
    {
    	MainGUI
    	If($stat -eq "N")
    	{
    		$schleife = $true
    	}
    	ElseIf($stat -eq "Y")
    	{
    		$schleife = $false
    	}
    	ElseIf($stat -eq "X")
    	{
    		$schleife = $false
    		EXIT
    		break;
    		
    	}
    }
    
    break;

    Ich wäre sehr dankbar wenn mich jemand in die richtige Richtung schubsen würde, da ich selber neu in der Powershell-Welt bin.

    mfg & thx

    gfcwfzkm - Pascal


    Hoi


    Dienstag, 6. August 2013 19:10

Antworten

  • Hoi Pascal!

    Bevor ich dir helfe, bekommst Du erst mal meine Standard Ansprache… ;-))

    Die Technik, in einer Schleife regelmäßig einen Zustand abzufragen, heißt polling und sollte in der Regel vermieden werden.
    Eine naive konstruierte Polling-Schleife kann die Prozessorlast (CPU) auf 100 % treiben. Die CPU ist dann nur noch mit der Bearbeitung der  Schleife beschäftigt und kann keine anderen Programme oder Aufgaben abarbeiten.
    Dabei entstehen auch unnötige Abwärme und Stromverbrauch. 8Wir sind ja alle Ökos und die CPU raucht nicht auf)
    Um dies zu vermeiden sollte man in einer pollenden  Schleife immer mindestens das Cmdlet Start-Sleep einbauen.
    Dies legt den PowerShell Prozess "schlafen" und  gibt der CPU Zeit andere Aufgaben zu erledigen.
    Alternativ sollte man immer Ereignisgesteuerte (Event-basierende) Techniken benutzen, die praktischerweise sehr wenige Systemressourcen verbrauchen.
    Ein Programm kann einfach solange nichts tun, bis ein bestimmtes Ereignis (Event) eingetreten ist.
    Das Programm hat ein Event abonniert.

    Ereignisse (Events) sind in der PowerShell leider nicht so einfach zu handhaben, da PowerShell immer nur eine Sache "gleichzeitig" erledigen kann.
    PowerShell arbeitet alle Aufgaben seriell der Reihe nach ab und  hat nur einen Prozess mit nur einem einzigen Handlungsfaden (Single Threading). (Wie eine Straße mit nur einer Fahrspur und überholverbot)
    Für Ereignisse (Events) braucht man aber meist 2 Parallele Handlungsabläufe (Multithreading). (Eine Straße, wie eine Autobahn, mit mehreren parallelen Fahrspuren)

    Deshalb sollte man seinen Code immer so umstellen (Refactoring), dass ein polling vermieden werden kann.
    http://de.wikipedia.org/wiki/Polling_%28Informatik%29

    PowerShell  wurde NICHT dazu gedacht Grafische Benutzer Oberflächen (GUI) zu Programmieren.
    (Auch wenn man es machen kann)
    PowerShell wurde konzipiert um Administrative Aufgaben im Hintergrund OHNE Fenster meist remote zu erledigen. Automation eben.

    Deshalb sollte man die GUI Entwicklung  sehr sparsam einsetzen und nur einfache Oberflächen Programmieren.
    Bei der GUI Programmierung muss man sich mit den Events beschäftigen die in der PowerShell selbst fast keine Rolle spielen.
    Wenn die PowerShell eine länger dauernde Aufgabe erledigt wie z.B. das durchsuchen der Festplatte, kann der User während dessen keine eingaben mehr in der von PowerShell erzeugten GUI tätigen.
    Die GUI ist aus Sicht des Benutzers „eingefroren“.

    PowerShell kann in einem Prozess immer nur eine Sache gleichzeitig erledigt (Single Thread) und hat dann keine "Zeit" die Eingaben des Benutzers zu verarbeiten.
    Deshalb kommt schnell das Thema Multithreading auf den Tisch. Multithreading ist das „gleichzeitige“ abarbeiten von mehreren Aufgaben in einem einzigen (PowerShell) Prozess.
    Stabile Programme mit Multithreading zu entwickeln ist selbst für erfahrenen Programmierer keine leichte Aufgabe.

    GUI Programmierung erfordert also grundlegenden Kenntnisse in der.NET Programmierung UND PowerShell Kenntnisse.
    Aus diesem Grund gibt es wenige PowerShell Nutzer die  GUI Programmierung beherrschen (wollen oder müssen).
    Bei der GUI Programmierung muss man natürlich immer bei den C# .NET Entwicklern nachschauen da dies kein Gebiet der PowerShell ist!
    Man sollte auch bei der Internet Recherche mit dem Suchwort C# arbeiten, anstatt mit dem Suchwort PowerShell.
    Siehe hier:
    http://openbook.galileocomputing.de/visual_csharp/visual_csharp_13_001.htm
    http://openbook.galileocomputing.de/visual_csharp/visual_csharp_14_001.htm

    Nun zu deinem Problem:

    Die Methode ShowDialog() liefert dir ein DialogResult Objekt. Dort siehst du welchen Knopf der User in der Form gedrückt hat!
    Deshalb sollte man hier NICHT ShowDialog()  | Out-Null benutzen!
    Du hast auch schon den Form-Cancel Button bestimmt! Dieser ist aber mit dem Falschen Button verknüpft!!!
    BITTE NUTZE SPRECHENDE VARIABLEN NAMEN!
    Dann passieren weniger Verwechslungen.

    Ich habe das Korrigiert.
    Ich habe noch den OK (Accept) Button bestimmt.
    Ich nutze das DialogResult Objekt und die Daten aus der Textbox als Rückgabewert.

    $Help = @"
    .\SerialConsole.ps1
    ***PowerShell Serielle Konsole***
    ********von Pascal Gesell********
    Autor: Pascal Gesell
    Setzte die PowerShell execution policy auf 'RemoteSigned' um
    dieses Script ausführen zu können.
    PS> Set-ExecutionPolicy RemoteSigned
    "@
    
    function MainGUI
    {
    	$Null = [Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
    	$Null = [Reflection.Assembly]::LoadWithPartialName("System.Drawing")
    	$Null = [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic")
    	
    	# Ich habe den powerGui Host benutz deshalb hat deine Abfrage nicht Funktionioert!
    	# Wenn man nur einen Host zulassen will, sollte man auch nur einen zulassen und
    	# nicht alle anderen ausschliessen das geht schief weil es zu viele gibt!
    	If (-not ($Host.Name -match 'ConsoleHost'))
    	{
    		# Nachricht in der Konsole und als Fenster ausgeben!
    		$Message = "Warnung: Dieses Script muss in der Konsole ausgeführt werden`n`Rechts-Klick auf dem Script und wähle 'Mit PowerShell ausführen'"
    		Write-Host $Message
    		[System.Windows.Forms.MessageBox]::Show($Message,"Script läuft nur in der Konsole!",[System.Windows.Forms.MessageBoxButtons]::OK,[System.Windows.Forms.MessageBoxIcon]::Exclamation)
    		return
    	}
    		
    	$frmPEGUI = New-Object System.Windows.Forms.Form
    	$btnVerbinden = New-Object System.Windows.Forms.Button
    	$btnBeenden = New-Object System.Windows.Forms.Button
    	$txtbxComPort = New-Object System.Windows.Forms.TextBox
    	$lblComPort = New-Object System.Windows.Forms.Label
    	$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
    	
    	# Variable zum übertragen des $txtbxComPort Textbox inhaltes
    	$txtbxComPortText = ''
    	
    	$Handler_btnBeenden_Click= {
    		# wird nicht gebraucht da dieser Button der Form-Cancel Button ist !
    		# diesr schlieest automatisch die Form
    		#$frmPEGUI.close()
    	}
    
    	$Handler_btnVerbinden_Click= {
    		If($txtbxComPort.Text.Contains("COM") -eq $true)
    		{
    			# Daten in die Variable retten bevor die Form geschlossen wird
    			$txtbxComPortText = $txtbxComPort.Text
    			$frmPEGUI.DialogResult = [System.Windows.Forms.DialogResult]::OK;
    			$frmPEGUI.Close()
    		}
    		else
    		{
    			[System.Windows.Forms.MessageBox]::Show("Ungültiger Wert","Fehler",[System.Windows.Forms.MessageBoxButtons]::OK,[System.Windows.Forms.MessageBoxIcon]::Exclamation)
    			$txtbxComPort.Text = ''
    			# hier die Form nicht schliessen.
    			# Der User hat kann ja seine Eingabe wiederholen und das Fenster selber schliessen!
    			#$frmPEGUI.Close()
    		}
    	}
    	
    	$OnLoadForm_StateCorrection=
    	{
    		$frmPEGUI.WindowState = $InitialFormWindowState
    	}
    	#Size: Weite, Höhe
    	$frmPEGUI.Text = "PE-GUI"
    	$frmPEGUI.Name = "frm"
    	$frmPEGUI.ClientSize = New-Object System.Drawing.Size(200,60)
    	$frmPEGUI.ShowIcon = $false
    	$frmPEGUI.MinimizeBox = $false
    	$frmPEGUI.MaximizeBox = $false
    	$frmPEGUI.CancelButton = $btnBeenden
    	$frmPEGUI.AcceptButton = $btnVerbinden
    	
    	$btnVerbinden.Name = "btnVerbinden"
    	$btnVerbinden.Size = New-Object System.Drawing.Size(65,20)
    	$btnVerbinden.Text = "Verbinden"
    	$btnVerbinden.Location = New-Object System.Drawing.Size(130,30)
    	$btnVerbinden.add_Click($Handler_btnVerbinden_Click)
    	$frmPEGUI.Controls.Add($btnVerbinden)
    	
    	$btnBeenden.Name = "btnBeenden"
    	$btnBeenden.Size = New-Object System.Drawing.Size(65,20)
    	$btnBeenden.Text = "Beenden"
    	$btnBeenden.Location = New-Object System.Drawing.Size(130,5)
    	$btnBeenden.add_Click($Handler_btnBeenden_Click)
    	$frmPEGUI.Controls.Add($btnBeenden)
    	
    	$txtbxComPort.Name = "$txtbxComPort"
    	$txtbxComPort.Size = New-Object System.Drawing.Size(115, 20)
    	$txtbxComPort.Location = New-Object System.Drawing.Size(5, 30)
    	$frmPEGUI.Controls.Add($txtbxComPort)
    	
    	$lblComPort.Name = "lblComPort"
    	$lblComPort.Text = "COM-PORT:"
    	$lblComPort.Size = New-Object System.Drawing.Size(150, 20)
    	$lblComPort.Location = New-Object System.Drawing.Size(5, 8)
    	$frmPEGUI.Controls.Add($lblComPort)
    	
    	$InitialFormWindowState = $frmPEGUI.WindowState
    	$frmPEGUI.add_Load($OnLoadForm_StateCorrection)
    	$Result = $frmPEGUI.ShowDialog()
    	
    	# Antwort Objekt erstellen
    	# in dem Anwort Objekt gibt es 2 Properties
    	# "DialogResult" = enthält  welchen Knopf der User gedrückt hat
    	# "ComPort" = enthält den Inhalt von der textbox wenn der User Verbinden gedrückt hat (sonnst ist es leer)
    	New-Object -TypeName PsObject | Select-Object @{Name='ComPort';Expression={$txtbxComPortText}},@{Name='DialogResult';Expression={$Result}}
    }
    
    $Antwort = MainGUI
    
    If( $Antwort.Dialogresult -eq [System.Windows.Forms.DialogResult]::OK) {
    	Write-Host "User hat verbinden gedrückt!"
    	Write-Host ("Der inhalt der Com-Textbox war : {0}" -f $Antwort.ComPort)
    }


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    Mittwoch, 7. August 2013 12:44

Alle Antworten

  • Hoi Pascal!

    Bevor ich dir helfe, bekommst Du erst mal meine Standard Ansprache… ;-))

    Die Technik, in einer Schleife regelmäßig einen Zustand abzufragen, heißt polling und sollte in der Regel vermieden werden.
    Eine naive konstruierte Polling-Schleife kann die Prozessorlast (CPU) auf 100 % treiben. Die CPU ist dann nur noch mit der Bearbeitung der  Schleife beschäftigt und kann keine anderen Programme oder Aufgaben abarbeiten.
    Dabei entstehen auch unnötige Abwärme und Stromverbrauch. 8Wir sind ja alle Ökos und die CPU raucht nicht auf)
    Um dies zu vermeiden sollte man in einer pollenden  Schleife immer mindestens das Cmdlet Start-Sleep einbauen.
    Dies legt den PowerShell Prozess "schlafen" und  gibt der CPU Zeit andere Aufgaben zu erledigen.
    Alternativ sollte man immer Ereignisgesteuerte (Event-basierende) Techniken benutzen, die praktischerweise sehr wenige Systemressourcen verbrauchen.
    Ein Programm kann einfach solange nichts tun, bis ein bestimmtes Ereignis (Event) eingetreten ist.
    Das Programm hat ein Event abonniert.

    Ereignisse (Events) sind in der PowerShell leider nicht so einfach zu handhaben, da PowerShell immer nur eine Sache "gleichzeitig" erledigen kann.
    PowerShell arbeitet alle Aufgaben seriell der Reihe nach ab und  hat nur einen Prozess mit nur einem einzigen Handlungsfaden (Single Threading). (Wie eine Straße mit nur einer Fahrspur und überholverbot)
    Für Ereignisse (Events) braucht man aber meist 2 Parallele Handlungsabläufe (Multithreading). (Eine Straße, wie eine Autobahn, mit mehreren parallelen Fahrspuren)

    Deshalb sollte man seinen Code immer so umstellen (Refactoring), dass ein polling vermieden werden kann.
    http://de.wikipedia.org/wiki/Polling_%28Informatik%29

    PowerShell  wurde NICHT dazu gedacht Grafische Benutzer Oberflächen (GUI) zu Programmieren.
    (Auch wenn man es machen kann)
    PowerShell wurde konzipiert um Administrative Aufgaben im Hintergrund OHNE Fenster meist remote zu erledigen. Automation eben.

    Deshalb sollte man die GUI Entwicklung  sehr sparsam einsetzen und nur einfache Oberflächen Programmieren.
    Bei der GUI Programmierung muss man sich mit den Events beschäftigen die in der PowerShell selbst fast keine Rolle spielen.
    Wenn die PowerShell eine länger dauernde Aufgabe erledigt wie z.B. das durchsuchen der Festplatte, kann der User während dessen keine eingaben mehr in der von PowerShell erzeugten GUI tätigen.
    Die GUI ist aus Sicht des Benutzers „eingefroren“.

    PowerShell kann in einem Prozess immer nur eine Sache gleichzeitig erledigt (Single Thread) und hat dann keine "Zeit" die Eingaben des Benutzers zu verarbeiten.
    Deshalb kommt schnell das Thema Multithreading auf den Tisch. Multithreading ist das „gleichzeitige“ abarbeiten von mehreren Aufgaben in einem einzigen (PowerShell) Prozess.
    Stabile Programme mit Multithreading zu entwickeln ist selbst für erfahrenen Programmierer keine leichte Aufgabe.

    GUI Programmierung erfordert also grundlegenden Kenntnisse in der.NET Programmierung UND PowerShell Kenntnisse.
    Aus diesem Grund gibt es wenige PowerShell Nutzer die  GUI Programmierung beherrschen (wollen oder müssen).
    Bei der GUI Programmierung muss man natürlich immer bei den C# .NET Entwicklern nachschauen da dies kein Gebiet der PowerShell ist!
    Man sollte auch bei der Internet Recherche mit dem Suchwort C# arbeiten, anstatt mit dem Suchwort PowerShell.
    Siehe hier:
    http://openbook.galileocomputing.de/visual_csharp/visual_csharp_13_001.htm
    http://openbook.galileocomputing.de/visual_csharp/visual_csharp_14_001.htm

    Nun zu deinem Problem:

    Die Methode ShowDialog() liefert dir ein DialogResult Objekt. Dort siehst du welchen Knopf der User in der Form gedrückt hat!
    Deshalb sollte man hier NICHT ShowDialog()  | Out-Null benutzen!
    Du hast auch schon den Form-Cancel Button bestimmt! Dieser ist aber mit dem Falschen Button verknüpft!!!
    BITTE NUTZE SPRECHENDE VARIABLEN NAMEN!
    Dann passieren weniger Verwechslungen.

    Ich habe das Korrigiert.
    Ich habe noch den OK (Accept) Button bestimmt.
    Ich nutze das DialogResult Objekt und die Daten aus der Textbox als Rückgabewert.

    $Help = @"
    .\SerialConsole.ps1
    ***PowerShell Serielle Konsole***
    ********von Pascal Gesell********
    Autor: Pascal Gesell
    Setzte die PowerShell execution policy auf 'RemoteSigned' um
    dieses Script ausführen zu können.
    PS> Set-ExecutionPolicy RemoteSigned
    "@
    
    function MainGUI
    {
    	$Null = [Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
    	$Null = [Reflection.Assembly]::LoadWithPartialName("System.Drawing")
    	$Null = [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic")
    	
    	# Ich habe den powerGui Host benutz deshalb hat deine Abfrage nicht Funktionioert!
    	# Wenn man nur einen Host zulassen will, sollte man auch nur einen zulassen und
    	# nicht alle anderen ausschliessen das geht schief weil es zu viele gibt!
    	If (-not ($Host.Name -match 'ConsoleHost'))
    	{
    		# Nachricht in der Konsole und als Fenster ausgeben!
    		$Message = "Warnung: Dieses Script muss in der Konsole ausgeführt werden`n`Rechts-Klick auf dem Script und wähle 'Mit PowerShell ausführen'"
    		Write-Host $Message
    		[System.Windows.Forms.MessageBox]::Show($Message,"Script läuft nur in der Konsole!",[System.Windows.Forms.MessageBoxButtons]::OK,[System.Windows.Forms.MessageBoxIcon]::Exclamation)
    		return
    	}
    		
    	$frmPEGUI = New-Object System.Windows.Forms.Form
    	$btnVerbinden = New-Object System.Windows.Forms.Button
    	$btnBeenden = New-Object System.Windows.Forms.Button
    	$txtbxComPort = New-Object System.Windows.Forms.TextBox
    	$lblComPort = New-Object System.Windows.Forms.Label
    	$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
    	
    	# Variable zum übertragen des $txtbxComPort Textbox inhaltes
    	$txtbxComPortText = ''
    	
    	$Handler_btnBeenden_Click= {
    		# wird nicht gebraucht da dieser Button der Form-Cancel Button ist !
    		# diesr schlieest automatisch die Form
    		#$frmPEGUI.close()
    	}
    
    	$Handler_btnVerbinden_Click= {
    		If($txtbxComPort.Text.Contains("COM") -eq $true)
    		{
    			# Daten in die Variable retten bevor die Form geschlossen wird
    			$txtbxComPortText = $txtbxComPort.Text
    			$frmPEGUI.DialogResult = [System.Windows.Forms.DialogResult]::OK;
    			$frmPEGUI.Close()
    		}
    		else
    		{
    			[System.Windows.Forms.MessageBox]::Show("Ungültiger Wert","Fehler",[System.Windows.Forms.MessageBoxButtons]::OK,[System.Windows.Forms.MessageBoxIcon]::Exclamation)
    			$txtbxComPort.Text = ''
    			# hier die Form nicht schliessen.
    			# Der User hat kann ja seine Eingabe wiederholen und das Fenster selber schliessen!
    			#$frmPEGUI.Close()
    		}
    	}
    	
    	$OnLoadForm_StateCorrection=
    	{
    		$frmPEGUI.WindowState = $InitialFormWindowState
    	}
    	#Size: Weite, Höhe
    	$frmPEGUI.Text = "PE-GUI"
    	$frmPEGUI.Name = "frm"
    	$frmPEGUI.ClientSize = New-Object System.Drawing.Size(200,60)
    	$frmPEGUI.ShowIcon = $false
    	$frmPEGUI.MinimizeBox = $false
    	$frmPEGUI.MaximizeBox = $false
    	$frmPEGUI.CancelButton = $btnBeenden
    	$frmPEGUI.AcceptButton = $btnVerbinden
    	
    	$btnVerbinden.Name = "btnVerbinden"
    	$btnVerbinden.Size = New-Object System.Drawing.Size(65,20)
    	$btnVerbinden.Text = "Verbinden"
    	$btnVerbinden.Location = New-Object System.Drawing.Size(130,30)
    	$btnVerbinden.add_Click($Handler_btnVerbinden_Click)
    	$frmPEGUI.Controls.Add($btnVerbinden)
    	
    	$btnBeenden.Name = "btnBeenden"
    	$btnBeenden.Size = New-Object System.Drawing.Size(65,20)
    	$btnBeenden.Text = "Beenden"
    	$btnBeenden.Location = New-Object System.Drawing.Size(130,5)
    	$btnBeenden.add_Click($Handler_btnBeenden_Click)
    	$frmPEGUI.Controls.Add($btnBeenden)
    	
    	$txtbxComPort.Name = "$txtbxComPort"
    	$txtbxComPort.Size = New-Object System.Drawing.Size(115, 20)
    	$txtbxComPort.Location = New-Object System.Drawing.Size(5, 30)
    	$frmPEGUI.Controls.Add($txtbxComPort)
    	
    	$lblComPort.Name = "lblComPort"
    	$lblComPort.Text = "COM-PORT:"
    	$lblComPort.Size = New-Object System.Drawing.Size(150, 20)
    	$lblComPort.Location = New-Object System.Drawing.Size(5, 8)
    	$frmPEGUI.Controls.Add($lblComPort)
    	
    	$InitialFormWindowState = $frmPEGUI.WindowState
    	$frmPEGUI.add_Load($OnLoadForm_StateCorrection)
    	$Result = $frmPEGUI.ShowDialog()
    	
    	# Antwort Objekt erstellen
    	# in dem Anwort Objekt gibt es 2 Properties
    	# "DialogResult" = enthält  welchen Knopf der User gedrückt hat
    	# "ComPort" = enthält den Inhalt von der textbox wenn der User Verbinden gedrückt hat (sonnst ist es leer)
    	New-Object -TypeName PsObject | Select-Object @{Name='ComPort';Expression={$txtbxComPortText}},@{Name='DialogResult';Expression={$Result}}
    }
    
    $Antwort = MainGUI
    
    If( $Antwort.Dialogresult -eq [System.Windows.Forms.DialogResult]::OK) {
    	Write-Host "User hat verbinden gedrückt!"
    	Write-Host ("Der inhalt der Com-Textbox war : {0}" -f $Antwort.ComPort)
    }


    Please click “Mark as Answer” if my post answers your question and click “Vote As Helpful” if my Post helps you.
    Bitte markiere hilfreiche Beiträge von mir als “Als Hilfreich bewerten” und Beiträge die deine Frage ganz oder teilweise beantwortet haben als “Als Antwort markieren”.
    My PowerShell Blog http://www.admin-source.info
    [string](0..21|%{[char][int]([int]("{0:d}" -f 0x28)+('755964655967-86965747271757624-8796158066061').substring(($_*2),2))})-replace' '
    German ? Come to German PowerShell Forum!

    Mittwoch, 7. August 2013 12:44