在powershell中变量为空时,文本框是否为空

时间:2017-09-27 20:42:19

标签: powershell while-loop scripting textbox do-while

我是PowerShell的新手,我需要一些脚本帮助。

我有一个简单的代码循环,而用户没有输入名称:

do {$name = Read-Host "Choose a name "}
    while (!$name) {}

我尝试将它用于GUI版本,但循环不会停止:

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 

$box = {

$Form = New-Object System.Windows.Forms.Form 
$Form.Text = "Hostname"
$Form.Size = New-Object System.Drawing.Size(270,150) 
$Form.StartPosition = "CenterScreen"

$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(165,75)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$Form.AcceptButton = $OKButton
$Form.Controls.Add($OKButton)

$Label = New-Object System.Windows.Forms.Label
$Label.Location = New-Object System.Drawing.Size(10,15) 
$Label.Size = New-Object System.Drawing.Size(280,20) 
$Label.Text = "Choose a name :"
$Form.Controls.Add($Label) 

$TextBox = New-Object System.Windows.Forms.TextBox 
$TextBox.Location = New-Object System.Drawing.Size(10,40) 
$TextBox.Size = New-Object System.Drawing.Size(230,20) 
$Form.Controls.Add($TextBox) 

$Form.Topmost = $True

$Form.Add_Shown({$TextBox.Select()})
$result = $Form.ShowDialog()
return $TextBox.Text

}

do {&$box}
    while (!$TextBox.Text) {}

我想我错过了一些东西,但我不知道是什么...... 对不起,我的英语很差,提前谢谢。

2 个答案:

答案 0 :(得分:0)

您正在调用的文本框永远不会传输到其父文件夹。因此,您需要分配您的返回值并从那里开始工作。

do {$value = &$box }
while ([String]::IsNullOrWhiteSpace($value)) 
Write-Host $value -ForegroundColor Cyan

答案 1 :(得分:0)

试试这个。

[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 

# Null out name value in case you need to call the script multiple times in the same PS session.
$name = $null

$box = {

$Form = New-Object System.Windows.Forms.Form 
$Form.Text = "Hostname"
$Form.Size = New-Object System.Drawing.Size(270,150) 
$Form.StartPosition = "CenterScreen"

$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(165,75)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
$OKButton.DialogResult = [System.Windows.Forms.DialogResult]::OK
$Form.AcceptButton = $OKButton
$Form.Controls.Add($OKButton)

$Label = New-Object System.Windows.Forms.Label
$Label.Location = New-Object System.Drawing.Size(10,15) 
$Label.Size = New-Object System.Drawing.Size(280,20) 
$Label.Text = "Choose a name :"
$Form.Controls.Add($Label) 

$TextBox = New-Object System.Windows.Forms.TextBox 
$TextBox.Location = New-Object System.Drawing.Size(10,40) 
$TextBox.Size = New-Object System.Drawing.Size(230,20) 
$Form.Controls.Add($TextBox) 

$Form.Topmost = $True

$Form.Add_Shown({$TextBox.Select()})
$result = $Form.ShowDialog()

# Only return if the TextBox.Text is set to stop it from exiting immediately after rendering the form.
if ($TextBox.Text) {return $TextBox.Text}

}

# While the name variable is null, show the form again.
while (-not $name) {
    $name = & $box
}