如何在文本框、Powershell窗体中为搜索的字符串着色

如何在文本框、Powershell窗体中为搜索的字符串着色,powershell,colors,Powershell,Colors,正在尝试编写用于搜索字符串的简单Powershell表单。两个文本框,一个用于输出,另一个用于搜索 目标:编写要查找的字符串>按enter>搜索的字符串将在输出文本中着色(如果找到) 例如: OutputBox-例如文本 搜索框-ex 在搜索操作-t/red>/ex//ex/之后,我对选择颜色($outputBox.SelectionColor='red')进行了一些修改,并为单词ex的多次出现添加了颜色逻辑 代码修改: $SearchInput.Add_KeyDown({if ($_.KeyC

正在尝试编写用于搜索字符串的简单Powershell表单。两个文本框,一个用于输出,另一个用于搜索

目标:编写要查找的字符串>按
enter
>搜索的字符串将在输出文本中着色(如果找到)

例如:

OutputBox-
例如文本

搜索框-
ex


在搜索操作-
t/red>/ex//ex/之后,我对选择颜色(
$outputBox.SelectionColor='red'
)进行了一些修改,并为单词ex的多次出现添加了颜色逻辑

代码修改:

$SearchInput.Add_KeyDown({if ($_.KeyCode -eq "Enter")
{
$counter = 0
$pos = $outputBox.Text.IndexOf($SearchInput.text,$counter)
 while($pos -ne -1) {
 $counter = $pos + $SearchInput.text.Length
$outputBox.SelectionStart = $pos
$outputBox.SelectionLength = $SearchInput.text.Length
$outputBox.SelectionColor = 'red'
$pos = $outputBox.Text.IndexOf($SearchInput.text,$counter)
}
}
脚本的独立工作版本:

add-type -assembly System.Windows.Forms
$form=New-Object System.Windows.Forms.Form
$form.StartPosition='CenterScreen'
$form.Size = New-Object System.Drawing.Size(1000,1000) 
$outputBox = New-Object System.Windows.Forms.RichTextBox
$outputBox.Location = New-Object System.Drawing.Size(0,250) 
$outputBox.Size = New-Object System.Drawing.Size(780,405) 
$outputBox.MultiLine = $True 
$outputBox.ForeColor = "White"
$outputBox.BackColor = "Black"
$outputBox.ScrollBars = "Vertical" 
$outputBox.Text = "text for example"
$outputBox.ReadOnly=$True
$Form.Controls.Add($outputBox) 
$SearchInput = New-Object System.Windows.Forms.TextBox 
$SearchInput.Dock = "Bottom"
$Form.Controls.Add($SearchInput) 

$SearchInput.Add_KeyDown({if ($_.KeyCode -eq "Enter")
{
$counter = 0
$pos = $outputBox.Text.IndexOf($SearchInput.text,$counter)
 while($pos -ne -1) {

 $counter = $pos + $SearchInput.text.Length
$outputBox.SelectionStart = $pos
$outputBox.SelectionLength = $SearchInput.text.Length
$outputBox.SelectionColor = 'red'
$pos = $outputBox.Text.IndexOf($SearchInput.text,$counter)
}
}
})

$form.ShowDialog()

PS:重复选择部分可以优化

工作,谢谢。搜索框为空时有一个无休止的循环,但修复起来很简单。你能解释一下最后一行吗?你为什么又这样做
$pos=$outputBox.Text.IndexOf($SearchInput.Text,$counter)
@igor IndexOf函数第二个参数用于开始搜索的索引位置,IndexOf仅查找第一个匹配项,循环使用计数器更新起始位置。
$SearchInput.Add_KeyDown({if ($_.KeyCode -eq "Enter")
{
$counter = 0
$pos = $outputBox.Text.IndexOf($SearchInput.text,$counter)
 while($pos -ne -1) {
 $counter = $pos + $SearchInput.text.Length
$outputBox.SelectionStart = $pos
$outputBox.SelectionLength = $SearchInput.text.Length
$outputBox.SelectionColor = 'red'
$pos = $outputBox.Text.IndexOf($SearchInput.text,$counter)
}
}
add-type -assembly System.Windows.Forms
$form=New-Object System.Windows.Forms.Form
$form.StartPosition='CenterScreen'
$form.Size = New-Object System.Drawing.Size(1000,1000) 
$outputBox = New-Object System.Windows.Forms.RichTextBox
$outputBox.Location = New-Object System.Drawing.Size(0,250) 
$outputBox.Size = New-Object System.Drawing.Size(780,405) 
$outputBox.MultiLine = $True 
$outputBox.ForeColor = "White"
$outputBox.BackColor = "Black"
$outputBox.ScrollBars = "Vertical" 
$outputBox.Text = "text for example"
$outputBox.ReadOnly=$True
$Form.Controls.Add($outputBox) 
$SearchInput = New-Object System.Windows.Forms.TextBox 
$SearchInput.Dock = "Bottom"
$Form.Controls.Add($SearchInput) 

$SearchInput.Add_KeyDown({if ($_.KeyCode -eq "Enter")
{
$counter = 0
$pos = $outputBox.Text.IndexOf($SearchInput.text,$counter)
 while($pos -ne -1) {

 $counter = $pos + $SearchInput.text.Length
$outputBox.SelectionStart = $pos
$outputBox.SelectionLength = $SearchInput.text.Length
$outputBox.SelectionColor = 'red'
$pos = $outputBox.Text.IndexOf($SearchInput.text,$counter)
}
}
})

$form.ShowDialog()