3

I am learning Powershell and attempting to create a GUI interface like the example here.

However, when I run this as it is, $x is never defined. Any idea what I could be doing wrong? I know it has something to do with:

$OKButton.Add_Click({$x=$objListBox.SelectedItem;$objForm.Close()})

Because if I change it to:

$OKButton.Add_Click({Write-Host "worked";$objForm.Close()})

It does return worked.

Danny Beckett
  • 20,529
  • 24
  • 107
  • 134
atownson
  • 368
  • 2
  • 10
  • 22

2 Answers2

9

Your actionblock is running in a seperate local scope. To modify a global(session-wide) variable, use a scope-modifier($global:varname). E.g.:

$OKButton.Add_Click({$global:x=$objListBox.SelectedItem;$objForm.Close()})

More about scopes at Technet - about_Scopes (or write Get-Help about_scopes in PowerShell)

Frode F.
  • 52,376
  • 9
  • 98
  • 114
0

Instead of $Global:variable one can also use the $Script:variable which will increase the scope of your variable to your script. Hence, if you use A function to create buttons and within the function you also have the .Add_Click({}) function, it will work within your function scope. The $Script: variable increase the scope of the variable to the nearest parent script file scope.

Alex_P
  • 2,580
  • 3
  • 22
  • 37