Tuesday, 23 October 2012

Display Inputbox with Powershell

Hi All,

Powershell does not support InputBox itself. We might have to do some effort to achieve it. I did some research and found two methods can be used :

DEPLOYMENT STEPS

Method [1] : Using vbscript

This method is more simple, but the only drawback which I don't like is borrowing something from our old friend vbscript which was always good, but unreliable for some reasons.

Let's have a look into the code.

I have created as function CustomInputBox which will encapsulate the logic and adding references and will return the value entered by user.

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!"
}




Method [2] : Creating your own GUI

This method is extremely flexible and requires little more effort. If you COPY+PASTE, there is not much effort, but while developing I did some more effort.

Let's have look into the code.

I have created a function CustomInputBox which will create all the GUI interface and will return the user input.

function CustomInputBox([string] $title, [string] $message, [string] $defaultText)
{
 [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")
 [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")

 $userForm = New-Object System.Windows.Forms.Form
 $userForm.Text = "$title"
 $userForm.Size = New-Object System.Drawing.Size(290,150)
 $userForm.StartPosition = "CenterScreen"
     $userForm.AutoSize = $False
     $userForm.MinimizeBox = $False
     $userForm.MaximizeBox = $False
     $userForm.SizeGripStyle= "Hide"
     $userForm.WindowState = "Normal"
     $userForm.FormBorderStyle="Fixed3D"
   
 $OKButton = New-Object System.Windows.Forms.Button
 $OKButton.Location = New-Object System.Drawing.Size(115,80)
 $OKButton.Size = New-Object System.Drawing.Size(75,23)
 $OKButton.Text = "OK"
 $OKButton.Add_Click({$value=$objTextBox.Text;$userForm.Close()})
 $userForm.Controls.Add($OKButton)

 $CancelButton = New-Object System.Windows.Forms.Button
 $CancelButton.Location = New-Object System.Drawing.Size(195,80)
 $CancelButton.Size = New-Object System.Drawing.Size(75,23)
 $CancelButton.Text = "Cancel"
 $CancelButton.Add_Click({$userForm.Close()})
 $userForm.Controls.Add($CancelButton)

 $userLabel = New-Object System.Windows.Forms.Label
 $userLabel.Location = New-Object System.Drawing.Size(10,20)
 $userLabel.Size = New-Object System.Drawing.Size(280,20)
 $userLabel.Text = "$message"
 $userForm.Controls.Add($userLabel)

 $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)
 $objTextBox.Text="$defaultText"
 $userForm.Controls.Add($objTextBox)

 $userForm.Topmost = $True
 $userForm.Opacity = 0.91
     $userForm.ShowIcon = $False

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

 return $value

}


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




CONCLUSION

You may try any of the merthod described above. I would suggest Method#2 is more flexible and you have much more scope to improve. But again, if users are used to have the same inputbox which was famous in previous years, Method#1 is for you.
Happy scripting !!!

No comments:

Post a Comment