Página 1 de 1

No Me Funcina Este Codigo

Publicado: 19 Mar 2012, 01:31
por nelson13
Hola ando necesitando un scpit para programar tareas, asique a lo primero que recurri es al foro :smt003
Encontre el siguiente post: http://www.emesn.com/autoitforum/viewtopic.php?f=4&t=52 y me encanto,
El problema es que le hize algunas modificaciones y desde la tarde no me funciono mas.
Asique volvi al codigo original pero este tampoco me funciono mas. Reinstale autoit y nada, incluso probe con otra PC.
la verdad creo que es un codigo muy complejo par mi que estoy inicinadome en esto. :smt021
si alguin me puede dar una mano estare muy agradecido.
El codigo que modifique y le quite funciones no lo tengo mas, lo borre de gusto pensando que yo lo habia estropeado.
el codigo original es:
#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_outfile=Cron 64 bits.exe
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_UseX64=y
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

#cs
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Juan Luis Rodríguez González
CRON 0.2.1.11
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
¿Qué es Cron?
-------------
Cron (el nombre es una reliquia UNIX) es un proceso que se inicia cuando
su máquina arranca y nunca se detiene hasta que se apaga. Durante su
existencia, comprueba los contenidos de cierto fichero cada minuto (puede
cambiar fácilmente la granularidad del tiempo, por ejemplo a 5 minutos). Si
encuentra que la hora y fecha actuales coinciden con una entrada en el
fichero, Cron inicia el proceso mencionado en el fichero.

Esto suena aburrido, pero en la práctica, Cron es la herramienta más útil de
planificar tareas repetitivas que he encontrado nunca.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

El fichero CRONTAB.TXT

m h d m s comando [|| parametros]
m = minutos 0 a 59
h = horas 0 a 59
d = dia del mes 1 a 31
m = nº de mes 1 a 12
s = nº semana 1 = Lunes 7y0= Domingo
comando = lo que quieras que se ejecute
parametros

$minuto $hora $dia_mes $mes $dia_semana Comando [|| parametros]

Hay dos comodines:
* significa que se cumple siempre
I que se cumple cuando coincide con la ejecución de CRON
/ indica el incremento (solo se puede usar una vez por linea)

Añadido comandos internos
:kill <proceso> cierra el proceso ej: :kill iexplore.exe cierra el intene explores
:off Apaga el ordenador
:exit cierra cron
:reboot reinicia el ordenador
:beep <frecuencia> <duración en milesimas de segundo> ej: :beep 500 1000
:play <nombre de archivo de sonido> ej: :play c:\windows\media\tada.wav
() titulo () texto ;mensaje emerjente ej: () Alerta () Este es un mensaje de prueva||Esta es otra linea

Añadigo multiples, rango y balor de incremento

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
opciones aun no soportadas
coma para valore multibles ej: 1,2 * * * * comando
y guión para rangos ej: 2-5 * * * * comando
añadir más comandos internos
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#ce

;Opt("RunErrorsFatal", 0)


;--------- Archivo de registro ------------
$fileReg = FileOpen("reg.log", 1)
If $fileReg = -1 Then
MsgBox(0, "Error", "No se puede abrir archivo.")
EndIf
FileWriteLine($fileReg, "")
FileWriteLine($fileReg, "Comienzo de Cron ( " & @HOUR & ":" & @MIN & " " & @MDAY & " de " & @MON & " de " & @YEAR & " )")
FileWriteLine($fileReg, "-------------------------------------------")
FileClose($fileReg)
;----------------------------------------
$segundos = 0
$y = 0
Dim $subcom[6]
$subcom[0] = 0
$subcom[1] = 0
$subcom[2] = 0
$subcom[3] = 0
$subcom[4] = 0
$subcom[5] = 0

;--------- Variables para el comodin (I)------------
$Iminutos = Number(@MIN)
$Ihoras = Number(@HOUR)
$Imes = Number(@MON)
$Idia_mes = Number(@MDAY)
$Idia_semana = Number(@WDAY) - 1
;--------------------------------------------------

;--------- Bucle principal de la aplicación-------------
While 1
Dim $par[6]
$minutos = Number(@MIN)
$par[1] = Number(@MIN)
$horas = Number(@HOUR)
$par[2] = Number(@HOUR)
$mes = Number(@MON)
$par[3] = Number(@MON)
$dia_mes = Number(@MDAY)
$par[4] = Number(@MDAY)
$dia_semana = Number(@WDAY) - 1
$par[5] = Number(@WDAY)
$espera = 60000
abrir() ; abrir y ejecutar fichero CRONTAB.TXT
;------------- reaguste de tiempos ------------
$segundos = (@SEC) * 1000
;If 0 < @SEC Then
; $segundos = (@SEC) * 1000
;EndIf
$espera = $espera - $segundos
;----------------------------------------------
Sleep($espera); pausa 60 segundos 1 minuto
WEnd

