EDITO:Lo siento pero no podia quedarme de brazos cruzados sin opinar sobre esta frase:
Estudio el primer curso de grado medio de sistemas microinformáticos y acabamos de comenzar con el tema de comandos en el cmd
Yo soy autodidacta, es decir no se muy bien como son los ciclos ni tampoco tengo conocimiento de si esa práctica de enseñanza de Batch es normal en los ciclos de 'sistemas microinformáticos' pero si no me equivoco hay un tema para el desarrollo de Software ...así que lo diré sin rodeos:
En mi opinión ese curso es una estafa y muy poco profesional, con comanditos por Batch no vas a aprender nada de nada, eso no es programación, te están enseñando lo que deberían haberte enseñado en parbularios, Batch no te da una base de programación porque no cumple los standards de lo que se considera un buen lenguaje de programación de hoy en día, por no tener no tiene ni objetos ni métodos ni arrays, es un ""lenguaje"" limitado, retrasado.
...y para salir de cualquier apuro en Windows, siempre puedes recurrir a cualquiera de los otros 3 lenguajes integrados natívamente (VisualBasicScript, javascript y Powershell), que son infinítamente mejores y más aptos.
Así pues, que me digas que te gustaría crear un juego en Batch '
para matar el tiempo'... yo antes que eso te recomendaría el suicidio, abre los ojos, no sigas perdiendo el tiempo.
En fín, que en un curso de grado
MEDIO me digas que se ponen a enseñar comandos de Batch (e imagino que además evaluarán dicho conocimiento adquirido) me parece algo indignante, tenía que decirlo.
duda que me asalta es sobre la posibilidad de hacer un script que no se pueda cerrar normalmente, es decir que al cerrarlo se reabra y detecte que se ha cerrado para ejecutar una consecuencia. Sé que se puede hacer porque una vez me infectaron con un virus que hacía esto.
1. Batch es lo más básico de todo, es básico y simple, tiene poca utilidad y no se pueden hacer grandes cosas (yo no lo considero ni un lenguaje), batch es programación para novatos, no un lenguaje para grandes expectativas ni mucho menos está pensado para desarrollar juegos o tareas con un cierto grado de complejidad, hazte a la idea ya.
2. El script es símplemente un archivo de texto plano, no puedes manejar ningún evento de cierre del intérprete de lenguaje (quiero decir, de la CMD), no puedes saber si se intenta cerrar, si se ha cerrado, o si se intenta abrir.
Por otro lado hay muchas formas de intentar deducir si el proceso se ha cerrado o se ha matado, por ejemplo monitorizando
DESDE OTRO PROCESO (otro script) el estado de ejecución del primer proceso, así pues, si el proceso no se está ejecutando quiere decir que se ha cerrado o se ha matado, es pura lógica, una técnica de deducción,
pero no hay que caer en el error de confundir una simple técnica de deducción con cierto grado de eficiencia, con poder determinar a ciencia exacta si un proceso se mató o se cerró, lo que hayas visto en ese virus que comentas, en el caso de ser un Script Batch solo sería una técnica de deducción más, y en el caso de ser un programa compilado segúramente haya interceptado/manejado los eventos de cierre de su formulario para saber si el programa se cierra, y volverse a ejecutar, algo que es muy facil de hacer en cualquier otro lenguaje.
En resumen, lo cierto es que el cierre no es algo que se pueda controlar de forma natural en Batch.
3. Cualquier proceso (en este caso CMD.exe) puede ser matado de forma forzosa, esto quiere decir que el OS no da una razón de cierre al proceso y ...lo mata (no lo cierra), la ejecución termina por completo sin poder realizar una verificación de que el proceso está siendo cerrado por "X" razón. No hay forma de verificar un cierre forzoso, solo se pueden usar técnicas de deducción que al fin y al cabo son solo eso, deducciones ...aunque eficazes, pero óbviamente hablo de otros lenguajes, jamás podrás hacer algo eficiente usando puro Batch.
En Batch, si quieres algo facil podrías hacer es una especie de verificación '
First Run', ya sea mediante una clave almacenada en el Registro de Windows, un archivo de texto, o una variable de entorno, y verificar la existencia del valor de ese parámetro "First Run" al inicio del script, para deducir si fue cerrado o no.
If "
%IsFirstRun%"
EQU ""
( SETX "IsFirstRun" "True" 1
>NUL Echo Esta es la primera ejecución
del Script.
Echo Esta no es la primera ejecución
del Script.
)
Si quieres algo más complejo, puedes generar un script secundario al inicio de tu script, un script secundario con las instrucciones necesarias que se encargaría de comprobar el handle y el título de la ventana del proceso que ejecutó tu primer script para comprobar cada "X" segundos si ese proceso sigue ejecutándose o no (lo que comenté en el punto nº2), es una técnica de deducción sencilla, pero esto no puedes hacerlo de forma nativa en Batch ya que ni el comando WMIC no te muestran los títulos de cada ventana así que necesitarías recurrir a aplicaciones de terceros (Ej: CMDOW) para obtener esa información, es una pérdida de tiempo.
Este script requiere la aplicación externa CMDOW, aunque podrías hacer lo mismo con el comando Tasklist de Batch, o con una query de WMI usando VBS, pero he preferido usar CMDOW porque el comando TaskList tiene un retardo aproximado de 10 segundos (lo que tarda en actualizarse) y para no complicar más el código al hacerlo más híbrido de lo que ya es con esa instrucción que escribí de VBS.
@Echo OFF & TITLE Unclosable-Script
:: By Elektro
REM La ubicación del script temporal que servirá como monitorizador de este script.
Set "MonitorFilepath=%TEMP%\CMDMonitor.cmd"
REM Si no existe el script monitor, lo creo y lo ejecuto...
If Not exist "%MonitorFilepath%" (
Call :StartMonitorScript "%~0"
)
REM Ya estamos listos para jugar.
Echo Intenta cerrarme! :D | MORE
Echo Intento de cierres: %1 | MORE
Pause&Exit
REM Métodos
:StartMonitorScript
(
Echo @Echo OFF ^& Title CMD Monitor
Echo REM El resultado del monitor. ^(0=False, 1=True^)
Echo Set /A "ProcessIsTerminated=0"
Echo Set /A "ClosingCount=0"
Echo+
Echo :MonitorLoop
Echo CMDOW.exe ^| Find /I "Unclosable-Script" ^&^& ^(
Echo Set /A "ProcessIsTerminated=0"
Echo ^) ^|^| ^(
Echo Set /A "ProcessIsTerminated=1"
Echo Set /A "ClosingCount+=1"
Echo ^)
Echo+
Echo If %%ProcessIsTerminated%% EQU 1 ^(
Echo Start "Reinitialize Unclosable-Script" CMD.exe /K %* %%ClosingCount%%
Echo ^)
Echo+
Echo Ping.exe -n 2 LocalHost 1^>NUL
Echo Goto :MonitorLoop
)>"%MonitorFilepath%"
(
Echo WScript.CreateObject^("WScript.Shell"^).Run """%MonitorFilepath%""", 0, False
)>"%MonitorFilepath%.vbs"
Start /B "Run Hidden" WScript.exe "%MonitorFilepath%.vbs"
Goto:EOF
De todas formas pienso que deberías invertir tu tiempo en cosas más productivas, en un lenguaje de verdad ...al menos para llevar a cabo este tipo de tareas, batch está bien para automatizar tareas cotidianas del PC, pero nada más.
Un saludo!