PowerShell输入框问题:如何将选中内容存入$z变量?
解决WinForms按钮点击无法给全局变量赋值的问题
嘿,这个坑我之前也踩过!问题出在PowerShell的作用域机制上——你在OKButton.Add_Click()和回车事件的脚本块里给$z赋值时,这个$z是事件处理块的局部变量,和你在脚本最外层想要使用的$z根本不是同一个变量,所以外面自然拿不到值。
修复方法:指定脚本作用域
只需要把赋值语句里的$z改成$script:z,明确告诉PowerShell要修改的是脚本顶层作用域的变量,而不是当前事件块的局部变量。
修改后的关键代码部分:
# 回车事件修改 $objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter") {$script:z=$objListBox.SelectedItem;$objForm.Close()}}) # OK按钮点击事件修改 $OKButton.Add_Click({$script:z=$objListBox.SelectedItem;$objForm.Close()})
完整修复后的代码
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") $objForm = New-Object System.Windows.Forms.Form $objForm.Text = "Sélection du cluster" $objForm.Size = New-Object System.Drawing.Size(300,200) $objForm.StartPosition = "CenterScreen" $objForm.KeyPreview = $True # 修改此处:使用$script:z $objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter") {$script:z=$objListBox.SelectedItem;$objForm.Close()}}) $objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape") {$objForm.Close()}}) $OKButton = New-Object System.Windows.Forms.Button $OKButton.Location = New-Object System.Drawing.Size(75,120) $OKButton.Size = New-Object System.Drawing.Size(75,23) $OKButton.Text = "OK" # 修改此处:使用$script:z $OKButton.Add_Click({$script:z=$objListBox.SelectedItem;$objForm.Close()}) $objForm.Controls.Add($OKButton) $CancelButton = New-Object System.Windows.Forms.Button $CancelButton.Location = New-Object System.Drawing.Size(150,120) $CancelButton.Size = New-Object System.Drawing.Size(75,23) $CancelButton.Text = "Cancel" $CancelButton.Add_Click({$objForm.Close()}) $objForm.Controls.Add($CancelButton) $objLabel = New-Object System.Windows.Forms.Label $objLabel.Location = New-Object System.Drawing.Size(10,20) $objLabel.Size = New-Object System.Drawing.Size(280,20) $objLabel.Text = "Dans quel cluster:" $objListBox = New-Object System.Windows.Forms.ListBox $objListBox.Location = New-Object System.Drawing.Size(10,40) $objListBox.Size = New-Object System.Drawing.Size(260,20) $objListBox.Height = 80 [void] $objListBox.Items.Add("CLUSTER") [void] $objListBox.Items.Add("CLUSTER_01") $objForm.Controls.Add($objListBox) $objForm.Topmost = $True $objForm.Add_Shown({$objForm.Activate()}) [void] $objForm.ShowDialog() # 现在这里能正确输出选中的内容了 Write-Host "选中的集群:$z"
原理说明
PowerShell的作用域分为好几种,事件处理脚本块默认会创建自己的局部作用域。当你直接赋值$z时,只会在当前局部作用域创建变量,不会影响外层的同名变量。而$script:前缀强制指定了变量的作用域为脚本顶层,这样赋值后,外层就能访问到正确的值了。
内容的提问来源于stack exchange,提问作者chris
相关产品推荐
相关产品推荐

