web-dev-qa-db-fra.com

Invite à la saisie de l'utilisateur dans PowerShell

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

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

Existe-t-il un meilleur moyen d'obtenir la contribution de l'utilisateur dans PowerShell?

191
AJ.

Read-Host est une option simple pour obtenir une entrée de chaîne 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))
_

En ce qui concerne le type renvoyé par $Host.UI.Prompt(), si vous exécutez le code au lien affiché dans le commentaire de @ Christian, vous pouvez connaître le type de retour en le redirigeant vers Get-Member ( par exemple, _$results | gm_). Le résultat est un dictionnaire dont la clé est le nom d'un objet FieldDescription utilisé dans l'invite. Pour accéder au résultat de la première invite de l'exemple lié, tapez: _$results['String Field']_.

Pour accéder aux informations sans appeler de méthode, laissez les parenthèses désactivées:

_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>).

295
Rynant

L'utilisation de la liaison de paramètres est certainement la voie à suivre ici. L’écriture est non seulement très rapide (il suffit d’ajouter [Parameter(Mandatory=$true)] au-dessus de vos paramètres obligatoires), mais c’est également la seule option pour laquelle vous ne vous détesterez pas plus tard.

Plus ci-dessous:

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

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

Vous essayez de demander des paramètres.

Vous devez utiliser l'attribut [Parameter(Mandatory=$true)] et le typage correct pour demander les paramètres.

Si vous utilisez ceci sur un [SecureString], il vous demandera un champ de mot de passe. Si vous utilisez ceci sur un type d'informations d'identification, ([Management.Automation.PSCredential]), la boîte de dialogue d'informations d'identification apparaîtra si le paramètre n'y figure pas. Une chaîne deviendra juste une vieille zone de texte simple. Si vous ajoutez un HelpMessage à l'attribut de paramètre (c'est-à-dire [Parameter(Mandatory = $true, HelpMessage = 'New User Credentials')]), il deviendra alors un texte d'aide pour l'invite.

74
Start-Automating

Placez ceci en haut de votre script. Le script demandera à l'utilisateur un mot de passe. Le mot de passe obtenu 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
14
user2334160

Vous pouvez également l'ajouter en tant que paramètre de script à saisir lors de l'exécution du script.

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