You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 21:34:59