2014-09-24 71 views
0

我正在嘗試爲我正在運行的其中一個腳本創建GUI,這實際上只是一種奇妙的方式,可以從用戶獲取輸入並將其提供給變量稍後將在腳本中使用。但是,當我在文本輸入字段中輸入任何內容時,除非我轉到代碼中的特定行並單獨運行,否則它不會分配給該變量。我究竟做錯了什麼?將輸入從GUI分配給PowerShell中的變量

[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,但是什麼也沒做。任何建議表示讚賞。

回答

0

你總是可以用一個標準的VB的InputBox去:

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

這是骯髒的,但它本質上是你在找什麼,我認爲,它的代碼少得多的行不是讓自己的Windows窗體。如果你想隱藏加載Microsoft.VisualBasic程序的控制檯輸出,那麼你可以做兩件事情之一:

  1. 將[System.Reflection.Assembly]與[空],它會告訴控制檯忽略輸出
  2. 管它到Out-空,你會達到同樣的效果

一種選擇是,你可以等待Windows窗體關閉(代碼應該停止,直到由$ objForm打開窗口.ShowDialog()也已關閉),然後從$ objTextBox.Text中獲取文本。

如果你真正想要的是一個人放在一個文件夾路徑或文件路徑,但是,那麼這種方法是目前最容易實現和驗證:

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

下面是殼牌的文檔您也可以使用BrowseForFolder方法以您想要的方式工作: http://msdn.microsoft.com/en-us/library/windows/desktop/bb774065%28v=vs.85%29.aspx

希望這有助於您! 這是一個非常熟悉的窗口......在更多的Windows應用程序中使用,而不是我關心的數量。

相關問題