;--------- abrir y ejecutar fichero CRONTAB -----------
Func abrir()
$file = FileOpen(".CRONTAB", 0);Lo intenta con la extensión CRONTAB
; Revisa si el archivo está listo para abrir
If $file = -1 Then
$file = FileOpen("CRONTAB", 0);Lo intenta sin la extensión TXT
If $file = -1 Then
$file = FileOpen("CRONTAB.txt", 0);Lo intenta con la extensión TXT
If $file = -1 Then
MsgBox(0, "Error", "Archivo CRONTAB no se pudo abrir.")
Exit; Sale de la aplicación
EndIf
EndIf
EndIf

; Lee líneas de texto hasta que aparece EOF (End Of File= Fin de Archivo)
While 1
$line = FileReadLine($file)
If @error = -1 Then ExitLoop
$primero = StringMid($line, 1, 1);saca el primer caracter para comprobar comentarios
;compara el primer carancter si es un numero o comodin pasa a FunRum
If StringIsDigit($primero) Or StringInStr($primero, "*") Or StringInStr($primero, "I") Or StringInStr($primero, "i") = 1 Then
FunRum($line)
EndIf
WEnd
$subcom[0] = 0
FileClose($file)
EndFunc ;==>abrir


Func FunRum($line)

$line = StringStripWS($line, 4);Reduce espacios
;divide linea $parametros[1]=$minuto $parametros[2]=$hora $parametros[3]=$dia_mes $parametros[4]=$mes $parametros[5]=$dia_semana $parametros[6..]=comando
$parametros = StringSplit($line, " ")
;---------- Proceso del comodin (I) -----------------
If $parametros[1] = "I" Or $parametros[1] = "i" Then
$parametros[1] = $Iminutos
EndIf
If $parametros[2] = "I" Or $parametros[2] = "i" Then
$parametros[2] = $Ihoras
EndIf
If $parametros[3] = "I" Or $parametros[3] = "i" Then
$parametros[3] = $Idia_mes
EndIf
If $parametros[4] = "I" Or $parametros[4] = "i" Then
$parametros[4] = $Imes
EndIf
If $parametros[5] = "I" Or $parametros[5] = "i" Then
$parametros[5] = $Idia_semana
EndIf
If Number($parametros[5]) = 0 And StringMid($parametros[5], 1, 1) <> "*" Then
$parametros[5] = 7
EndIf
If $dia_semana = 0 Then
$dia_semana = 7
EndIf
If $par[5] = 0 Then
$par[5] = 7
EndIf
;---------------------------------------------------
Dim $multiples[6]
Dim $rango[6]
$subcom[0] = 0
$subcom[1] = 0
$subcom[2] = 0
$subcom[3] = 0
$subcom[4] = 0
$subcom[5] = 0
For $p = 1 To 5
If StringInStr($parametros[$p], ",") Then
;multiples
$mul = StringSplit($parametros[$p], ",")
For $p2 = 1 To $mul[0]
;
If Number($mul[$p2]) = $par[$p] Then
$multiples[$p] = 1
EndIf
Next
Else
If StringInStr($parametros[$p], "-") Then
;rango
$ran = StringSplit($parametros[$p], "-")
If Number($ran[1]) >= $par[$p] And Number($ran[2]) <= $par[$p] Then
$rango[$p] = 1
EndIf
EndIf
EndIf

;---------------------- Incremento -----------------------
If StringInStr($parametros[$p], "/") > 0 Then ;1
$ss = StringSplit($parametros[$p], "/")
If $minutos = 0 Then
$minutos = 60
EndIf
If $par[1] = 0 Then
$par[1] = 60
EndIf
If Number($horas) = 0 Then
$horas = 24
EndIf
If $par[2] = 0 Then
$par[1] = 24
EndIf
If Mod($par[$p], Number($ss[2])) = 0 Then
$subcom[$p] = 0
Else
$subcom[$p] = 1
EndIf
If $minutos = 60 Then
$minutos = 0
EndIf
If $par[1] = 60 Then
$par[1] = 0
EndIf
If $horas = 24 Then
$horas = 0
EndIf
If $par[2] = 24 Then
$par[2] = 0
EndIf

