如何在PowerShell的RichTextBox中为指定行设置特定颜色
问题解决:PowerShell WinForms RichTextBox 部分文本设红色
问题概述
编写PowerShell WinForms脚本,希望在RichTextBox中显示SMB1协议状态和杀毒软件状态,仅将特定行(杀毒软件提示行、SMB1启用警告行)设置为红色,但当前所有文本都显示为红色。
问题原因
原代码通过$RichTextBox.Text = Script_English直接将函数输出的纯文本赋值给控件,这种方式会丢失所有格式设置,且没有正确控制RichTextBox的选中文本颜色切换逻辑。
修改后的完整代码
Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing $Form = New-Object system.Windows.Forms.Form $Form.ClientSize = "1000,1000" $Form.BackColor="#34495E" $Form.Text="系统状态检查" $RichTextBox = New-Object System.Windows.Forms.RichTextBox $RichTextBox.BackColor="darkblue" $RichTextBox.ForeColor="white" $RichTextBox.Multiline = $true $RichTextBox.Width = 900 $RichTextBox.Height = 650 $RichTextBox.Location = New-Object System.Drawing.Point(50,50) $RichTextBox.AutoSize=$true $RichTextBox.Scrollbars = "Vertical" $RichTextBox.ReadOnly=$true $RichTextBox.Font="Arial,15" $Button = New-Object System.Windows.Forms.Button $Button.Text = "开始检查" $Button.BackColor="#CCCCCC" $Button.Width = 90 $Button.Height =30 $Button.Location = New-Object System.Drawing.Point(850,900) $Button.Add_Click({ # 清空之前的内容 $RichTextBox.Clear() # 设置默认颜色为白色 $defaultColor = [Drawing.Color]::White $redColor = [Drawing.Color]::Red # --- 检查杀毒软件 --- $RichTextBox.SelectionColor = $defaultColor $RichTextBox.AppendText("--- 正在检查杀毒软件... ---`r`n`r`n") $Antivirus = wmic /Node:localhost /Namespace:\\root\SecurityCenter2 Path AntiVirusProduct Get displayName | findstr /v /r /c:"^$" /c:"displayName" if ($Antivirus.Length -gt 0) { # 设置红色显示提示行 $RichTextBox.SelectionColor = $redColor $RichTextBox.AppendText("设备已安装杀毒软件:`r`n") # 恢复白色显示杀毒软件列表 $RichTextBox.SelectionColor = $defaultColor $RichTextBox.AppendText($Antivirus | Out-String) $RichTextBox.AppendText("`r`n") } else { $RichTextBox.SelectionColor = $defaultColor $RichTextBox.AppendText("设备未安装杀毒软件。`r`n`r`n") } # --- 检查SMB1协议 --- $RichTextBox.SelectionColor = $defaultColor $RichTextBox.AppendText("`r`n--- 正在检查SMB1协议状态... ---`r`n`r`n") $SMB1_Protocol_Check = Get-SmbServerConfiguration | Select-Object -ExpandProperty EnableSMB1Protocol if (-not $SMB1_Protocol_Check) { $RichTextBox.SelectionColor = $defaultColor $RichTextBox.AppendText("SMB1协议已禁用,状态正常!`r`n") } else { # 设置红色显示警告行 $RichTextBox.SelectionColor = $redColor $RichTextBox.AppendText("SMB1协议已启用!SMB1存在安全风险,建议立即禁用!`r`n") } }) $Form.Controls.AddRange(@($RichTextBox,$Button)) [void]$Form.ShowDialog()
关键修改说明
- 替换文本赋值方式:不再直接将函数输出赋值给
Text属性,改用AppendText逐段添加内容,配合SelectionColor控制每段文本颜色 - 颜色切换逻辑:每次添加文本前先设置目标颜色,添加完需要变色的内容后立即恢复默认白色,避免后续文本继承红色
- 优化SMB1检查逻辑:直接提取
EnableSMB1Protocol的布尔值,比字符串匹配更可靠 - 调整控件布局:缩小RichTextBox宽度适配窗体尺寸,避免超出显示范围
内容的提问来源于stack exchange,提问作者Cino
相关产品推荐
相关产品推荐

