Respuestas:
Read-Host
es una opción simple para obtener una entrada de cadena de un usuario.
$name = Read-Host 'What is your username?'
Para ocultar contraseñas puedes usar:
$pass = Read-Host 'What is your password?' -AsSecureString
Para convertir la contraseña a texto sin formato:
[Runtime.InteropServices.Marshal]::PtrToStringAuto(
[Runtime.InteropServices.Marshal]::SecureStringToBSTR($pass))
En cuanto al tipo devuelto por $host.UI.Prompt()
, si ejecuta el código en el enlace publicado en el comentario de @ Christian, puede encontrar el tipo de retorno canalizándolo a Get-Member
(por ejemplo $results | gm
). El resultado es un diccionario donde la clave es el nombre de un FieldDescription
objeto utilizado en la solicitud. Para acceder al resultado de la primera solicitud en el ejemplo vinculado, escriba:$results['String Field']
.
Para acceder a la información sin invocar un método, deje los paréntesis desactivados:
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
le dará la (s) definición (es) del método. Cada definición se muestra como <Return Type> <Method Name>(<Parameters>)
.
Usar el enlace de parámetros es definitivamente el camino a seguir aquí. No solo es muy rápido de escribir (solo agregue por [Parameter(Mandatory=$true)]
encima de sus parámetros obligatorios), sino que también es la única opción que no se odiará más adelante.
Más abajo:
[Console]::ReadLine
está explícitamente prohibido por las reglas de FxCop para PowerShell. ¿Por qué? Porque solo funciona en PowerShell.exe, no en PowerShell ISE , PowerGUI , etc.
Read-Host es, simplemente, una mala forma. Read-Host detiene incontrolablemente el script para solicitar al usuario, lo que significa que nunca podrá tener otro script que incluya el script que utiliza Read-Host.
Estás tratando de pedir parámetros.
Debe usar el [Parameter(Mandatory=$true)]
atributo y escribir correctamente para solicitar los parámetros.
Si usa esto en un [SecureString]
, solicitará un campo de contraseña. Si usa esto en un tipo de Credencial, ( [Management.Automation.PSCredential]
), aparecerá el cuadro de diálogo de credenciales, si el parámetro no está allí. Una cadena simplemente se convertirá en un cuadro de texto antiguo simple. Si agrega un mensaje de ayuda al atributo de parámetro (es decir, [Parameter(Mandatory = $true, HelpMessage = 'New User Credentials')]
) se convertirá en texto de ayuda para el mensaje.
Read-Host
ser "mala forma" no se aplican. Además, .ShouldProcess()
tiene restricciones que Read-Host
no, como limitarse a solo unas pocas respuestas. Sin embargo, estoy de acuerdo en que .ShouldProcess()
es mejor, cuando sea aplicable.
Coloque esto en la parte superior de su secuencia de comandos. Hará que el script solicite al usuario una contraseña. La contraseña resultante se puede usar en otra parte de su script a través de $ pw .
Param(
[Parameter(Mandatory=$true, Position=0, HelpMessage="Password?")]
[SecureString]$password
)
$pw = [Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($password))
Si desea depurar y ver el valor de la contraseña que acaba de leer, use:
write-host $pw