Почему это 4 диалоговых окна против одного экземпляра GUI?
То, что вы делаете, действительно излишне для того, что вы после
Причина, по которой вы получаете предыдущие переменные данные в ISE, состоит в том, что вы не очистили их, прежде чем использовать их снова, они все еще находятся в памяти.
Заполненные переменные не очищаются автоматически. Таким образом, вы должны явно очистить их, а также выйти, закрыть сборщик мусора, собрать все вещи, которые вы создали, или перезапустить среду ISE / dev, которая, в любом случае, просто перебор.
Независимо от того, используете ли вы форму или нет, вы всегда должны очищать / удалять подобные вещи, прежде чем их можно будет использовать снова. Это может случиться с любым языком программирования, поэтому не для вещей, специфичных для PS или ISE.
Все это звучит так, будто вы новичок в разработке PS GUI или разработке приложений в целом. На YouTube есть много видео, посвященных созданию и использованию PS GUI с WPF и WinForms, а также множество статей по всему Интернету.
Вам даже не нужна индивидуальная форма, если вы не занимаетесь брендингом. Вы могли бы просто сделать это.
Используйте упрощенный графический интерфейс PS (с помощью командлета Show-Command) и введите информацию, которая при нажатии кнопки запуска отправляет ее в командлет Send-MailMessage в качестве функции. Единственные недостатки здесь, это функционально, не красиво, и вы не можете заказать параметры. Отсюда и мой фирменный знак выше.
Пример:
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
Что касается того, чтобы сделать это в одной форме, используйте https://poshgui.com, перетащите конструктор форм, а затем просто присоедините свой код, чтобы заставить его действовать.
Что касается вашего кода, вы должны передать значение в текстовое поле, чтобы иметь возможность использовать его в событии нажатия кнопки.
Пример использования этого интерактивного графического дизайнера
<# 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