web-dev-qa-db-fra.com

Fonction InputBox simple

Je connais une fonction contextuelle simple pour PowerShell, par exemple:

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

popUp "Enter your demographics" "Demographics"

Mais je suis incapable de trouver un équivalent pour obtenir un pop-up pour demander une contribution.

Bien sûr, il y a Read-Line , mais il vous est demandé depuis la console.

Et puis il y a cette fonction complexe, qui semble exagérée pour un script qui demandera une entrée une ou deux fois:

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"
11
Rhonda

La méthode la plus simple consiste probablement à utiliser la méthode InputBox du Microsoft.VisualBasic.Interaction class:

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

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

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

Ce serait quelque chose comme ça

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
}

Ensuite, vous pouvez appeler la fonction similaire à celle-ci.

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

C’est le moyen le plus simple de le faire auquel je puisse penser.

2
Luke

La réponse sélectionnée n'a pas fonctionné pour moi. Mais j'aimerais pouvoir l'utiliser. Des idées pourquoi pas. Cela ne fait que durer longtemps. Je sais que j'ai le truc. J'ai tellement de bibliothèques et que pas sur mon PC - y compris l'installation complète de Visual Studio - tous les 90 Gb.

Cela pue comme une solution! Je sais, mais cette règle des 50 représentants m'empêche de commenter une solution. Ce qui me rend fou. Appelez-moi la pire chose que vous puissiez imaginer - et quoi que vous fassiez - ne me votez pas afin que je puisse simplement réagir de manière appropriée à l'avenir.

1
Andy T

Le moyen le plus simple d'obtenir une zone de saisie consiste à utiliser les applets de commande Read-Host et -AsSecureString.

$us = Read-Host 'Enter Your User Name:' -AsSecureString
$pw = Read-Host 'Enter Your Password:' -AsSecureString

Ceci est particulièrement utile si vous collectez des informations de connexion comme dans l'exemple ci-dessus. Si vous préférez garder les variables obscurcies en tant qu'objets SecureString, vous pouvez convertir les variables à la volée comme ceci:

[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($us))
[Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($pw))

Si l'information n'a pas besoin d'être sécurisée, vous pouvez la convertir en texte brut:

$user = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($us))

Read-Host et -AsSecureString semblent avoir été incluses dans toutes les versions de PowerShell (1-6), mais je ne dispose pas de PowerShell 1 ou 2 pour garantir le fonctionnement identique des commandes . https://docs.Microsoft.com /en-us/powershell/module/Microsoft.powershell.utility/read-host?view=powershell-3.0

0
DBADon