Warum sind dies 4 Dialogfelder gegenüber einer einzelnen GUI-Instanz?
Was Sie tun, ist wirklich übertrieben für das, was Sie suchen
Der Grund, warum Sie die vorherigen variablen Daten in der ISE erhalten, ist, dass Sie sie nicht gelöscht haben, bevor Sie sie erneut verwendet haben. Sie befinden sich immer noch im Speicher.
Aufgefüllte Variablen werden nicht automatisch gelöscht. Sie müssen sie also explizit leeren sowie beenden, den Müll schließen, alles sammeln, was Sie instanziiert haben, oder die ISE / dev-Umgebung neu starten, was ohnehin nur eine Überarbeitung darstellt.
Unabhängig davon, ob Sie ein Formular verwenden oder nicht, sollten Sie solche Elemente immer löschen oder löschen, bevor sie wieder verwendet werden können. Dies kann bei jeder Programmiersprache passieren, also nicht bei einer PS-spezifischen Sache oder bei einer ISE-spezifischen Sache.
All dies hört sich an, als wären Sie neu in der PS-GUI-Entwicklung oder App-Entwicklung im Allgemeinen. Es gibt viele Videos auf YouTube, die die Erstellung von PS-GUI und deren Verwendung mit WPF und WinForms sowie zahlreiche Artikel im gesamten Web abdecken.
Sie brauchen nicht einmal ein benutzerdefiniertes Formular, es sei denn, Sie machen ein Branding. Sie könnten das einfach tun.
Verwenden Sie eine vereinfachte PS-GUI (mit dem Cmdlet Show-Command), und geben Sie die Informationen ein, die beim Klicken auf Ausführen an das Cmdlet Send-MailMessage als Funktion gesendet werden. Die einzigen Nachteile hier sind, es ist funktional, nicht hübsch, und Sie können die Parameter nicht bestellen. Daher mein Branding-Punkt oben.
Beispiel:
function New-UserOnboardingEmail { param ( [Parameter(Mandatory)] [string]$Username, [Parameter(Mandatory)] [string]$PhonePin, [Parameter(Mandatory)] [string]$VoicemailPin, [Parameter(Mandatory)] [string]$PhoneExt ) $UserOnBoardDetails = " UserName : $Username`n PhonePin : $PhonePin`n VoiceMail : $VoicemailPin`n PhoneExt : $PhoneExt" Send-MailMessage ` -From "$Admin@domain.com" ` -To "$Username@domain.com" ` -Subject 'Welcome to obscured + On-Boarding Details' ` -Body: $UserOnBoardDetails ` -SmtpServer $SmtpServer ` -Encoding UTF8 ` -Credential $Creds } Show-Command -Name New-UserOnboardingEmail
Um dies in einem Formular zu tun, verwenden Sie https://poshgui.com, ziehen Sie den Formulardesigner und fügen Sie ihn anschließend dem Code hinzu.
Für Ihren Code müssen Sie den Wert des Textfeldeintrags übergeben, um diesen für ein Klickereignis verwenden zu können.
Beispiel mit diesem Online-GUI-Designer
<# This form was created using POSHGUI.com a free online gui designer for PowerShell .NAME Untitled #> Add-Type -AssemblyName System.Windows.Forms [System.Windows.Forms.Application]::EnableVisualStyles() #region begin GUI{ $frmUserOnBoarding = New-Object system.Windows.Forms.Form $frmUserOnBoarding.ClientSize = '400,400' $frmUserOnBoarding.text = "New User On-boarding " $frmUserOnBoarding.TopMost = $false $lblUserName = New-Object system.Windows.Forms.Label $lblUserName.text = "UserName" $lblUserName.AutoSize = $true $lblUserName.width = 25 $lblUserName.height = 10 $lblUserName.location = New-Object System.Drawing.Point(17,22) $lblUserName.Font = 'Microsoft Sans Serif,10' $txtUserName = New-Object system.Windows.Forms.TextBox $txtUserName.multiline = $false $txtUserName.width = 100 $txtUserName.height = 20 $txtUserName.location = New-Object System.Drawing.Point(157,17) $txtUserName.Font = 'Microsoft Sans Serif,10' $lblPhonePin = New-Object system.Windows.Forms.Label $lblPhonePin.text = "PhonePin" $lblPhonePin.AutoSize = $true $lblPhonePin.width = 25 $lblPhonePin.height = 10 $lblPhonePin.location = New-Object System.Drawing.Point(17,60) $lblPhonePin.Font = 'Microsoft Sans Serif,10' $txtPhonePin = New-Object system.Windows.Forms.TextBox $txtPhonePin.multiline = $false $txtPhonePin.width = 100 $txtPhonePin.height = 20 $txtPhonePin.location = New-Object System.Drawing.Point(156,51) $txtPhonePin.Font = 'Microsoft Sans Serif,10' $lblVoicemailPin = New-Object system.Windows.Forms.Label $lblVoicemailPin.text = "VoiceMailPin" $lblVoicemailPin.AutoSize = $true $lblVoicemailPin.width = 25 $lblVoicemailPin.height = 10 $lblVoicemailPin.location = New-Object System.Drawing.Point(18,94) $lblVoicemailPin.Font = 'Microsoft Sans Serif,10' $txtVoicemailPin = New-Object system.Windows.Forms.TextBox $txtVoicemailPin.multiline = $false $txtVoicemailPin.width = 100 $txtVoicemailPin.height = 20 $txtVoicemailPin.location = New-Object System.Drawing.Point(157,88) $txtVoicemailPin.Font = 'Microsoft Sans Serif,10' $lblPhoneExt = New-Object system.Windows.Forms.Label $lblPhoneExt.text = "PhoneExt" $lblPhoneExt.AutoSize = $true $lblPhoneExt.width = 25 $lblPhoneExt.height = 10 $lblPhoneExt.location = New-Object System.Drawing.Point(20,126) $lblPhoneExt.Font = 'Microsoft Sans Serif,10' $txtPhoneExt = New-Object system.Windows.Forms.TextBox $txtPhoneExt.multiline = $false $txtPhoneExt.width = 100 $txtPhoneExt.height = 20 $txtPhoneExt.location = New-Object System.Drawing.Point(154,124) $txtPhoneExt.Font = 'Microsoft Sans Serif,10' $btnSubmit = New-Object system.Windows.Forms.Button $btnSubmit.text = "Submit" $btnSubmit.width = 60 $btnSubmit.height = 30 $btnSubmit.location = New-Object System.Drawing.Point(16,168) $btnSubmit.Font = 'Microsoft Sans Serif,10' $btnCancel = New-Object system.Windows.Forms.Button $btnCancel.text = "Cancel" $btnCancel.width = 60 $btnCancel.height = 30 $btnCancel.location = New-Object System.Drawing.Point(87,167) $btnCancel.Font = 'Microsoft Sans Serif,10' $frmUserOnBoarding.controls.AddRange(@($lblUserName,$txtUserName,$lblPhonePin,$txtPhonePin,$lblVoicemailPin,$txtVoicemailPin,$lblPhoneExt,$txtPhoneExt,$btnSubmit,$btnCancel)) #region gui events { $btnSubmit.Add_Click({ $UserName = $txtUserName.Text $PhonePin = $txtPhonePin.Text $VoicemailPin = $txtVoicemailPin.Text $PhoneExt = $txtPhoneExt.Text $frmUserOnBoarding.Close()}) #endregion events } #endregion GUI } #Write your logic code here [void]$frmUserOnBoarding.ShowDialog() # Results from the submit button on the form $UserName $PhonePin $VoicemailPin $PhoneExt