如何仅获取PowerShell文本框与列表框的选中值及文本内容
问题描述
作为PowerShell新手,我编写了两个交互脚本:
- 第一个是GUI脚本,通过文本框(
$ticketNumber)和列表框($equipment)收集用户输入并存储为变量 - 第二个脚本调用第一个脚本后发送邮件
但目前无法获取用户输入的纯文本或列表选中值,邮件中输出的是控件对象信息(如System.Windows.Forms.TextBox)。
GUI脚本代码
$ticketNumber = New-Object System.Windows.Forms.TextBox $ticketNumber.Location = New-Object System.Drawing.Point(10,30) $ticketNumber.Size = New-Object System.Drawing.Size(260,20) $form.Controls.Add($ticketNumber) $equipment = New-Object System.Windows.Forms.ListBox $equipment.Location = New-Object System.Drawing.Point(10,80) $equipment.Size = New-Object System.Drawing.Size(260,20) $equipment.Height = 60 [void] $equipment.Items.Add('Laptop, dock, monitor') [void] $equipment.Items.Add('Laptop, dock, monitor, 2nd monitor') [void] $equipment.Items.Add('Desktop, monitor') [void] $equipment.Items.Add('2nd monitor') $form.Controls.Add($equipment)
第二个脚本代码
. "$PSScriptRoot\TestInput.ps1" $Outlook = New-Object -ComObject Outlook.Application $Mail = $Outlook.CreateItem(0) $Mail.Sender = $Outlook.GetNamespace("MAPI").Accounts.Item(1).SmtpAddress # or 'noreply@domain.com' $Mail.To = $Outlook.GetNamespace("MAPI").Accounts.Item(1).SmtpAddress $Mail.Subject = "Equipment to add" $Mail.Body = "Ticket: $TestInput.$ticketNumber" $Mail.Body = "Ticket: $tTestInput.$equipment"
邮件输出内容
Ticket: System.Windows.Forms.TextBox, Text: RITM Requested: .System.Windows.Forms.ListBox, Items.Count: 4, Items[0]: Laptop, dock, monitor
解决方案
你需要访问控件对应的属性来获取实际内容,而不是直接引用控件对象:
- 文本框的输入内容存储在**
Text属性**中,即$ticketNumber.Text - 列表框的选中项(单选场景)存储在**
SelectedItem属性**中,即$equipment.SelectedItem;如果是多选模式,用$equipment.SelectedItems获取所有选中项
修正后的代码
步骤1:完善GUI脚本
在GUI脚本末尾添加窗体显示逻辑,确保用户完成输入后变量才会被传递到第二个脚本:
# 显示窗体并等待用户操作完成 $form.ShowDialog() | Out-Null # 清理窗体资源(可选) [System.Windows.Forms.Application]::Exit()
步骤2:修改邮件脚本的内容拼接
更新第二个脚本的$Mail.Body部分,正确引用控件属性:
. "$PSScriptRoot\TestInput.ps1" $Outlook = New-Object -ComObject Outlook.Application $Mail = $Outlook.CreateItem(0) $Mail.Sender = $Outlook.GetNamespace("MAPI").Accounts.Item(1).SmtpAddress # or 'noreply@domain.com' $Mail.To = $Outlook.GetNamespace("MAPI").Accounts.Item(1).SmtpAddress $Mail.Subject = "Equipment to add" # 用Here-String格式化邮件内容,确保属性正确解析 $Mail.Body = @" Ticket: $($ticketNumber.Text) Requested: $($equipment.SelectedItem) "@ # 执行邮件发送 $Mail.Send()
这样邮件里就会显示文本框的输入内容和列表框的选中值,而不是控件对象信息。
内容的提问来源于stack exchange,提问作者Elliot C. J. McBride
相关产品推荐
相关产品推荐

