我正在嘗試為我們的幫助臺創建一個 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 行插入,并且它會創建損壞的回圈。也許我不應該在最開始使用文本框控制元件?對于這些事情還有其他更合適的控制元件嗎?謝謝。
uj5u.com熱心網友回復:
你$PathsToGrant是一個字串,而不是一個陣列。當您像這樣添加路徑時:
$PathsToGrant = $_
你很可能會寫
$PathsToGrant = $PathsToGrant "new path"
這是因為你已經注釋了你的變數宣告,因為第一個值$PathsToGrant是一個字串,所以變數變成了一個字串。所以取消注釋第二行
$PathsToGrant = @()
如果由于某種我不明白的原因,這對您來說是個問題,那么在這樣的陣列中添加路徑
$PathsToGrant = , $_
(逗號很重要)。如果你宣告你的陣列,不需要做最后一個(這對我來說是最好的)
最后,確保您的文本框是多行的
$Pathbox.Multiline = $true
并使用 join 設定文本:
$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 腳本視為一個例外,特別是對于您無法根據需要向其傳遞引數的事件函式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/420879.html
標籤:
