Invite pour l'entrée de l'utilisateur dans PowerShell

Je veux demander à l'utilisateur une série d'entrées, y compris 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 l'entrée de L'utilisateur dans PowerShell?

170
demandé sur Peter Mortensen 2011-11-18 18:41:54

4 réponses

Read-Host est une option simple pour obtenir de la chaîne d'entrée à partir d'un utilisateur.

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

Pour masquer 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))

, Comme pour le type retourné par $host.UI.Prompt(), si vous exécutez le code dans le lien posté par @Christian commentaire, vous pouvez trouver le type de retour par la tuyauterie à Get-Member (par exemple, $results | gm). Le résultat est un dictionnaire où la clé est le nom d'un objet FieldDescription utilisé dans l'invite. De accédez au résultat de la première invite dans l'exemple lié que vous tapez: $results['String Field'].

Pour accéder aux informations sans invoquer une méthode, laissez 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 va vous donner la définition(s) de la méthode. Chaque définition s'affiche comme <Return Type> <Method Name>(<Parameters>).

263
répondu Rynant 2016-03-09 19:34:24

L'utilisation de la liaison de paramètres est définitivement la voie à suivre ici. Non seulement il est très rapide à écrire (il suffit d'Ajouter [Parameter(Mandatory=$true)] Au-dessus de vos paramètres obligatoires), mais c'est aussi la seule option que vous ne vous détesterez pas plus tard.

Plus ci-dessous:

[Console]::ReadLine est explicitement interdite par les règles FxCop pour PowerShell. Pourquoi? Parce que cela ne fonctionne que dans PowerShell.exe, pas de PowerShell ISE, PowerGUI, etc.

Read-Host est, tout simplement, une mauvaise forme. Read-Host arrête de manière incontrôlable le script pour inviter l'utilisateur, ce qui signifie que vous ne pouvez jamais avoir un autre script qui inclut le script qui utilise Read-Host.

Vous essayez de demander des paramètres.

Vous devez utiliser l'attribut [Parameter(Mandatory=$true)], et corriger la saisie, pour demander les paramètres.

Si vous l'utilisez sur un [SecureString], il vous demandera un champ de mot de passe. Si vous l'utilisez sur un type D'informations d'Identification, ([Management.Automation.PSCredential]), la boîte de dialogue Informations d'identification apparaîtra, si le paramètre n'est pas là. Un string deviendra simplement une ancienne zone de texte. Si vous ajoutez un HelpMessage à l'attribut de paramètre (c'est - [Parameter(Mandatory = $true, HelpMessage = 'New User Credentials')]), alors il deviendra un texte d'aide pour l'invite.

69
répondu Start-Automating 2016-03-09 19:38:58

Placez ceci en haut de votre script. Cela entraînera le script pour demander à l'utilisateur un mot de passe. Le mot de passe résultant peut ensuite ê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
13
répondu user2334160 2017-01-24 18:55:46

Comme alternative, vous pouvez l'ajouter en tant que paramètre de script pour l'entrée dans le cadre de l'exécution du script

 param(
      [Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value1,
      [Parameter(Mandatory = $True,valueFromPipeline=$true)][String] $value2
      )
3
répondu Maverick 2014-11-23 16:40:32