了解Powershell全局变量的用例

时间:2018-05-03 18:31:52

标签: wpf powershell global-variables

最近,我一直致力于一个项目,我尝试为我的Powershell脚本创建GUI。虽然,似乎存在很多可能性,但我发现了一种由Microsoft PFE设计的方法: Chris Conte

如果你们有兴趣,你可以找到文章here

现在,我的问题特别与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
    }

由于XAML阅读器捕获的$xamGUI和新创建的变量在脚本之间共享,我可以理解它们的全局范围。我的问题专门针对这一行:

  

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

为什么他使用全球范围?这是为了以防我们想在其他地方使用它还是有些东西我不见了?我仍然是Powershell环境的新手,而且片段的作者显然在Powershell世界中声名狼借,所以我猜这个声明是有原因的,但是我不知道这是什么。

1 个答案:

答案 0 :(得分:0)

帮助程序脚本基本上是"返回"事物 - XML,表单和所有控件 - 作为变量的用户。例如,如果XAML中有一个标记为button1的按钮,则该脚本将创建一个全局变量$global:button1。然后,您可以使用此变量附加事件处理程序: $button1.add_Click{ $Label1.Content = "Hello World" } 它在事件处理程序中对这些全局变量的需求变得明显。您必须以某种方式将表单控件传递给事件处理程序scriptblock - 在本例中为Label1。最简单的方法是在父(例如全局)范围内创建变量,并允许动态范围为您完成工作。 C#通过创建封闭类的所有控件成员来使用类似(但是词法范围)的方法。