PowerShell Forms输出文本框空白 无法显示脚本执行结果
PowerShell Forms输出框空白问题修复
核心错误点
你的代码存在3个直接导致输出空白的问题:
- 过滤条件写错:
Where-Object里的匹配值写死了字符串"inputBoxgmr",没有读取输入框内用户实际输入的内容,正确取值应该是输入框的Text属性 - 类型不匹配:
$Results是PowerShell自定义对象(PSCustomObject)类型,而文本框的Text属性只接受字符串类型,直接赋值无法正常渲染内容 - 变量作用域问题:
find函数内部默认使用局部作用域,无法直接访问函数外部定义的窗体控件变量,导致赋值操作实际没有生效到窗体控件上
修正方案
- 过滤条件改为读取输入框的
Text属性值做匹配 - 将查询结果通过
Out-String命令转换为格式化的多行字符串,再赋值给输出框 - 函数内访问窗体控件时添加
$script:作用域修饰符,确保能正确操作脚本级的控件对象 - 每次查询前先清空输出框历史内容,避免内容堆积
修正后完整代码
# 加载所需程序集 Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing # 初始化窗体 $Form = New-Object System.Windows.Forms.Form $Form.Text = "AD ACCOUNT LOCKOUT FINDER" $Form.Size = New-Object System.Drawing.Size(600,600) $Form.StartPosition = "CenterScreen" # 窗体启动时居中屏幕 # 创建输入文本框 $inputBoxgmr = New-Object System.Windows.Forms.TextBox $inputBoxgmr.Location = New-Object System.Drawing.Size(30,50) $inputBoxgmr.Size = New-Object System.Drawing.Size(150,20) $Form.Controls.Add($inputBoxgmr) # 创建输入提示标签 $Labelgmr = New-Object System.Windows.Forms.Label $Labelgmr.Text = "Enter Domain User ID" $Labelgmr.Location = New-Object System.Drawing.Size(30,30) $Labelgmr.BackColor = "Transparent" $Labelgmr.AutoSize = $true $Form.Controls.Add($Labelgmr) # 提前初始化输出文本框,规避作用域问题 $outputBox = New-Object System.Windows.Forms.TextBox $outputBox.Location = New-Object System.Drawing.Size(10,100) $outputBox.Size = New-Object System.Drawing.Size(565,450) $outputBox.MultiLine = $True $outputBox.Scrollbars = "Vertical" $outputBox.ReadOnly = $True # 设为只读,避免用户误改输出内容 $Form.Controls.Add($outputBox) # 定义查询逻辑函数 function find { # 清空输出框历史内容 $script:outputBox.Clear() # 读取输入框内容做校验 $targetUser = $script:inputBoxgmr.Text.Trim() if([string]::IsNullOrWhiteSpace($targetUser)){ $script:outputBox.Text = "请先输入要查询的域用户ID" return } # 查询CSV匹配数据 $Results = Import-Csv -Path "D:\Excel\Data\List.csv" -Header "EventID", "TimeCreated", "Computer", "TargetUserName", "SubjectUserName", "HOSTName", "Filename" | Where-Object {$_.TargetUserName -eq $targetUser} | Select-Object "EventID", "TimeCreated", "Computer", "TargetUserName", "SubjectUserName", "HOSTName", "Filename" # 结果处理后赋值给输出框 if(-not $Results){ $script:outputBox.Text = "未找到用户[$targetUser]相关的锁定记录" }else{ # 将对象类型结果转为格式化字符串再赋值 $script:outputBox.Text = $Results | Out-String } # 查询完成后清空输入框 $script:inputBoxgmr.Clear() } # 创建查询按钮 $Button = New-Object System.Windows.Forms.Button $Button.Location = New-Object System.Drawing.Size(200,45) $Button.Size = New-Object System.Drawing.Size(80,30) $Button.Text = "FIND" $Button.Add_Click( { find } ) $Form.Controls.Add($Button) # 启动窗体 [void] $Form.ShowDialog()
补充说明:如果你的CSV文件本身已经自带表头,不需要加
-Header参数,否则会把原表头行识别为第一条数据。
内容的提问来源于stack exchange,提问作者Arunkumar
相关产品推荐
相关产品推荐

