将输入从GUI分配给Powershell中的变量

时间:2014-09-24 18:40:56

标签: user-interface powershell-v3.0

我正在尝试为我正在运行的其中一个脚本创建GUI,这实际上只是一种从用户那里获取输入并将其输入到稍后将使用的变量中的一种奇特方式剧本。但是,当我在文本输入字段中输入任何内容时,除非我转到代码中的特定行并自行运行,否则它不会分配给变量。我做错了什么?

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

$objForm = New-Object System.Windows.Forms.Form 
$objForm.Text = "File Path"
$objForm.Size = New-Object System.Drawing.Size(300,200) 
$objForm.StartPosition = "CenterScreen"

$objForm.KeyPreview = $True
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Enter") 
    {$x=$objTextBox.Text;$objForm.Close()}})
$objForm.Add_KeyDown({if ($_.KeyCode -eq "Escape") 
    {$objForm.Close()}})

$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(75,120)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "Go for gold!"
$OKButton.Add_Click({$x=$objTextBox.Text;$objForm.Close()})
$objForm.Controls.Add($OKButton)

$CancelButton = New-Object System.Windows.Forms.Button
$CancelButton.Location = New-Object System.Drawing.Size(150,120)
$CancelButton.Size = New-Object System.Drawing.Size(100,23)
$CancelButton.Text = "Abort! It's a trap!"
$CancelButton.Add_Click({$objForm.Close()})
$objForm.Controls.Add($CancelButton)

$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(10,20) 
$objLabel.Size = New-Object System.Drawing.Size(280,20) 
$objLabel.Text = "Please enter the full file path:"
$objForm.Controls.Add($objLabel) 

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

$objForm.Topmost = $True

$objForm.Add_Shown({$objForm.Activate()})
[void] $objForm.ShowDialog()

$x

我在这里找到了一个解决方案,建议将变量更改为$ global,但这没有做任何事情。任何建议表示赞赏。

1 个答案:

答案 0 :(得分:0)

您可以随时使用标准的VB InputBox:

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic")
[Microsoft.VisualBasic.Interaction]::InputBox("Please enter your name",$MyInvocation.MyCommand.Name)

它很脏,但它本质上是我想要的,而且它比编写自己的Windows窗体要少得多。如果你想隐藏加载Microsoft.VisualBasic的控制台输出,那么你可以做以下两件事之一:

  1. 使用[void]预设[System.Reflection.Assembly],这将告诉控制台忽略输出
  2. 将其输入Out-Null,您将获得相同的效果
  3. 另一种方法是你可以等待Windows窗体关闭(代码应该停止,直到$ objForm.ShowDialog()打开的窗口也关闭),然后从$ objTextBox.Text中获取文本。 / p>

    如果您真正想要的是某人放入文件夹路径或文件路径,那么这种方法是最容易实现和验证的方法:

    $vbShell = New-Object -ComObject Shell.Application
    $folder = $vbShell.BrowseForFolder(0x00,"Enter your custom text here",0x01)
    $path = $folder.Self.Path
    

    这里也是Microsoft的Shell对象的文档,因此您可以使BrowseForFolder方法按照您希望的方式工作: http://msdn.microsoft.com/en-us/library/windows/desktop/bb774065%28v=vs.85%29.aspx

    希望这有帮助! 这是一个非常熟悉的窗口......在更多的Windows应用程序中使用,而不是我想要的。