Script batch que no se cierra estilo Saw

Iniciado por alvarillolag, 24 Febrero 2014, 21:01 PM

0 Miembros y 1 Visitante están viendo este tema.

alvarillolag

Buenas a todos, soy nuevo en la comunidad y no sé si el tema está bien situado, creo que sí. Allá vamos con la idea:
Estudio el primer curso de grado medio de sistemas microinformáticos y acabamos de comenzar con el tema de comandos en el cmd y básicos scripts. Se me ha ocurrido una idea para experimentar un poco más allá del nivel que nos dan en clase (bastante básico) y hacer por pura curiosidad y sin intención de fastidiar a nadie un script que sea una especie de juego al estilo Saw en el que debas ir completando pruebas para que no haya consecuencias. La primera 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. Repito, mi intención no es dañar a nadie, sólo quiero experimentar un poco con las posibilidades de este método básico de programación. Espero que me podáis ayudar con este miniproyecto que se me ha ocurrido para rellenar los tiempos muertos! Gracias de antemano!

Eleкtro

#1
EDITO:
Lo siento pero no podia quedarme de brazos cruzados sin opinar sobre esta frase:
CitarEstudio 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.






Cita de: alvarillolag en 24 Febrero 2014, 21:01 PMduda 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.

Código (dos) [Seleccionar]
@Echo OFF & TITLE Closable-Script

If "%IsFirstRun%" EQU "" (
SETX "IsFirstRun" "True" 1>NUL
Echo Esta es la primera ejecución del Script.

) Else (
Echo Esta no es la primera ejecución del Script.

)

Pause&Exit




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!








fary

En realidad Elektro, no se aprenden batch en sí, sino comandos del sistema y algunos scripts orientados a la automatización de tareas.

Alvarillo de recomiendo que si te gusta la programación empieces con algún lenguaje de programación real.
Un byte a la izquierda.

alvarillolag

Vaya no me esperaba una crítica tan rotunda jajaja. Como comenta el segundo compañero lo que me han enseñado es la automatización de tareas básicas del PC. Estoy metido en el grado medio porque no quiero hacer bachillerato y de momento no tengo tampoco planeado hacer la carrera de programación ya que las mates no son mi fuerte y además no quiero centrarme en programación únicamente. Lo más seguro es que continúe con un grado superior de desarrollo de aplicaciones multiplataforma.
La verdad es que no tengo experiencia ninguna con lenguajes de programación y usar una cosa que no fuera batch me echaba para atrás por mi condición de absoluto novato. Ya que habéis desechado totalmente la efectividad del batch, que lenguaje me recomendáis? La idea además de que detecte que se cierre y ejecute consecuencias es que tengas pruebas para que tu PC "sobreviva" y tengas que ir haciendo elecciones lógicas para salvarlo (algo que tenía pensado con el comando choice y el if y demás condicionales). Vamos, trasladar los métodos de Jigsaw y sus lógicas macabras a un juego sencillito de ordenador. No creo que tenga tanta dificultad hacer esto y la verdad quiero proponérmelo como reto personal para compaginar con las clases que resultan bastante básicas en este primer curso.

ivancea96

Cita de: Eleкtro en 25 Febrero 2014, 08:34 AM
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.

En realidad, me parece lo más normal. Batch puede ayudar mucho en la comprensión de un futuro lenguaje. Especialmente, si empiezas de 0.

Lo que me parece algo extraño, es que empiézen tan tarde a estudiarlo. ¿Es el segundo trimestre por ahí ya, no?

Quizás se pasen más tiempo con eso, redes, sistemas, y otras variedades jaja.

alvarillolag

Cita de: ivancea96 en 25 Febrero 2014, 21:19 PM
En realidad, me parece lo más normal. Batch puede ayudar mucho en la comprensión de un futuro lenguaje. Especialmente, si empiezas de 0.

Lo que me parece algo extraño, es que empiézen tan tarde a estudiarlo. ¿Es el segundo trimestre por ahí ya, no?

Quizás se pasen más tiempo con eso, redes, sistemas, y otras variedades jaja.
Realmente era un tema del primer trimestre pero decidió pasarlo al segundo y explicar antes el tema de directivas de grupo, registro,sucesos y servicios,etc