我有PowerShell代码,用户在输入框中输入文本,但是当我尝试将此输出写入屏幕时,它是空白的
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$objForm = New-Object System.Windows.Forms.Form
$objForm.Text = "Data Entry Form"
$objForm.Size = New-Object System.Drawing.Size(300,200)
$objForm.StartPosition = "CenterScreen"
$objForm.KeyPreview = $True
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter")
{$x=$objTextBox.Text;$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"
$OKButton.Add_Click({$x=$objTextBox.Text;$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 = "Please enter the information in the space below:"
$objForm.Controls.Add($objLabel)
$objTextBox = New-Object System.Windows.Forms.TextBox
$objTextBox.Location = New-Object System.Drawing.Size(10,40)
$objTextBox.Size = New-Object System.Drawing.Size(260,20)
$objForm.Controls.Add($objTextBox)
$objForm.Topmost = $True
$objForm.Add_Shown({$objForm.Activate()})
[void] $objForm.ShowDialog()
write-host "x is $x"
控制台的输出是
x is
我以为
$OKButton.Add_Click({$x=$objTextBox.Text;$objForm.Close()})
如果单击“确定”按钮,则会将输入读入$ x。
答案 0 :(得分:2)
您遇到了变量$ x的范围问题。范围继承仅在默认情况下流下坡,而非上坡。 $ OKButton.Add_Click行中的脚本块是脚本的子作用域,该作用域内的任何变量都不会写入父作用域。
这是better description,而不是我能写的。
我在过去遇到过这种情况,一种可能的解决方案是在脚本中更早地声明$ x变量,以便在“脚本”范围内创建它,然后在$ OKButton中专门引用该脚本范围变量.Add_Click行与 $ script:x = $ objTextBox.Text
注意这两个显示范围差异的简单单行输出的差异。 $ Local:A 是脚本块本地范围内的子$ A变量, $ script:是整个脚本范围中的父$ A变量:< / p>
$A = "Yes" ; $A ; &{$local:A = "No" ; $A} ; $A
Yes
No
Yes
$A = "Yes" ; $A ; &{$script:A = "No" ; $A} ; $A
Yes
No
No
编辑:我有机会测试这个并简单地声明$ x变量应该在脚本范围内是好的,你不必像我之前提到的那样早先声明它。这应该可以正常工作:
$OKButton.Add_Click({$script:x=$objTextBox.Text;$objForm.Close()})
答案 1 :(得分:1)
您可以通过替换
来解决此问题{$x=$objTextBox.Text;$objForm.Close()}})
与
{Write-Host "x is" $objTextBox.Text;$objForm.Close()}})
在您呈现的场景中,它应该做同样的事情。