如何访问从窗口检索到的数据?

如何访问从窗口检索到的数据?

使用中描述的过程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,因为它只是调用该函数。

相关内容