如何在do / while循环中正确使用函数?

时间:2019-06-20 15:34:42

标签: powershell

我创建了一个函数,该函数使用文本输入表单创建特定的UI元素。此表单还具有三个按钮:

  • 应该再次显示文本输入以再次执行相同的功能。
  • 另一个应该完成并关闭UI,将文本输入传递给变量。
  • 最后一个应该取消UI元素,不执行文本输入表单中的任何操作。

现在我知道代码中的循环并没有真正完成,但是即使执行循环以及将文本形式传递到变量中,我也遇到了问题。我知道我正在做的事情,但是当我看着它时,这似乎是正确的。

  • if循环,while循环到现在的do / while循环进行了更改。
  • do部分之间的变量位置更改为while部分。对于ifwhile循环来说都是相同的。

    do {
        ChangeDesc
    }
    while ($result -eq [System.Windows.Forms.DialogResult]::Retry)
    {
        $PC = Get-WmiObject -Class Win32_OperatingSystem -ComputerName $HNInputBox.Text
        $PC.Description = $DescInputBox.Text
        $PC.Put()
    }
    
  • ChangeDesc是函数的名称,并且按预期工作。

  • 可以正常工作的是循环功能“ ChangeDesc”,然后在按下“ Retry”或“ Ok”按钮时,将这些表格传递给变量,如图所示。
  • 当前,它将显示表单,当按下“重试”按钮时,将正确传递表单,然后关闭UI,“确定”按钮不会传递任何输入,而“取消”按钮会同样的事情。

下面是我其余的代码行。

Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing

function ChangeDesc {
    $form = New-Object System.Windows.Forms.Form
    $form.Text = 'Data Entry Form'
    $form.Size = New-Object System.Drawing.Size(300,210)
    $form.StartPosition = 'CenterScreen'

    $AnotherButton = New-Object System.Windows.Forms.Button
    $AnotherButton.Location = New-Object System.Drawing.Point(15,130)
    $AnotherButton.Size = New-Object System.Drawing.Size(75,23)
    $AnotherButton.Text = 'Another?'
    $AnotherButton.DialogResult = [System.Windows.Forms.DialogResult]::Retry
    $form.AcceptButton = $AnotherButton
    $form.Controls.Add($AnotherButton)

    $FinishedButton = New-Object System.Windows.Forms.Button
    $FinishedButton.Location = New-Object System.Drawing.Point(100,130)
    $FinishedButton.Size = New-Object System.Drawing.Size(75,23)
    $FinishedButton.Text = 'Finished'
    $FinishedButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
    $form.CancelButton = $FinishedButton
    $form.Controls.Add($FinishedButton)

    $CancelButton = New-Object System.Windows.Forms.Button
    $CancelButton.Location = New-Object System.Drawing.Point(185,130)
    $CancelButton.Size = New-Object System.Drawing.Size(75,23)
    $CancelButton.Text = 'Cancel'
    $CancelButton.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
    $form.CancelButton = $CancelButton
    $form.Controls.Add($CancelButton)

    $HNLabel = New-Object System.Windows.Forms.Label
    $HNLabel.Location = New-Object System.Drawing.Point(10,20)
    $HNLabel.Size = New-Object System.Drawing.Size(280,20)
    $HNLabel.Text = 'Enter Host Name:'
    $form.Controls.Add($HNLabel)

    $HNInputBox = New-Object System.Windows.Forms.TextBox
    $HNInputBox.Location = New-Object System.Drawing.Point(10,40)
    $HNInputBox.Size = New-Object System.Drawing.Size(260,20)
    $form.Controls.Add($HNInputBox)

    $DescLabel = New-Object System.Windows.Forms.Label
    $DescLabel.Location = New-Object System.Drawing.Point(10,70)
    $DescLabel.Size = New-Object System.Drawing.Size(280,20)
    $DescLabel.Text = 'Enter Description:'
    $form.Controls.Add($DescLabel)

    $DescInputBox = New-Object System.Windows.Forms.TextBox
    $DescInputBox.Location = New-Object System.Drawing.Point(10,90)
    $DescInputBox.Size = New-Object System.Drawing.Size(260,20)
    $form.Controls.Add($DescInputBox)

    $form.Topmost = $true

    $form.Add_Shown({$HNInputBox.Select()})
    $result = $form.ShowDialog()
}

1 个答案:

答案 0 :(得分:1)

当循环终止时,您的表单已经关闭,并且您尝试使用的变量是函数的局部变量。将要尝试使用的值分配给函数末尾的脚本或全局作用域变量,然后代码应会执行您期望的操作:

library(distributions)

X <- Bernoulli(0.1)

random(X, 10)
#>  [1] 0 0 0 0 0 0 0 0 1 0
pdf(X, 1)
#> [1] 0.1

cdf(X, 0)
#> [1] 0.9
quantile(X, 0.5)
#> [1] 0