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