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 FieldDescriptionobjeto 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:
$Host.UI.Prompt.OverloadDefinitionsle dará la (s) definición (es) del método. Cada definición se muestra como <Return Type> <Method Name>(<Parameters>).
Gracias, @Rynant. ¡Respuesta aceptada por ser el único que realmente respondió mi pregunta principal! ;) Toda la otra información es realmente útil también, especialmente porque todavía estoy buscando mi lugar en PS.
AJ.
No hay problema, @AJ. Otra forma de obtener información sobre un método es omitir los paréntesis. Agregaré un ejemplo a mi respuesta.
Rynant
3
Para su información, también puede usar Get-Credential si obtiene nombres de usuario y contraseñas.
Matt Lyons
75
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]::ReadLineestá 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.
Esta es la solución más flexible y fácil de usar, pero casi ignoré su consejo porque no había ejemplos de código claro como en la respuesta de Rynant . ¿Puedes proporcionar algunos ejemplos bien formateados?
Iain Samuel McLean Élder
44
"Read-Host es, simplemente, una mala forma" ... a menos que lo esté usando para aceptar condicionalmente la entrada que se omitió porque alguien no estaba llamando a su script con CUALQUIER parámetro. AUGE.
2
No: todavía es mala forma entonces. Es por eso que marca los parámetros como obligatorios.
Comienza a automatizar el
2
¿Qué pasa si quieres escribir un guión interactivo? Digamos que es un script que solo requiere la entrada del usuario si se cumplen ciertas condiciones. Por ejemplo, si su script debe configurar un directorio de destino para un SDK, es posible que desee confirmar que el usuario desea eliminar el directorio si ya existe.
Jason Goemaat
66
Creo que user1499731 tenía un buen punto ... Hay momentos en los que necesita recibir información del usuario que solo se puede proporcionar de manera significativa después de que se muestre cierta información o se realice otra operación. En ese caso, no puede usar un parámetro, y las razones dadas aquí para Read-Hostser "mala forma" no se aplican. Además, .ShouldProcess()tiene restricciones que Read-Hostno, como limitarse a solo unas pocas respuestas. Sin embargo, estoy de acuerdo en que .ShouldProcess()es mejor, cuando sea aplicable.
LarsH
14
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 .
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.fuente
Read-Host
ser "mala forma" no se aplican. Además,.ShouldProcess()
tiene restricciones queRead-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 .
Si desea depurar y ver el valor de la contraseña que acaba de leer, use:
fuente
Como alternativa, puede agregarlo como parámetro de script para la entrada como parte de la ejecución del script
fuente