使用中描述的过程https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-powershell-1.0/ff730949(v=technet.10)我创建了一个脚本,允许我从数据库中选择信息,然后将信息返回给调用它的函数以供以后使用。我遇到的问题是,虽然返回时似乎选择了数据,但调用函数SelectBuildScript
似乎没有收到它。此功能由按钮触发。下面的代码创建了按钮。按下按钮时,对话框打开,允许我选择构建文件。但在退出该函数时,函数返回数据的详细显示所需的数据。调用代码中的数据为空,我看不到任何返回的数据。
$listButton = New-Object System.Windows.Forms.Button
$listButton.Location = New-Object System.Drawing.Size(5,40)
$listButton.Size = New-Object System.Drawing.Size(150,20)
$listButton.Text = "List Build Scripts"
$ListButton.Add_Click({($selectedBuild = SelectBuildScript -verbose)})
$form.Controls.Add($listButton)
##end define list tab #########################################
Write-Verbose "[$($MyInvocation.MyCommand)] Selected build = $selectedBuild build id = $selectedBuild[0] ver = $selectedBuild[1]"
如何访问对话返回的数据以供日后使用?
我是否最好使用全局数据来传递数据。
抱歉回复晚了,我一直在做别的事情。我修改了脚本以使用全局数据,我认为这将克服范围问题并使其正常工作。但是由于这一变化,脚本行为没有发生任何变化。新脚本是这样的。
$listButton = New-Object System.Windows.Forms.Button
$listButton.Location = New-Object System.Drawing.Size(5,40)
$listButton.Size = New-Object System.Drawing.Size(150,20)
$listButton.Text = "List Build Scripts"
#script now places return into global:selected_build
$ListButton.Add_Click({(SelectBuildScript -verbose)})
$form.Controls.Add($listButton)
##end define list tab #########################################
Write-Verbose "[$($MyInvocation.MyCommand)] Selected build = $global:selected_Build build id = $global:selected_Build[0] ver = $global:selected_Build[1]"
全局变量在构建脚本中有正确的数据,但在调用脚本中却没有。因为我有一个 GUI 调用另一个 GUI,而调用 GUI 尝试使用被调用 GUI 中选择的数据,这可能是代码顺序的问题。
答案1
PowerShell 范围不属于我之前的回复的一部分。
按照惯例,我将代码保留在与 GUI 设计分离的后面。
<#
Environment Notes:
Any notes about this region
#>
#region Begin code behind
#
# Function, module, namespace environment settings go here
#
#endregion End Code Behind
<#
GUI Notes:
Any notes about this region
#>
#region Begin GUI implementation
#
# All GUI elements go here
#
#endregion End GUI implementation
如果您尚未证明对数据源的所有原始调用都是有效的,那么就不要花费任何时间从 GUI 执行此操作。
这使得我或 GUI 专家可以做任何事情,然后我只需通过函数名称将我的代码绑定到元素/事件。
也就是说,为您想要在 GUI 之外执行的操作创建一个函数,然后测试该函数以确保您获得所期望的内容,然后在 GUI/Event 元素中使用该函数名称。
# Example
#region Begin code behind
#
Function Get-ListButtonData
{
[CmdletBinding(SupportsShouldProcess)]
Param
()
# Your function code here
}
#
#endregion End Code Behind
#region Begin GUI implementation
#
$listButton = New-Object System.Windows.Forms.Button
$listButton.Location = New-Object System.Drawing.Size(5,40)
$listButton.Size = New-Object System.Drawing.Size(150,20)
$listButton.Text = "List Build Scripts"
$ListButton.Add_Click({Get-ListButtonData})
$form.Controls.Add($listButton)
##end define list tab #########################################
#
#endregion End GUI implementation
这样,如果您需要让函数执行不同的操作,您可以执行此操作而不必弄乱 GUI,因为它只是调用该函数。