Итак, я работал над графическим интерфейсом для одного из моих сценариев на своем рабочем месте и не могу получить какую-либо текстовую строку из текстового поля, в которое пользователь может поместить текст. Я создал базовую версию того, что хочу сделать, чтобы попытаться решить эту проблему. У меня кнопка «ОК» установлена на Write-Host $input.text
при нажатии. Когда я нажимаю «ОК», консоль просто ничего не выводит, один пробел.
Я попытался перестроить свой код, добавив -Out-String
и .ToString()
, что в конечном итоге говорит о том, что ввод имеет значение null. Даже когда я устанавливаю текст на что-то вроде «Тест» при запуске сценария, результат все равно равен нулю.
Вот мой код:
[void][System.Reflection.Assembly]::Load('System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a')
[void][System.Reflection.Assembly]::Load('System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089')
[System.Windows.Forms.Application]::EnableVisualStyles()
$Form = New-Object System.Windows.Forms.Form -Property @{
Name = 'Test'
Text = 'Test'
}
$input = New-Object System.Windows.Forms.TextBox -Propert @{
Name = "Input"
Size = "200,200"
} #Input Textbox
$confirm = New-Object System.Windows.Forms.Button -Property @{
Text = "Ok"
Name = "confirm"
Location = "0,210"
} #confirm button
$close = New-Object System.Windows.Forms.Button -Property @{
Text = "Close"
Name = "Close"
Location = "100,210"
} #close button
$confirm.Add_Click($run)
$close.Add_Click($exit)
$form.Controls.Add($confirm)
$form.Controls.Add($close)
$form.Controls.Add($input)
$run = {Write-Host $input.Text} #Output input box text
$exit = {
$form.Close()
}
$form.ShowDialog()
$form.BringToFront()
Если я могу просто получить текст из поля ввода, то все готово, так как мне нужна только строка от пользователя для того, что мне нужно сделать. Я также хочу придерживаться этого метода использования Windows Forms, поскольку моя форма в полной форме будет сложной.
Проблема с вашим кодом заключается в том, что обратные вызовы ($run
и $exit
) определяются после того, как вы их добавите, а не до этого, поэтому вы, по сути, добавляете null
к этим .Click
событиям. Измените порядок, определите их заранее и будет хорошо.
Кроме того, не рекомендуется использовать $input
в качестве имени переменной. $input — это автоматическая переменная в PowerShell.
[void][System.Reflection.Assembly]::Load('System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a')
[void][System.Reflection.Assembly]::Load('System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089')
[System.Windows.Forms.Application]::EnableVisualStyles()
$Form = New-Object System.Windows.Forms.Form -Property @{
Name = 'Test'
Text = 'Test'
}
$textBox = New-Object System.Windows.Forms.TextBox -Propert @{
Name = 'Input'
Size = '200,200'
} #Input Textbox
$confirm = New-Object System.Windows.Forms.Button -Property @{
Text = 'Ok'
Name = 'confirm'
Location = '0,210'
} #confirm button
$close = New-Object System.Windows.Forms.Button -Property @{
Text = 'Close'
Name = 'Close'
Location = '100,210'
} #close button
$run = { Write-Host $textBox.Text } #Output input box text
$exit = {
$form.Close()
}
$confirm.Add_Click($run)
$close.Add_Click($exit)
$form.Controls.Add($confirm)
$form.Controls.Add($close)
$form.Controls.Add($textBox)
$form.Add_Shown({ $this.Activate() })
$form.ShowDialog()
Вы можете значительно сократить это время. Обратите внимание, что вызов ShowDialog
отправляет возвращаемое значение, которое необходимо проверить, чтобы увидеть, какая кнопка была нажата, как показано в следующем рабочем примере:
[void][System.Reflection.Assembly]::Load('System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a')
[void][System.Reflection.Assembly]::Load('System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089')
[System.Windows.Forms.Application]::EnableVisualStyles()
$Form = New-Object System.Windows.Forms.Form -Property @{
Name = 'Test'
Text = 'Test'
}
$textbox = New-Object System.Windows.Forms.TextBox -Property @{
Name = "Input"
Location = "10, 10"
Size = "200,200"
} #Input Textbox
$okbutton = New-Object System.Windows.Forms.Button -Property @{
Text = "OK"
Name = "confirm"
Location = "10,210"
DialogResult = [System.Windows.Forms.DialogResult]::OK
} # OK button for the dialog
$form.Controls.Add($textbox)
$form.Controls.Add($okbutton)
$result = $form.ShowDialog()
# check the return value from ShowDialog, and capture the input(s)
if ($result -eq [System.Windows.Forms.DialogResult]::OK)
{
$ans = $textbox.Text
Write-Host $ans
}
Большое спасибо! Это именно то, что мне нужно, тогда я буду более тщательно относиться к своему заказу. Также спасибо, что сообщили мне эту информацию о
$input
.