Búsqueda de sitios web

Presione cualquier tecla para continuar en PowerShell [6 formas]


Soluciones para el entorno de secuencias de comandos integrado (ISE) de PowerShell y la consola de línea de comandos

Usando el cmdlet Read-Host

Utilice el comando Read-Host para habilitar presione cualquier tecla para continuar en PowerShell.

Utilice el cmdlet Read-Host:

Read-Host -Prompt "Press any key to continue..."

PRODUCCIÓN :

Press any key to continue...: pressed
pressed

El cmdlet Read-Host es el más utilizado y fácil de entender. Lo usamos para pausar la ejecución y pedirle al usuario que obtenga la línea de entrada de la consola de PowerShell. Recuerda que debemos pulsar Enter para salir del modo pausa.

Aquí, el parámetro -Prompt se usó para especificar el texto de un mensaje, permitiendo al usuario escribir una cadena. Si la cadena contiene espacios, enciérrela entre comillas.

También podemos usar el cmdlet Read-Host para solicitar a los usuarios que obtengan datos seguros, por ejemplo, contraseñas, porque podemos guardar la cadena de entrada recibida como una cadena segura usando -AsSecureString parámetro de la siguiente manera:

Utilice Read-Host con -AsSecureString:

Read-Host "Enter a Password" -AsSecureString

PRODUCCIÓN :

Enter a Password: ****

Recuerde, el Read-Host solo puede aceptar 1022 caracteres como entrada proporcionada por el usuario.

Uso de la interfaz de usuario del cuadro de mensajes

Este enfoque es práctico cuando queremos habilitar solo una clave para continuar en PowerShell. Entonces, para permitir eso:

  • Utilice New-Object con el parámetro -ComObject para especificar el identificador programático del objeto COM.
  • Utilice la función .Popup() para mostrar texto en una ventana emergente.

Usar la interfaz de usuario del cuadro de mensajes:

$Shell = New-Object -ComObject "WScript.Shell"
$Button = $Shell.Popup("Press OK to continue.", 0, "Hi", 0)

Podemos usar el cmdlet New-Object para crear una instancia de un objeto COM o .NET framework. Podemos escribir el ProgID del objeto COM o el tipo de una clase de framework .NET.

Para el código anterior, utilizamos New-Object para crear una instancia del objeto COM. Luego, especificamos el parámetro -ComObject con el cmdlet New-Object para escribir el identificador programático (ProgID) del COM objeto, que era el WScript.shell y guardó la referencia en la variable $Shell.

A continuación, utilizamos el método Popup() para mostrar texto en el cuadro de mensaje emergente. Solo podemos usar el método Popup() encadenándolo con el objeto WshShell, que es $Shell en nuestro caso. El método .Popup() tomó cuatro valores; Entendámoslos a continuación:

  • strText: contiene un valor de tipo cadena, que es el mensaje de texto que se muestra en nuestro cuadro de mensaje emergente. Usamos Presione OK para continuar como valor para el parámetro strText.
  • nSecondsToWait: es un parámetro opcional que contiene un valor numérico que indica el tiempo máximo (en segundos) para mostrar un cuadro de mensaje emergente. Si este parámetro se establece en 0, que es su valor predeterminado, el cuadro de mensaje será visible hasta que el usuario presione OK o X. El cuadro de mensaje también se cerrará si los usuarios presionan Enter desde su teclado.
  • strTitle: también contiene un valor de tipo cadena, utilizado como título para el cuadro de mensaje emergente.
  • nType: un parámetro opcional que contiene un valor numérico que representa el tipo de íconos/botones que queremos usar en nuestro cuadro de mensaje emergente. Por ejemplo, usamos 0 para mostrar el botón OK. Puede encontrar diferentes valores decimales para diferentes tipos de controles (botones) e íconos aquí.

Finalmente, usamos $Button para contener un valor numérico, que es devuelto por el método .Popup(). Este valor numérico indica la cantidad de botones en los que el usuario hace clic para cerrar el cuadro de mensaje emergente.

Nota: También podemos especificar valores hexadecimales para el parámetro nType.

Hasta este punto, hemos aprendido varios enfoques que funcionan en PS-ISE (PowerShell Integrated Scripting Environment), una interfaz gráfica de usuario y alojamiento front-end. Sin embargo, a continuación se muestran algunas formas que solo funcionarán en la consola de línea de comandos de PowerShell.

Soluciones para la consola de línea de comandos de PowerShell

Usando el método ReadKey() con/sin [void]

Utilice el método ReadKey() para habilitar presione cualquier tecla para continuar en PowerShell.

Utilice ReadKey() con void:

[void][System.Console]::ReadKey($true)

El comando anterior espera hasta que el usuario presione cualquier tecla para continuar. Tenga en cuenta que este comando no aceptará las teclas modificadoras individuales (Alt, Ctrl y Shift).

Dividamos este comando en partes para aprenderlo más claramente. Primero, la espera ReadKey($true), lo que significa que se bloquea en un hilo que emite un método ReadKey y un usuario presiona la tecla de función o carácter.

Aquí, la tecla de función o carácter puede ser única o en combinación con teclas modificadoras (Alt, Ctrl y Shift). Sin embargo, si presiona cualquier tecla modificadora únicamente, no se devolverá el método ReadKey.

Pasamos el argumento $true al método ReadKey() porque no queríamos mostrar la tecla presionada en la ventana de la consola. Pero esto es opcional; Podemos omitir este argumento o pasar $false si vamos a mostrar la tecla presionada en la ventana de su consola. Vea el siguiente ejemplo.

Utilice ReadKey() con el argumento $false:

[void][System.Console]::ReadKey($false)

Utilice ReadKey() sin ningún argumento:

[void][System.Console]::ReadKey()

