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