Leer la entrada del usuario
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.
@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.
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

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

60分でわかる! 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.
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
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.
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.