格式化文本框内容
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 脚本可以被认为是一个例外,特别是对于你不能随意传递参数的事件函数。
我正在尝试为我们的帮助台创建一个 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 脚本可以被认为是一个例外,特别是对于你不能随意传递参数的事件函数。