Понимание варианта использования глобальной переменной Powershell - PullRequest
0 голосов
/ 03 мая 2018

Недавно я работал над проектом, в котором я пытаюсь создать GUI для моих скриптов Powershell. Несмотря на то, что, кажется, существует множество возможностей, я нашел один способ сделать это, разработанный Microsoft PFE: Chris Conte .

Если вы, ребята, заинтересованы, вы можете найти статью здесь .

Теперь мой вопрос связан, в частности, со скриптом loadDialog.ps1, который по сути является связующим звеном между формой XAML и вашим оригинальным скриптом Powershell. Вот код:

[CmdletBinding()]
Param(
  [Parameter(Mandatory=$True,Position=1)]
  [string]$XamlPath
)

[xml]$Global:xmlWPF = Get-Content -Path $XamlPath

#Add WPF and Windows Forms assemblies
try{
    Add-Type -AssemblyName PresentationCore,PresentationFramework,WindowsBase,system.windows.forms
} catch {
    Throw "Failed to load Windows Presentation Framework assemblies."
}

#Create the XAML reader using a new XML node reader
$Global:xamGUI = [Windows.Markup.XamlReader]::Load((new-object System.Xml.XmlNodeReader $xmlWPF))

#Create hooks to each named object in the XAML
$xmlWPF.SelectNodes("//*[@Name]") | %{
    Set-Variable -Name ($_.Name) -Value $xamGUI.FindName($_.Name) -Scope Global
    }

Поскольку $xamGUI и вновь созданные переменные, захваченные средством чтения XAML, используются сценариями, я могу понять их глобальную область действия. Мой вопрос относится к этой строке:

[xml]$Global:xmlWPF = Get-Content -Path $XamlPath

Почему он использует глобальную область видимости? Это на случай, если мы захотим использовать его где-нибудь еще или я что-то упустил? Я все еще новичок в среде Powershell, и у автора фрагмента явно есть известность в мире Powershell, поэтому я предполагаю, что есть причина для этого заявления, но я не могу понять, что это такое.

1 Ответ

0 голосов
/ 03 мая 2018

Вспомогательный скрипт по сути «возвращает» вещи - XML, форму и все элементы управления - пользователю как переменные. Например, если в XAML была кнопка с меткой button1, сценарий создал бы глобальную переменную $global:button1. Затем вы можете использовать эту переменную для присоединения обработчика событий: $button1.add_Click{ $Label1.Content = "Hello World" } Именно в обработчике событий потребность в этих глобальных переменных становится очевидной. Вы как-то должны передать элементы управления формой в блок сценария обработчика событий - в данном случае Label1. Самый простой способ сделать это - создать переменные в родительской (например, глобальной) области и позволить динамической области видимости сделать всю работу за вас. C # использует аналогичный (но лексически ограниченный) подход, делая все элементы управления членами включающего класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...