Leer la entrada del usuario

Mantenido el

A veces quieres que un archivo por lotes pida un dato al usuario mientras se ejecuta, por ejemplo un nombre de usuario o el nombre de la carpeta que se va a procesar.

En el Símbolo del sistema y en los archivos por lotes puedes leer una cadena del teclado con set /p. Aquí verás el uso básico y después patrones prácticos, como comprobar que no se haya dejado la entrada vacía y volver a preguntar cuando el dato no es válido.

Uso básico de set /p

set /p usa la siguiente sintaxis.

set /p variable=mensaje que se muestra

Después de mostrar el mensaje, el usuario escribe un valor y pulsa Enter, y la cadena escrita se guarda en la variable indicada.

input.cmd
@echo off
setlocal

set /p name=Escribe tu nombre:
echo Hola, %name%

endlocal
pause

Al ejecutarlo, queda esperando la entrada como se muestra a continuación.

- □ ×
Ícono de la consola de comandos
Consola de comandos
Microsoft Windows [Version xx.x.xxxxx.xxx]
(c) 2026 Ribbit App Development All rights reserved.
 
C:\users\user>input.cmd
Escribe tu nombre:Ana
Hola, Ana
C:\users\user>

Puedes consultar la cadena escrita con %name%, igual que cualquier otra variable. Para más información sobre las variables, consulta el siguiente artículo.

Añadir un espacio al final del mensaje

Todo lo que va después del = se muestra tal cual. Un espacio final es fácil de pasar por alto en el editor y, sin él, el cursor queda pegado al mensaje.

Si encierras entre comillas dobles el nombre de la variable y todo el mensaje, la presencia del espacio se ve claramente.

set /p "name=Escribe tu nombre: "

Las comillas no se muestran. Los ejemplos siguientes usan este estilo.

Detectar una entrada vacía (solo pulsar Enter)

Lo más importante que debes tener en cuenta con set /p es esto: si el usuario pulsa Enter sin escribir nada, la variable no se vacía, sino que conserva su valor anterior.

@echo off
setlocal

set "name=desconocido"
set /p "name=Escribe tu nombre: "
echo [%name%]

endlocal
- □ ×
Ícono de la consola de comandos
Consola de comandos
Microsoft Windows [Version xx.x.xxxxx.xxx]
(c) 2026 Ribbit App Development All rights reserved.
 
C:\users\user>input.cmd
Escribe tu nombre:
[desconocido]
C:\users\user>
おすすめ書籍※ 広告を含む場合があります
中小企業経営者のためのRPA入門 RPA導入を成功させる方法

中小企業経営者のためのRPA入門 RPA導入を成功させる方法

60分でわかる! AIエージェント 超入門

60分でわかる! AIエージェント 超入門

コマンドラインの黒い画面が怖いんです。

コマンドラインの黒い画面が怖いんです。

知識・才能ゼロでもらく~に月10万円稼ぐ! よくわかるAI副業超入門

知識・才能ゼロでもらく~に月10万円稼ぐ! よくわかるAI副業超入門

Puedes aprovechar este comportamiento para definir un valor predeterminado. En el ejemplo anterior, el valor inicial de name (desconocido) actúa como valor predeterminado.

Si, en cambio, quieres detectar que no se escribió nada, vacía la variable antes de preguntar. Después puedes comprobar si está vacía con if not defined.

@echo off
setlocal

set "name="
set /p "name=Escribe tu nombre: "

if not defined name (
  echo No se ha escrito ningún nombre.
  exit /b 1
)

echo Hola, %name%

endlocal

Al escribir set "name=", sin nada a la derecha del =, la variable se elimina.

Vacía la variable antes de preguntar

Si ya existe una variable de entorno con el mismo nombre, pulsar solo Enter deja ese valor intacto. Cuando necesites detectar una entrada vacía, vacía siempre la variable con set "nombre_de_variable=" antes de set /p.

Validar la entrada

Confirmar con S/N

Este ejemplo continúa solo si el usuario escribe s. La opción /i hace que la comparación no distinga entre mayúsculas y minúsculas, de modo que s y S se tratan igual.

@echo off
setlocal

set "answer="
set /p "answer=¿Ejecutar el proceso? (s/n): "

if /i not "%answer%"=="s" (
  echo Cancelado.
  exit /b 1
)

echo Ejecutando el proceso.

endlocal

Para conocer los detalles del comando if, consulta el siguiente artículo.

Si solo necesitas la pulsación de una tecla, el comando choice es más adecuado. No requiere Enter y rechaza cualquier carácter que no hayas permitido.

Comprobar que la entrada es un número

Antes de hacer cálculos con set /a, puede que quieras confirmar que la entrada contiene solo dígitos. Para ello puedes usar una expresión regular con findstr.

