Я новичок в этом, и я пытаюсь создать графический интерфейс Powershell с полем текстового поля и использовать текст для запроса AD. Что-то не так с моим кодом. Текст хранится в переменных $textbox_HelloWorld
. Текст и вызывается в обработчике событий $button_ClickMe.Add_Click.
Это не возвращает никаких результатов. Если я заменю переменную строкой, она сработает. Похоже, проблема в области видимости, но я пробовал использовать $script:
и $global
, но ни один из них не работал.
Любая помощь оценили.
# import AD module
import-module activedirectory
# Load required assemblies
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
# Drawing form and controls
$Form_HelloWorld = New-Object System.Windows.Forms.Form
$Form_HelloWorld.Text = "Hello World"
$Form_HelloWorld.Size = New-Object System.Drawing.Size(480,240)
$Form_HelloWorld.FormBorderStyle = "FixedDialog"
$Form_HelloWorld.TopMost = $true
$Form_HelloWorld.MaximizeBox = $false
$Form_HelloWorld.MinimizeBox = $false
$Form_HelloWorld.ControlBox = $true
$Form_HelloWorld.StartPosition = "CenterScreen"
$Form_HelloWorld.Font = "Segoe UI"
# adding firstName TextBox to my form
$textbox_HelloWorld = New-Object System.Windows.Forms.TextBox
$textbox_HelloWorld.Location = New-Object System.Drawing.Size(8,4)
$textbox_HelloWorld.Size = New-Object System.Drawing.Size(120,32)
$textbox_HelloWorld.TextAlign = "MiddleCenter"
$global:textbox_HelloWorld.Text = "Enter first name!"
$Form_HelloWorld.Controls.Add($textbox_HelloWorld)
$firstnme=$textbox_HelloWorld.Text
# adding firstName label to my form
$label_HelloWorld = New-Object System.Windows.Forms.Label
$label_HelloWorld.Location = New-Object System.Drawing.Size(128,4)
$label_HelloWorld.Size = New-Object System.Drawing.Size(80,16)
$label_HelloWorld.TextAlign = "MiddleCenter"
$label_HelloWorld.Text = "First Name"
$Form_HelloWorld.Controls.Add($label_HelloWorld)
# adding lastName TextBox to my form
$Secondtextbox_HelloWorld = New-Object System.Windows.Forms.TextBox
$Secondtextbox_HelloWorld.Location = New-Object System.Drawing.Size(8,38)
$Secondtextbox_HelloWorld.Size = New-Object System.Drawing.Size(120,32)
$Secondtextbox_HelloWorld.TextAlign = "MiddleCenter"
$global:Secondtextbox_HelloWorld.Text = "Enter last name!"
$Form_HelloWorld.Controls.Add($Secondtextbox_HelloWorld)
$lastnme=$Secondtextbox_HelloWorld.Text
# adding lastName label to my form
$Secondlabel_HelloWorld = New-Object System.Windows.Forms.Label
$Secondlabel_HelloWorld.Location = New-Object System.Drawing.Size(128,38)
$Secondlabel_HelloWorld.Size = New-Object System.Drawing.Size(80,16)
$Secondlabel_HelloWorld.TextAlign = "MiddleCenter"
$Secondlabel_HelloWorld.Text = "Last Name"
$Form_HelloWorld.Controls.Add($Secondlabel_HelloWorld)
# add a button
$button_ClickMe = New-Object System.Windows.Forms.Button
$button_ClickMe.Location = New-Object System.Drawing.Size(8,80)
$button_ClickMe.Size = New-Object System.Drawing.Size(240,32)
$button_ClickMe.TextAlign = "MiddleCenter"
$button_ClickMe.Text = "Click Me!"
$button_ClickMe.Add_Click({
$button_ClickMe.Text = "Submitted"
$nme = Get-ADUser -Filter "GivenName -like '$global:textbox_HelloWorld.Text' -and Surname -like '$global:Secondtextbox_HelloWorld.Text*'" | Select-Object -ExpandProperty SamAccountName | out-string
[System.Windows.Forms.MessageBox]::Show($nme , "My Dialog Box")
})
$Form_HelloWorld.Controls.Add($button_ClickMe)
# show form
$Form_HelloWorld.Add_Shown({$Form_HelloWorld.Activate()})
[void] $Form_HelloWorld.ShowDialog()
2 ответа
Поскольку вы запрашиваете переменную в кавычках, он видит «$ textbox_helloworld» как вашу переменную и «.text» как строку. Вам нужно запустить команду как Вложенное выражение внутри кавычек через $()
Например "$city.state"
вернет "Los Angeles.state" где "$($city.state)"
вернет "Калифорния"
Также глобальный не нужен. Это потому, что «Global» и «script» предназначены для поиска переменных вне текущего окружения. Поскольку весь ваш код находится в одной среде, а не в дочерней среде (например, Function или Scriptblock), вам не нужно вызывать переменную родительской среды.
Вот что вы хотите использовать.
$nme = Get-ADUser -Filter "GivenName -like '$($textbox_HelloWorld.Text)' -and Surname -like '$($Secondtextbox_HelloWorld.Text)*'" | Select-Object -ExpandProperty SamAccountName | out-string
Последнее замечание : "middleCenter" не является жизнеспособным свойством Textbox's, по крайней мере, на моем компьютере. Я бы удалил текстовые поля вашего текстового поля для большей совместимости.
Как уже сказал Роберт Коттерман , параметр фильтра является проблемой, потому что вам нужно использовать { {X0}} для значения $TextBox.Text
.
Я также предлагаю вам построить такую строку, используя оператор форматирования -f
. Вот так:
$button_ClickMe.Add_Click({
$button_ClickMe.Text = "Submitted"
$query_filter = "GivenName -like '*{0}*' -and Surname -like '*{1}*'" -f $global:textbox_HelloWorld.Text, $global:Secondtextbox_HelloWorld.Text
$nme = Get-ADUser -Filter $query_filter | Select-Object -ExpandProperty SamAccountName | out-string
[System.Windows.Forms.MessageBox]::Show($nme , "My Dialog Box")
})
Использование оператора -f
начинается со строки формата, за которой следует один или несколько объектов или выражений, которые будут преобразованы в строки и вставлены в указанное место в строке формата.
{0}
в строке формата - это элемент формата. 0 - это индекс объекта, строковое значение которого будет вставлено в эту позицию. (Индексы начинаются с 0.) Если вставляемый объект не является строкой, вызывается его метод ToString для преобразования его в единицу перед вставкой в строку результата.
Примере:
'{0} is an {1}' -f 'This','example'
This is an example
Похожие вопросы
Новые вопросы
powershell
PowerShell - это кроссплатформенная утилита командной строки и сценариев от Microsoft. Используйте этот тег только для вопросов о написании и выполнении сценариев PowerShell. Вопросы программирования, относящиеся к кроссплатформенной версии PowerShell Core (Windows, macOS и Linux), должны быть помечены [powershell-core]. Вопросы о системном администрировании следует задавать в случае сбоя суперпользователя или сервера.