изучая PowerShell и пытаясь извлечь значение из текстового поля - PullRequest
0 голосов
/ 24 октября 2018

Я новичок в этом, и я пытаюсь создать графический интерфейс Powershell с полем текстового поля и использовать текст для запроса AD.Что-то не так с моим кодом.Текст хранится в переменных $textbox_HelloWorld .Text и вызывается в обработчике событий $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 ]

0 голосов
/ 24 октября 2018

Как Роберт Коттерман уже сказал, что параметр фильтра был проблемой, потому что вам нужно было использовать subexpression для $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
0 голосов
/ 24 октября 2018

Поскольку вы запрашиваете переменную в кавычках, она видит «$ textbox_helloworld» в качестве вашей переменной и «.text» в виде строки.Вам нужно выполнить команду как SubExpression внутри кавычек через $()

например, "$city.state" вернет "Los Angeles.state", где "$($city.state)" вернет "California"

Также глобальный не должен быть нужен.Это потому, что «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, по крайней мере, на моем компьютере.Я бы удалил ваши текстовые поля для большей совместимости.

...