格式化文本框内容

Formatting textbox contents

我正在尝试为我们的帮助台创建一个 gui 脚本,用于授予用户共享权限。我目前停留在带有共享路径的文本框,我希望它在“Textchange”事件发生时接受输入,验证路径然后更改文本,这样只留下有效路径,无效路径将被删除。事件看起来像这样:

$Pathbox.Add_Textchanged({
#$PathsToGrant = @()
$this.Text -split '\r?\n' -ne '' | ForEach-Object {
     if ($_ -match "C:" -or $_ -match "ProgramFile" -or $_ -match "D:" -or $_ -match "Appdata")
     {
     $msgboxinput =[System.Windows.Messagebox]::Show("Some text",'Warning','Ok','Warning')
     $mod = "(0,666)"
     }
 elseif (-not$(Test-Path -Path $_))
     { 
     $msgboxinput =[System.Windows.Messagebox]::Show("Some Text",'Warning','Ok','Warning')
     $mod = "(0,666)"
     }
 else 
     {
     $PathsToGrant += $_
     #Write-Host $PathsToGrant
     }
     }
     Write-Host $PathsToGrant.Count
     $PathBox.Text = ""
     $PathBox.Text = $PathsToGrant 
                           })

有人建议我在这里使用 $this.Text -split '\r?\n' -ne '' 这样我的文本框就会像一个数组而不是 1 个长字符串,但是当我尝试用合法值在末尾重写文本框的文本 - 它只是将 2 个数组对象作为 1 行插入,并且它会创建中断的循环。 也许我不应该在第一个地方使用文本框控件?对于这些事情还有其他更合适的控制吗?谢谢。

你的$PathsToGrant是一个字符串,不是数组。当您像这样添加路径时:

$PathsToGrant += $_

很可能你写

$PathsToGrant = $PathsToGrant + "new path"

这是因为你注释了你的变量声明,因为$PathsToGrant的第一个值是一个字符串,所以变量变成了一个字符串。所以取消注释第二行

$PathsToGrant = @()

如果出于某种我不明白的原因,这对您来说是个问题,那么请像这样在数组中添加路径

$PathsToGrant += , $_

(逗号很重要)。如果你声明了你的数组(这对我来说是最好的)就不需要做最后的事情

最后,确保您的文本框是多行的

 $Pathbox.Multiline = $true

并使用连接设置文本:

$PathBox.Text = $PathsToGrant -join "`r`n"

但是作为文本框,不能单选一行。您可能更喜欢列表框(但您不能键入任何值):

$listbox1 = New-Object System.Windows.Forms.ListBox
$listbox1.DataSource = $PathsToGrant

编辑:如果 $PathsToGrant 已经在脚本的开头声明,则函数内的 $PathsToGrant 不在同一范围内,因此当您设定值。如果此变量需要在脚本范围内,则将变量声明保留在函数 $Pathbox.Add_Textchanged :

中的注释中
#$PathsToGrant = @()

并以这种方式在脚本范围变量上添加值:

$script:PathsToGrant += $_

你通常应该避免这种情况,但是 gui 脚本可以被认为是一个例外,特别是对于你不能随意传递参数的事件函数。