Else
$subcom[$p] = 0
EndIf
;----------------------------------------------------------
;---------------------------------------------------------
Next
;---------- Comprobaciones -------------------------
If (Number($parametros[1]) = $minutos Or StringMid($parametros[1], 1, 1) = "*" Or $multiples[1] Or $rango[1]) And $subcom[1] = 0 Then
If (Number($parametros[2]) = $horas Or StringMid($parametros[2], 1, 1) = "*" Or $multiples[2] Or $rango[2]) And $subcom[2] = 0 Then
If (Number($parametros[3]) = $dia_mes Or StringMid($parametros[3], 1, 1) = "*" Or $multiples[3] Or $rango[3]) And $subcom[3] = 0 Then
If (Number($parametros[4]) = $mes Or StringMid($parametros[4], 1, 1) = "*" Or $multiples[4] Or $rango[4]) And $subcom[4] = 0 Then
If (Number($parametros[5]) = $dia_semana Or StringMid($parametros[5], 1, 1) = "*" Or $multiples[5] Or $rango[5]) And $subcom[5] = 0 Then
;ejecuta la expresión
correcto($parametros)
EndIf
EndIf
EndIf
EndIf
EndIf
$multiples = 0
$rango = 0
EndFunc ;==>FunRum

;----------------- todo correcto -----------------
Func correcto($parametros)
;------------------------------------------------
;- :kill <aplicación>
;- :off Apaga el ordenador
;- :exit cierra cron
;- :reboot reinicia el ordenador
;- ()titulo()texto ;mensaje emerjente
;------------------------------------------------
$parametros[6] = StringUpper($parametros[6])
Select
Case $parametros[6] = "()"
comando_interno($parametros)
Case $parametros[6] = ":kill"
$comando = $parametros[7]
$x = 8
While $x < UBound($parametros)
$comando = $comando & " " & $parametros[$x]
$x = $x + 1
WEnd
$fileReg = FileOpen("reg.log", 1)
If $fileReg = -1 Then
MsgBox(0, "Error", "No se puede abrir archivo.")
EndIf
FileWriteLine($fileReg, @HOUR & ":" & @MIN & " " & @MDAY & " de " & @MON & " de " & @YEAR & " | kill | " & $comando)
FileClose($fileReg)
While ProcessExists($comando)
;
ProcessClose($comando);------------------ cierra $comando
WEnd
Case $parametros[6] = ":off"
$fileReg = FileOpen("reg.log", 1)
If $fileReg = -1 Then
MsgBox(0, "Error", "No se puede abrir archivo.")
EndIf
FileWriteLine($fileReg, @HOUR & ":" & @MIN & " " & @MDAY & " de " & @MON & " de " & @YEAR & " | off")
FileClose($fileReg)
Shutdown(13);---------------- cierra y apaga
Case $parametros[6] = ":reboot"
$fileReg = FileOpen("reg.log", 1)
If $fileReg = -1 Then
MsgBox(0, "Error", "No se puede abrir archivo.")
EndIf
FileWriteLine($fileReg, @HOUR & ":" & @MIN & " " & @MDAY & " de " & @MON & " de " & @YEAR & " | reboot")
FileClose($fileReg)
Shutdown(6);------------------ reinicia
Case $parametros[6] = ":exit"
$fileReg = FileOpen("reg.log", 1)
If $fileReg = -1 Then
MsgBox(0, "Error", "No se puede abrir archivo.")
EndIf
FileWriteLine($fileReg, @HOUR & ":" & @MIN & " " & @MDAY & " de " & @MON & " de " & @YEAR & " | Exit")
FileClose($fileReg)
While ProcessExists(@ScriptName)
;--------------------------- Cierra procesos CRON
ProcessClose(@ScriptName)
WEnd
Case $parametros[6] = ":beep"
$fileReg = FileOpen("reg.log", 1)
If $fileReg = -1 Then
MsgBox(0, "Error", "No se puede abrir archivo.")
EndIf
FileWriteLine($fileReg, @HOUR & ":" & @MIN & " " & @MDAY & " de " & @MON & " de " & @YEAR & " | beep " & $parametros[7] & " " & $parametros[8])
FileClose($fileReg)
Beep($parametros[7], $parametros[8])
Case $parametros[6] = ":play"
$comando = $parametros[7]
$x = 8
While $x < UBound($parametros)
$comando = $comando & " " & $parametros[$x]
$x = $x + 1
WEnd
$fileReg = FileOpen("reg.log", 1)
If $fileReg = -1 Then
MsgBox(0, "Error", "No se puede abrir archivo.")
EndIf
FileWriteLine($fileReg, @HOUR & ":" & @MIN & " " & @MDAY & " de " & @MON & " de " & @YEAR & " | play | " & $comando)
FileClose($fileReg)
SoundPlay($comando)
Case Else
;
Local $comando[2]
$comando = unir_comando($parametros)
$fileReg = FileOpen("reg.log", 1)
If $fileReg = -1 Then
MsgBox(0, "Error", "No se puede abrir archivo.")
EndIf
FileWriteLine($fileReg, @HOUR & ":" & @MIN & " " & @MDAY & " de " & @MON & " de " & @YEAR & " | " & $comando[0] & " " & $comando[1])
FileClose($fileReg)
ShellExecute($comando[0], $comando[1]);---------- ejecuta parametros
EndSelect

