222 votes

Inviter l'utilisateur à saisir des données dans PowerShell

Je veux demander à l'utilisateur une série d'entrées, dont un mot de passe et un nom de fichier.

J'ai un exemple d'utilisation de host.ui.prompt ce qui semble raisonnable, mais je ne comprends pas le retour.

Existe-t-il un meilleur moyen d'obtenir des données utilisateur dans PowerShell ?

357voto

Rynant Points 6575

Read-Host est une option simple pour obtenir une entrée de chaîne de caractères d'un utilisateur.

$name = Read-Host 'What is your username?'

Pour cacher les mots de passe, vous pouvez utiliser :

$pass = Read-Host 'What is your password?' -AsSecureString

Pour convertir le mot de passe en texte brut :

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

Quant au type retourné par $host.UI.Prompt() Si vous exécutez le code du lien posté dans le commentaire de @Christian, vous pouvez trouver le type de retour en le passant dans la ligne suivante Get-Member (par exemple, $results | gm ). Le résultat est un Dictionnaire où la clé est le nom d'un FieldDescription utilisé dans l'invite. Pour accéder au résultat de la première invite dans l'exemple lié, vous devez taper : $results['String Field'] .

Pour accéder à l'information sans invoquer une méthode, il suffit de ne pas utiliser les parenthèses :

PS> $Host.UI.Prompt

MemberType          : Method
OverloadDefinitions : {System.Collections.Generic.Dictionary[string,psobject] Pr
                    ompt(string caption, string message, System.Collections.Ob
                    jectModel.Collection[System.Management.Automation.Host.Fie
                    ldDescription] descriptions)}
TypeNameOfValue     : System.Management.Automation.PSMethod
Value               : System.Collections.Generic.Dictionary[string,psobject] Pro
                    mpt(string caption, string message, System.Collections.Obj
                    ectModel.Collection[System.Management.Automation.Host.Fiel
                    dDescription] descriptions)
Name                : Prompt
IsInstance          : True

$Host.UI.Prompt.OverloadDefinitions vous donnera la ou les définitions de la méthode. Chaque définition s'affiche sous la forme <Return Type> <Method Name>(<Parameters>) .

0 votes

Merci, @Rynant. Réponse acceptée pour être le seul à avoir répondu à ma question principale ;) Toutes les autres informations sont également très utiles, d'autant plus que je suis encore en train de tâtonner dans PS.

0 votes

Pas de problème, @AJ. Une autre façon d'obtenir des informations sur une méthode est de laisser tomber les parenthèses. Je vais ajouter un exemple à ma réponse.

3 votes

Pour info, vous pouvez également utiliser Get-Credential si vous souhaitez obtenir des noms d'utilisateur et des mots de passe.

76voto

Start-Automating Points 3953

L'utilisation de la liaison des paramètres est certainement la meilleure solution dans ce cas. Non seulement c'est très rapide à écrire (il suffit d'ajouter le paramètre [Parameter(Mandatory=$true)] au-dessus de vos paramètres obligatoires), mais c'est aussi la seule option pour laquelle vous ne vous détesterez pas plus tard.

Plus d'informations ci-dessous :

[Console]::ReadLine est explicitement interdit par la FxCop pour PowerShell. Pourquoi ? Parce que cela ne fonctionne que dans PowerShell.exe, pas dans PowerShell ISE , PowerGUI etc.

Read-Host est, tout simplement, de mauvais goût. Read-Host arrête de manière incontrôlée le script pour inviter l'utilisateur, ce qui signifie que vous ne pourrez jamais avoir un autre script qui inclut le script qui utilise Read-Host.

Vous essayez de demander des paramètres.

Vous devez utiliser le [Parameter(Mandatory=$true)] et une saisie correcte, pour demander les paramètres.

Si vous l'utilisez sur un [SecureString] il vous demandera un champ pour le mot de passe. Si vous l'utilisez sur un type de justificatif, ( [Management.Automation.PSCredential] ), la boîte de dialogue des informations d'identification s'affichera si le paramètre n'est pas présent. Une chaîne de caractères deviendra une simple zone de texte. Si vous ajoutez un HelpMessage à l'attribut du paramètre (c'est-à-dire, [Parameter(Mandatory = $true, HelpMessage = 'New User Credentials')] ), il deviendra un texte d'aide pour l'invite.

6 votes

Il s'agit de la solution la plus souple et la plus conviviale, mais j'ai presque ignoré votre conseil car il n'y avait pas d'exemples de code clairs comme dans le document suivant Rynant's réponse. Pouvez-vous fournir des exemples joliment formatés ?

4 votes

"Read-Host est, tout simplement, une mauvaise forme"... à moins que vous ne l'utilisiez pour accepter conditionnellement une entrée qui a été laissée de côté parce que quelqu'un n'appelait pas votre script avec AUCUN paramètre. BOOM.

2 votes

Non : c'est toujours une mauvaise pratique alors. C'est pourquoi il faut marquer les paramètres comme obligatoires.

14voto

user2334160 Points 86

Placez ceci en haut de votre script. Il fera en sorte que le script demande à l'utilisateur un mot de passe. Le mot de passe résultant peut alors être utilisé ailleurs dans votre script via Pw .

   Param(
     [Parameter(Mandatory=$true, Position=0, HelpMessage="Password?")]
     [SecureString]$password
   )

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

Si vous voulez déboguer et voir la valeur du mot de passe que vous venez de lire, utilisez :

   write-host $pw

3voto

Maverick Points 135

Comme alternative, vous pourriez l'ajouter comme un paramètre script pour l'entrée dans le cadre de l'exécution de script.

 param(
      [Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value1,
      [Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value2
      )

1voto

CB. Points 24549

Vous pouvez utiliser :

$userinput = [Console]::ReadLine()

o

$userinput = Read-Host "Enter input here:"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X