Demander à l’utilisateur d’entrer 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 , qui semble raisonnable, mais je ne peux pas comprendre le retour.

Existe-t-il un meilleur moyen d’obtenir une entrée utilisateur dans PowerShell?

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?' -AsSecureSsortingng 

Pour convertir le mot de passe en texte brut:

 [Runtime.InteropServices.Marshal]::PtrToSsortingngAuto( [Runtime.InteropServices.Marshal]::SecureSsortingngToBSTR($pass)) 

En ce qui concerne le type renvoyé par $host.UI.Prompt() , si vous exécutez le code sur le lien publié dans le commentaire de @ Christian, vous pouvez trouver le type de retour en le canalisant vers Get-Member (par exemple, $results | gm ). Le résultat est un dictionnaire où la clé est le nom d’un object FieldDescription utilisé dans l’invite. Pour accéder au résultat de la première invite dans l’exemple lié, tapez: $results['Ssortingng Field'] .

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

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

$Host.UI.Prompt.OverloadDefinitions vous donnera la définition de la méthode. Chaque définition s’affiche sous la forme () .

Utiliser la liaison de parameters est certainement la voie à suivre ici. Non seulement il est très rapide d’écrire (il suffit d’append [Parameter(Mandatory=$true)] au-dessus de vos parameters obligatoires), mais c’est aussi la seule option que vous ne vous détesterez pas pour 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 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 incluant le script qui utilise Read-Host.

Vous essayez de demander des parameters.

Vous devez utiliser l’atsortingbut [Parameter(Mandatory=$true)] et corriger la saisie pour demander les parameters.

Si vous utilisez ceci sur un [SecureSsortingng] , 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 dialog des informations d’identification apparaîtra si le paramètre n’est pas présent. Une chaîne deviendra simplement une vieille zone de texte. Si vous ajoutez un HelpMessage à l’atsortingbut de paramètre (c’est-à-dire [Parameter(Mandatory = $true, HelpMessage = 'New User Credentials')] ), cela deviendra du texte d’aide pour l’invite.

Placez-le en haut de votre script. Le script invitera l’utilisateur à saisir 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?")] [SecureSsortingng]$password ) $pw = [Runtime.InteropServices.Marshal]::PtrToSsortingngAuto([Runtime.InteropServices.Marshal]::SecureSsortingngToBSTR($password)) 

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

  write-host $pw 

En guise d’alternative, vous pouvez l’append en tant que paramètre de script pour la saisie dans le cadre de l’exécution du script.

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