EndFunc ;==>correcto


;------------- Une el resto de parametros de comando --------------
Func unir_comando($parametros)
;
Local $comando[2]
$comando[1] = " "
$xy = 0
$comando[$xy] = $parametros[6]
$x = 7
While $x < UBound($parametros)
If $parametros[$x] = "||" Then
$xy = 1
Else
$comando[$xy] = $comando[$xy] & " " & $parametros[$x]
EndIf
$x = $x + 1
WEnd
Return $comando
EndFunc ;==>unir_comando

Func comando_interno($parametros)
;
$titulo = $parametros[7]
$comodin = "no"
$x = 8
While $x < UBound($parametros)
If $comodin = "si" Then
$comando = $comando & " " & $parametros[$x]
Else
If $parametros[$x] <> "()" Then
$titulo = $titulo & " " & $parametros[$x]
EndIf
EndIf
If $parametros[$x] = "()" Then
$x = $x + 1
$comando = $parametros[$x]
$comodin = "si"
EndIf
$x = $x + 1
WEnd
$fileReg = FileOpen("reg.log", 1)
If $fileReg = -1 Then
MsgBox(0, "Error", "No se puede abrir archivo.")
EndIf
FileWriteLine($fileReg, @HOUR & ":" & @MIN & " " & @MDAY & " de " & @MON & " de " & @YEAR & " | " & $titulo & " |" & $comando)
FileClose($fileReg)

$comando = StringReplace($comando, "||", @CRLF)
MsgBox(0, $titulo, $comando, 15)


EndFunc ;==>comando_interno
Muchas Gracias de antemano

Re: No Me Funcina Este Codigo

Publicado: 20 Mar 2012, 09:55
por Ximorro
nelson13 por favor sigue las normas del foro y pon a la entrada un título significativo.

Además lo de soltar un código de más de 400 líneas y decir "no me funciona, arregladlo" no mola mucho. Como mínimo nos tendrías que decir en qué no te funciona, y más siendo que antes sí te funcionaba.
Esa versión compila a 64bits, a ver si es eso.

De todas maneras una sugerencia ¿por qué simplemente no haces la consulta en ese hilo que has enlazado que trataba este programa? Lo lógico es que quien tenga problemas de compilación o uso las haga allí...
Otra cosa será cuando hagas tus modificaciones, ahí si ya haces preguntas concretas sobre las modificaciones igual ya no es tan adecuado poner las consultas en el hilo original, o quizás sí, dependiendo de si se desvía mucho de la idea original.

Pero ahora te sugiero que hagas allí la consulta, que es donde está la gente que usa ese programa. Y no hace falta que repitas el código, si no lo has modificado, pues ya está en el propio hilo.

Re: No Me Funcina Este Codigo

Publicado: 20 Mar 2012, 15:14
por arkcrew
Hola,
Además lo de soltar un código de más de 400 líneas y decir "no me funciona, arregladlo" no mola mucho. Como mínimo nos tendrías que decir en qué no te funciona, y más siendo que antes sí te funcionaba.
Esa versión compila a 64bits, a ver si es eso.
Totalmente de acuerdo, el día que vi eso no tenía ni idea de por donde comenzar.. bueno al leer el mensaje de Ximorro pues he visto lo de la máquina de X64 bits y dado que la mía es de esa arquitectura, he probado el código y no me ha dado ningún error extraño, excepto que he añadido Global $comando al principio ya que la variable no estaba declarada y me saltaban los warnings, por lo demás, al ejecutar funciona, creo, ya que no se que debe hacer exactamente, pero me dice que el archivo CRONTAB no existe, y al no mostrar errores, he de suponer que funciona todo..

saludos!