首页 > 解决方案 > 了解 Powershell 全局变量的用例

问题描述

最近,我一直在从事一个项目,我尝试为我的 Powershell 脚本创建 GUI。尽管似乎存在很多可能性,但我找到了一种由 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
    }

由于$xamGUIXAML 读取器捕获的新创建的变量在脚本之间共享,因此我可以理解它们的全局范围。我的问题是针对这一行的:

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

他为什么使用全局范围?这是为了以防我们想在其他地方使用它或者我缺少什么?我对 Powershell 环境还很陌生,该片段的作者显然在 Powershell 世界中臭名昭著,所以我猜这个声明是有原因的,但我不知道这是什么。

标签: wpfpowershellglobal-variables

解决方案


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


推荐阅读