Usamos el operador de miembro estático (::) para llamar a una clase estática de .NET framework llamada System.Console. También podemos usar el operador :: para llamar propiedades estáticas del marco .NET. Ahora bien, ¿qué es System.Console?

En el marco .NET, tenemos una clase llamada Console, ubicada en el espacio de nombres System. La clase System.Console nos permite acceder mediante programación a stdin, stderr y stdout en la aplicación de consola. Aquí, stdin, stderr y stdout representan flujos de entrada, error y salida para la aplicación de consola.

Ahora, la pregunta es, ¿por qué usamos [void]? Antes de responder esta pregunta, utilice el siguiente comando sin [void] y vea su resultado.

Utilice ReadKey() sin void:

[System.Console]::ReadKey($true)

PRODUCCIÓN :

KeyChar     Key Modifiers
-------     --- ---------
      5 NumPad5         0

Mira, estamos obteniendo la información sobre la tecla presionada. Ahora, intente recordar dónde aprendimos que el argumento $true se pasa al método ReadKey() cuando no queremos mostrar los datos sobre la tecla presionada en la consola, pero el ejemplo anterior se comporta de manera completamente diferente; ¿por qué?

Esto se debe a que cualquier expresión o comando que genere o devuelva algunos datos se muestra implícitamente en el flujo de salida (también llamado flujo de éxito), que va al host de forma predeterminada, una terminal (ventana de consola) en la que se ejecuta la sesión de PowerShell.

Debemos suprimirlo si no queremos generar esos datos. Para suprimir, tenemos varias opciones, que incluyen ... | Out-Null, ... > $null, [void] (...) y $null=.... Entonces, usamos [void] para suprimir los datos devueltos por [System.Console]::ReadKey($true). Tenga en cuenta que [void] representa la intención de suprimir una salida por adelantado.

Ahora, piense en una situación en la que tenemos que mostrar la tecla presionada y los datos relevantes, que se almacenan en forma de un objeto System.ConsoleKeyInfo. En ese caso, usamos el siguiente comando.

Utilice el método ReadKey():

[Console]::ReadKey()

PRODUCCIÓN :

g
KeyChar Key Modifiers
------- --- ---------
      g   G         0

Usando el método RawUI.ReadKey()

Para habilitar presione cualquier tecla para continuar en PowerShell:

  • Utilice Write-Host para escribir un mensaje fácil de usar.
  • Utilice RawUI.ReadKey() para leer la pulsación de tecla desde el dispositivo de teclado.

Utilice el método RawUI.ReadKey():

Write-Host -NoNewLine 'Press any key to continue...';
$Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown');

PRODUCCIÓN :

Press any key to continue...
VirtualKeyCode Character ControlKeyState KeyDown
-------------- --------- --------------- -------
           104         8       NumLockOn    True

Aquí, utilizamos el cmdlet Write-Host para mostrar un mensaje fácil de usar en la consola de PowerShell y guiar al usuario sobre lo que se supone que debe hacer.

A continuación, utilizamos el parámetro -NoNewLine para concatenar el objeto de entrada para formar una salida. No se insertarán nuevas líneas ni espacios entre las cadenas de salida. Del mismo modo, no se agregará ninguna línea nueva después de la última cadena de salida.

Después de eso, usamos el método $Host.UI.RawUI.ReadKey(), que es similar al método [Console]::ReadKey() que aprendimos en el sección anterior. Puede aceptar cualquier tecla, incluso teclas modificadoras, que incluyen Ctrl, Shift, Alt y otras teclas modificadoras.

Tenga en cuenta que podemos usar RawUI.ReadKey() con y sin ReadKeyOptions, que incluye IncludeKeyDown, IncludeKeyUp, NoEcho y PermitirCtrlC. Entonces, para el ejemplo de código anterior, usamos ReadKey() con ReadKeyOptions y obtuvimos datos como salida que se guardan en forma de objeto KeyInfo.

Si está interesado en más detalles técnicos, déjeme decirle que $Host.UI es un objeto System.Management.Automation.Internal.Host.InternalHostRawUserInterface. Por el contrario, $Host es una variable automática cuyo tipo es System.Management.Automation.Internal.Host.InternalHost. Por lo tanto, podemos usar el comando $Host.GetType().FullName para conocer el tipo de la variable $Host.

Usando el comando cmd /c pausa

Utilice el comando cmd /c pausa para habilitar presione cualquier tecla para continuar en PowerShell.

Utilice el comando cmd /c pausa:

cmd /c pause

PRODUCCIÓN :

Press any key to Continue

El comando anterior habilitó y mostró Presione cualquier tecla para continuar... y espere a que el usuario presione cualquier tecla. Regresa una vez que el usuario presiona cualquier tecla, excluidas las teclas modificadoras.

Usando el comando timeout /t

Utilice el comando timeout /t para habilitar presione cualquier tecla para continuar y espere la cantidad especificada de segundos o la entrada del usuario en PowerShell.

Utilice el comando timeout /t:

timeout /t 10

PRODUCCIÓN :

Waiting for 10 seconds, press a key to continue ...

El comando timeout anterior detuvo la ejecución durante un período de tiempo o un tiempo infinito. Aquí usamos /t para especificar el tiempo en segundos. Tenga en cuenta que el tiempo dado debe estar entre el rango -1 a 99999. Entonces, por ejemplo, el comando anterior esperará 10 segundos si no se presiona ninguna tecla.

Podemos usar el siguiente comando para seguir esperando un tiempo infinito hasta que el usuario presione cualquier tecla excluyendo Fn, Ctrl y Alt, etc.

Utilice el comando timeout /t:

timeout /t -1

Se trata de cómo presionar cualquier tecla para continuar en PowerShell.

Artículos relacionados