2015-05-29 6 views
4

Я знаю простой всплывающей функции для PowerShell, например .:Простая функция InputBox

function popUp($text,$title) { 
    $a = new-object -comobject wscript.shell 
    $b = $a.popup($text,0,$title,0) 
} 

popUp "Enter your demographics" "Demographics" 

Но я не могу найти эквивалент для получения всплывающего окна, чтобы задать для ввода.

Несомненно, есть Read-Line, но он подскажет с консоли.

И тогда эта сложная функция, которая кажется излишеством для сценария, который будет запрашивать ввод один или два раза:

function getValues($formTitle, $textTitle){ 
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 
    [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 

    $objForm = New-Object System.Windows.Forms.Form 
    $objForm.Text = $formTitle 
    $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 = "OK" 
    $OKButton.Add_Click({$Script:userInput=$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(75,23) 
    $CANCELButton.Text = "CANCEL" 
    $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,30) 
    $objLabel.Text = $textTitle 
    $objForm.Controls.Add($objLabel) 

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

    $objForm.Topmost = $True 

    $objForm.Add_Shown({$objForm.Activate()}) 

    [void] $objForm.ShowDialog() 

    return $userInput 
} 

$schema = getValues "Database Schema" "Enter database schema" 

ответ

13

Вероятно, самым простым способом является использование InputBox метод Microsoft.VisualBasic.Interaction класса:

[void][Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic') 

$title = 'Demographics' 
$msg = 'Enter your demographics:' 

$text = [Microsoft.VisualBasic.Interaction]::InputBox($msg, $title) 
2

Было бы что-то вроде этого

function CustomInputBox([string] $title, [string] $message, [string] $defaultText) 
{ 
$inputObject = new-object -comobject MSScriptControl.ScriptControl 
$inputObject.language = "vbscript" 
$inputObject.addcode("function getInput() getInput = inputbox(`"$message`",`"$title`" , `"$defaultText`") end function") 
$_userInput = $inputObject.eval("getInput") 

return $_userInput 
} 

Тогда вы можете вызовите функцию, подобную этой.

$userInput = CustomInputBox "User Name" "Please enter your name." "" 
if ($userInput -ne $null) 
{ 
echo "Input was [$userInput]" 
} 
else 
{ 
echo "User cancelled the form!" 
} 

Это самый простой способ сделать это, о котором я могу думать.

Смежные вопросы