无法从输入框中读取值

时间:2014-08-21 14:15:39

标签: powershell

我有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。

2 个答案:

答案 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()}})

在您呈现的场景中,它应该做同样的事情。