@echo off
setlocal

set "num="
set /p "num=Escribe un número: "

echo %num%| findstr /r "^[0-9][0-9]*$" > nul
if errorlevel 1 (
  echo Eso no es un número.
  exit /b 1
)

set /a result=num * 2
echo El doble de %num% es %result%.

endlocal

No hay un espacio antes de | en echo %num%| porque ese espacio pasaría a formar parte de la cadena que recibe findstr e impediría que coincida con ^[0-9][0-9]*$.

Esta comprobación no revisa la cantidad de dígitos ni el rango. Además, un número que empieza por 0, como 08, se trata como octal en set /a y provoca un error.

findstr devuelve 0 como código de salida cuando encuentra una coincidencia y 1 cuando no. Para saber más sobre cómo comprobar los códigos de salida, consulta los siguientes artículos.

Volver a preguntar hasta que la entrada sea válida

Si prefieres volver a preguntar en lugar de terminar con un error, usa goto para saltar de nuevo a una etiqueta.

@echo off
setlocal

:INPUT
set "dir="
set /p "dir=Escribe la carpeta de destino: "

if not defined dir goto INPUT

if not exist "%dir%\" (
  echo La carpeta "%dir%" no existe.
  goto INPUT
)

echo Procesando "%dir%".

endlocal

La comprobación de la carpeta usa if exist "%dir%\" con una \ final. Sin ella, la condición también sería verdadera si existiera un archivo con el mismo nombre.

Cuando la entrada contiene caracteres especiales

set /p guarda en la variable la cadena escrita tal cual. Caracteres como & y | no suponen un problema en ese momento.

El problema aparece cuando expandes el valor guardado con %name%. Como %name% se expande antes de analizar la línea, cualquier &, |, > o < del valor se interpreta como separador de comandos o como redirección.

Para tratar esa entrada de forma segura, encierra la variable entre comillas dobles o usa la expansión retardada. Las comillas no sirven si la propia entrada contiene un ".

@echo off
setlocal enabledelayedexpansion

set "text="
set /p "text=Escribe un texto: "

echo !text!

endlocal

La expansión retardada (!text!) expande el valor después de analizar la línea, por lo que caracteres como & no dividen el comando. Sin embargo, pasar una cadena con ! o ^ a otra variable o a call con la expansión retardada activada puede romperla. Si necesitas manejar cadenas realmente arbitrarias, considera usar otro lenguaje como PowerShell.

Ocultar la entrada y evitar el salto de línea

Escribir una contraseña

El texto escrito en un set /p se muestra en pantalla tal cual. No es adecuado para algo como una contraseña y no hay una forma sencilla de enmascarar la entrada solo con comandos de archivo por lotes.

Si realmente lo necesitas, considera otra solución, como Read-Host -AsSecureString de PowerShell. También es mejor evitar escribir contraseñas en texto plano en un archivo por lotes.

Mostrar un mensaje sin salto de línea

set /p también se usa para mostrar un mensaje sin esperar entrada. Si indicas nul como origen de la entrada, imprime el mensaje sin salto de línea y sin esperar.

<nul set /p "=Procesando..."
echo Listo
- □ ×
Ícono de la consola de comandos
Consola de comandos
Microsoft Windows [Version xx.x.xxxxx.xxx]
(c) 2026 Ribbit App Development All rights reserved.
 
C:\users\user>sample.cmd
Procesando…Listo
C:\users\user>

Como echo siempre termina con un salto de línea, esto es útil cuando quieres que la siguiente salida continúe en la misma línea.

Cuando el script se queda esperando la entrada

set /p espera al usuario indefinidamente. Si ejecutas el archivo por lotes en un entorno donde nadie está frente al teclado, como el Programador de tareas, puede que nunca termine.

Si el archivo por lotes también puede ejecutarse sin supervisión, acepta el valor como argumento y pregunta solo cuando falte. Así funcionan ambos casos.

@echo off
setlocal

set "name=%~1"
if not defined name set /p "name=Escribe tu nombre: "

echo Hola, %name%

endlocal

Si se pasa un argumento, se usa ese. La pregunta aparece solo cuando no se pasó ningún argumento.

Revisar varias entradas a la vez

Cuando pidas muchos valores, muestra al final todo lo que el usuario escribió y continúa solo si escribe s. Esto reduce los errores causados por erratas.

Preguntas de práctica

Pregunta 1

¿Qué le ocurre a la variable cuando el usuario pulsa solo Enter en un set /p?

回答がサーバーに送信されることはありません
Pregunta 2

¿Qué opción es la más adecuada cuando quieres que el usuario elija pulsando una sola tecla, s o n, sin pulsar Enter?

回答がサーバーに送信されることはありません
#Símbolo del sistema #Archivos por lotes #set #Entrada #Comandos