Я новичок в этом, и я пытаюсь создать графический интерфейс 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()
0
dsai 24 Окт 2018 в 06:32

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

0
Robert Cotterman 24 Окт 2018 в 04:13

Как уже сказал Роберт Коттерман , параметр фильтра является проблемой, потому что вам нужно использовать { {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
0
Kirill Pashkov 25 Окт 2018 в 06:21
52960705