【问题标题】:Understanding the use-case of a Powershell global variable了解 Powershell 全局变量的用例
【发布时间】:2018-10-14 03:55:43
【问题描述】:

最近,我一直在从事一个项目,我尝试为我的 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
    }

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

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

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

【问题讨论】:

  • 根据定义,唯一需要 GLOBAL 范围的情况是如果您想访问多个单独脚本中的变量。
  • WPF 模板变量的全局范围是不必要的,而且很可能是一个失误,除非他在另一个脚本中使用该变量。
  • 作为一个警告,我会花时间学习足够的时间C#用 WPF 开发一个实际的 GUI,而不是把 GUI 塞进 PowerShell 脚本(除了单层 GUI 之外的任何东西) )
  • @EBGreen 谢谢你的回答,我讨厌使用不必要的全局变量,这就是我想知道的原因。感谢您的宝贵时间。
  • 脚本作者认为脚本用户访问此变量可能很有用,仅此而已。例如,您可能需要在此 xml 中找到一些未被Name 标识的对象。由于它是通用脚本 - 提供全局变量以备将来使用并没有错。

标签: wpf powershell global-variables


【解决方案1】:

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

【讨论】:

  • 正如我所说,由于 XAML 阅读器捕获的 $xamGUI 和新创建的变量在脚本之间共享,我可以理解它们的全局范围。我了解脚本的作用,我的问题是关于$xmlWPF
猜你喜欢
  • 1970-01-01
  • 2015-05-02
  • 1970-01-01
  • 2013-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多