PowerShell 版本 4.0(.PS1 文件)- 将 TextBox 中的文本添加到要在控制台上打印的数组中

PowerShell Version 4.0 (.PS1 File) - Add Text from TextBox into an Array to be printed on the console

请注意这是 PowerShell 4.0。我不认为 Convert-String 可用于 ,但当然,其他版本的 PowerShell 的答案仍然值得一读。

好的。我是 PowerShell 的新手,但有趣的是,通过 Google 和 Whosebug 我都无法找到这个问题的答案;我只是不确定该去哪里。

请记住,我想从 PowerShell 提示符启动文件 example.ps1

Function Show_Form
{
Add-Type -AssemblyName System.Windows.Forms

$global:Y_Position = 10
$global:X_Position = 5

$Form = New-Object system.Windows.Forms.Form
$Form.Text = "Sample Form"
$Form.Width = 400
$Form.Height = 450
$Form.AutoScroll = $True
$Form.AutoSize = $True
$Form.AutoSizeMode = "GrowOnly"
$Form.MinimizeBox = $False
$Form.MaximizeBox = $False

$Label = New-Object System.Windows.Forms.Label
$Label.Text = "Please Fill in the Required Information:`n"
$Label.AutoSize = $True
$Form.Controls.Add($Label)

$LabelTextBox = New-Object System.Windows.Forms.Label
$LabelTextBox.Location = New-Object System.Drawing.Point(10,40)
$LabelTextBox.Text = $Text
$LabelTextBox.AutoSize = $True
$Form.Controls.Add($LabelTextBox)

$global:textBox = New-Object System.Windows.Forms.TextBox
$X_Position = $X_Position+90
$textBox.Location = New-Object System.Drawing.Point(10,40)
$textBox.Size = New-Object System.Drawing.Size(260,20)
$Form.Controls.Add($textBox)


$Okbutton = New-Object System.Windows.Forms.Button 
$Okbutton.Location = New-Object System.Drawing.Size(250,570) 
$Okbutton.Size = New-Object System.Drawing.Size(100,30) 
$Okbutton.Text = "OK"


<#-----------------------------------#>
$global:Arr = @("lll", "ppp", 2)
$OkButton.Add_Click({[System.Windows.Forms.MessageBox]::Show($textBox.text, "My Dialog Box")})
$OkButton.Add_Click({Write-Host $textBox.text})

$global:Arr[0] = $textBox.text
$OkButton.Add_Click({Write-Host $Arr})
<#-----------------------------------#>

$Okbutton.Add_Click({$Form.Close()})
$Form.Controls.Add($Okbutton)


$Form.ShowDialog()
}

Show_Form

我的问题是这些行:

$global:Arr = @("lll", "ppp", 2)
$OkButton.Add_Click({[System.Windows.Forms.MessageBox]::Show($textBox.text, "My Dialog Box")})
$OkButton.Add_Click({Write-Host $textBox.text})  

$global:Arr[0] = $textBox.text
$OkButton.Add_Click({Write-Host $Arr}) 

Add_Click({Write-Host $textBox.text}) 显示在控制台中,但是当我将 $textBox.text 添加到数组(对象数组或其他)或用它替换另一个元素然后打印数组时,它始终只是空白。

.

如果我执行以下操作(注意:Arr[0]Arr[1]

$global:Arr = @("lll", "ppp", 2)
$OkButton.Add_Click({[System.Windows.Forms.MessageBox]::Show($textBox.text, "My Dialog Box")})
$OkButton.Add_Click({Write-Host $textBox.text})

$global:Arr[0] = $textBox.text
$OkButton.Add_Click({Write-Host $Arr})
$global:Arr[1] = "$textBox.text"
$OkButton.Add_Click({Write-Host $Arr})

两个元素都写为值 System.Windows.Forms.TextBox, Text: .text

我想知道如何让 $textBox.text 显示在数组中的控制台中?

你遇到的问题很简单。

您假设 $global:Arr[1] = "$textBox.text" 将设置为您单击表单中的“确定”按钮时的实际文本值。

但实际上,这段代码是在$Form.ShowDialog()之前调用的。因此,在那个时间点,你的文本框确实是空的,这就解释了你得到了什么。

如果你想让你的全局数组在按下确定按钮后设置为文本框文本,你需要通过Add_Click事件设置用户点击按钮时的数组值。

像这样:

 $OkButton.Add_Click( { $global:Arr[0] = $textBox.text })

补充说明

如果您还不熟悉 Powershell 中的调试工作原理,我建议您查看一些调试教程。

您会立即看到脚本确实在表单显示之前就进入了您的变量赋值,这可能会让您了解情况。

--

您可以在下方看到分配行上的调试点。在我有机会看到或输入表单中的任何内容之前,执行已停止,这表明该值显然不可能是表单中的值。此时从控制台查询 $textBox.text 显示值为空,正如我们对新初始化的表单所期望的那样。

一些文档:how to debug scripts(即使它说的是 ISE,所有这些也应该适用于 VSCode)