【发布时间】: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