2009-11-25 10 views
58

Tengo un archivo de proceso por lotes que automatiza la copia de varios archivos de un lugar a otro y de nuevo para mí. Lo único es tanto como lo que me ayuda. Sigo seleccionando accidentalmente ese comando fuera de mi búfer de comando y sobrescribiendo en masa los cambios sin compromiso.¿Cómo puedo hacer un aviso "¿estás seguro?" En un archivo por lotes de Windows?

¿Qué código necesitaría para mi archivo .bat para que dijera "¿estás seguro?", Y ¿me harías escribir "y" antes de ejecutar el resto del archivo? Si se escribe algo que no sea "y", debe salir de la ejecución en esa línea.

Editar 27 de noviembre Ok He marcado esto sin respuesta de nuevo porque todavía no lo puedo descifrar. Cuando llamo "salir"; cierra cmd.exe que no es lo que quiero. Todo esto porque Windows implementó el búfer de comando incorrecto [de manera diferente a lo que estoy acostumbrado al menos]

Respuesta

106

¿Quieres algo como:

@echo off 
setlocal 
:PROMPT 
SET /P AREYOUSURE=Are you sure (Y/[N])? 
IF /I "%AREYOUSURE%" NEQ "Y" GOTO END 

echo ... rest of file ... 


:END 
endlocal 
+1

Lo único que agregaría es un 'SET AREYOUSURE = N' adicional antes del aviso para borrar la opción si ya ejecutó el script antes en esa ventana de comando. Sin él, el valor predeterminado seguirá siendo la opción seleccionada previamente. – isapir

+2

@Igal Estoy bastante seguro de que el 'setlocal' y el' endlocal' deberían encargarse de eso. '% AREYOUSURE%' ya no existirá después del 'endlocal'. –

+1

@dudeprgm, probablemente tengas razón. Creo que los extrañé en mi código. – isapir

21

prueba el CHOICE command, p.

CHOICE /C YNC /M "Press Y for Yes, N for No or C for Cancel." 
+5

Aunque esto es relativamente nuevo. Se agregó en MS-DOS 6 en 1993 o 1994, por lo que puede no funcionar con todas las implementaciones

+2

Lo probé en Windows 8 y puedo confirmar que funciona. – Genhis

+3

ejemplo de cómo usar realmente la opción aquí http://www.computerhope.com/issues/ch001674.htm –

11

El comando choice no está disponible en todas partes. Con las nuevas versiones de Windows, el comando set tiene la opción /p puede obtener la entrada del usuario

SET /P variable=[promptString] 

ver set /? para obtener más información

+0

+1 elección ni siquiera funciona en Windows 2000 – YOU

+0

... mucho más perspicaz que la aceptada, pero obviamente vivimos en tiempos urgentes. – Wolf

0

Aquí un poco más fácil:

@echo off 
set /p var=Are You Sure?[Y/N]: 
if %var%== Y goto ... 
if not %var%== Y exit 

o

@echo off 
echo Are You Sure?[Y/N] 
choice /c YN 
if %errorlevel%== Y goto ... 
if %errorlevel%== N exit 
+0

'if% errorlevel% == Y' ?? ¿Me he perdido algo? – Stephan

+0

después de que Y ponga el comando que desea que suceda. Eso es lo que ... son para :) –

+0

Quise decir: '% errorlevel%' siempre es un valor entero. Consulte [aquí] (https://ss64.com/nt/choice.html) para obtener documentación, incluido un ejemplo. – Stephan

0

Si desea que el programa por lotes salga nuevamente al mensaje y no cierre el aviso (A.K.A cmd.exe) puede usar "exit/b".

Esto puede ayudar.

set /p _sure="Are you sure?" 
::The underscore is used to ensure that "sure" is not an enviroment 
::varible 
if /I NOT "_sure"=="y" (
::the /I makes it so you can 
exit /b 
) else (
::Any other modifications... 
) 

O si no desea utilizar la mayor cantidad de líneas ...

Set /p _sure="Are you sure?" 
if /I NOT "_sure"=="y" exit /b 
::Any other modifications and commands. 

Espero que esto ayude ...

Cuestiones relacionadas