Mantener Script Actualizado

Tus preguntas. Algoritmos o Grupos de Comandos formando Programas Escripts.
Responder
Avatar de Usuario
juantxo
Hacker del Foro
Mensajes: 78
Registrado: 02 Abr 2008, 13:36

Mantener Script Actualizado

Mensaje por juantxo »

Saludos compañeros!

Hace tiempo que no escribia por aqui, pero sigo leyendo el foro, ya que siempre es una forma de obtener ideas.

Pero ahora necesito que me ayudeis con un tema...

Os pongo en antecedentes.
He creado una serie de Scripts que nos facilitan bastantes tareas en el trabajo, y los tengo compartidos con varios compañeros en una unidad de red comun.
Los usuarios/compañeros utilizan un acceso directo a estos Scripts para utilizar siempre la ultima version.

El problema es que hay veces que alguno de ellos se deja algun Script abierto y si actualizo algo, y lo intento reemplazar en la unidad de red, da un error y el programa queda inutilizable para todos los usuarios...

¿Como podria actualizar estos Scripts y evitar el error?

He pensado en que cuando el usuario ejecute el programa, sutomaticamente se haga una copia en su disco duro y utilice esa, pero no se como hacer la llamada y que se cierre el original.. :smt022

Tambien he pensado en crear una especie de INI donde se guarde la version actual, y caso de variar el programa se cierre, pero alguna aplicacion se puede programar para lanzarse a ciertas horas, asi que no me acaba de convencer. Podria programar que en el caso de cierre guarde los datos actuales en algun sitio, y que luego se configure con esos datos, pero me da pereza :smt015 por si luego no funciona...

Lo dicho... necesito un GPS en este problemilla.

GRACIAS POR ANTICIPADO!!
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: Mantener Script Actualizado

Mensaje por arkcrew »

Buenas,

En primer lugar, lo que dices del INI es justamente lo que te iba a recomendar, aunque la tarea esté programada, como la ubicación no variará, puedes hacer lo qeu dices, que cuando se detecte un cambio en el ini con una versión más reciente el programa se cierre y ejecute el nuevo, otra cosa...

Bueno también puedes hacer que el programa se auto actualice, es decir cada uno tendrá en su máquina el programa y que cuando publiques una actualización el programa lo detecte y se traiga el más reciente..

Espero que te sirva de algo.

Saludos!
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Mantener Script Actualizado

Mensaje por Ximorro »

Hombre, yo primero intentaría el sistema habitual: decir a los usuarios que cierren el programa.

Es que la cosa se complica si no se trata sólo del exe, por ejemplo yo a veces mantengo el programa pero cambio los datos, y entonces no sería suficiente lo de la versión de exe, te tocaría llevar un control de todos los archivos.

Si es posible es cosa de planificar el cambio en batch, a una hora que no haya nadie trabajando. De todas maneras yo lo hago a mano, si te da error la copia es que tienen en uso el archivo, entonces pido que lo cierren (sé qué personas lo pueden estar usando y si llamas a uno por despacho tampoco es tanto)
O sea, que mi recomendación es que controles si al hacer la copia de sustitución te da error o no. Si da error a buscar quién lo tiene en uso y que lo cierre. Si no da error todo correcto.

Igual se me escapa algo porque no entiendo eso que dices que si al actualizar da error el programa queda inutilizable. A mí cuando me da error significa que no ha podido copiar el archivo (pues estaba abierto por alguien) pero no lo deja inutilizable, simplemente se queda la versión vieja pues no la ha sustituido.

Si quieres que por código el propio programa vea si su versión es la última pues sí, mejor tener en algún sitio, por ejemplo un archivo INI como comentáis, la versión actual que debería tener cada exe. Si al ejecutarse ve que su versión no coincide con la del archivo pues es que la copia no se hizo bien, entonces sacas un mensaje al usuario en plan "Versión obsoleta, por favor contacte con el administrador" y cuando el usuario te llame para quejarse ("¡Me ha salido un error!" - "¿Qué ponía?" - "No sé, no lo he leído") entonces haces la copia otra vez... ;-)
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2085
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: Mantener Script Actualizado

Mensaje por BasicOs »

Puedes hacer que se resetee para desconectar las conexiones de red, o bien descompartir el recurso y volverlo a compartir, también actualizar cuando se inicie el pc.

Otra opción es que el script tenga una funcion en varios sitios del código siactualiza(), en que if fileexists() el fichero "myscript.ex_" y entonces que haga un EXIT, y que arranque otro escript tipo: del myscript.exe; copy myscript.ex_ myscript.exe ; if fileexists("myscript.exe") then del myscript.ex_
por lo menos el último que se salga de la aplicación lo copiará bien.

También puedes que compruebe lo mismo si desde myscript.exe compruebas que existe el myscript1.exe entonces un run() y EXIT, arrancando myscript1.exe con lo cual siempre usaran el más actualizado que es el xxx1 , y después en cualquier otro momento O DIA puedes modificar el myscript.exe con otra posterior actualizacion y quitarle el reenvio al myscript1.exe con lo que siempre usarían el myscript.exe....
hay bastantes alternativas depende de lo que desees, también llevar un control marcando una variable antes del exit, y al arrancar el programa, y así abriendo el ini ves que equipo no ha salido del programa ejemplo equipos.ini para llamarle por tf, etc...

Salu22:)
Avatar de Usuario
juantxo
Hacker del Foro
Mensajes: 78
Registrado: 02 Abr 2008, 13:36

Re: Mantener Script Actualizado

Mensaje por juantxo »

Muchas gracias!

Voy a ver como me las apaño. De momento ya he conseguido que la aplicacion guarde el estado de los controles al cerrarse, y recuperarlos al abrir. :smt041 a base de ReadIni y WriteIni.

Ahora me queda ver si es mejor controlar la version en un INI o comprobar si existe el script.ex_ :smt017

Creo que la 2ª opcion me va a ser mas sencilla, pero tengo que madurar la idea... :smt015 :smt015
Avatar de Usuario
juantxo
Hacker del Foro
Mensajes: 78
Registrado: 02 Abr 2008, 13:36

Re: Mantener Script Actualizado [Solucionado]

Mensaje por juantxo »

Bueno, pues ya he vencido la pereza, y esta funcionando!!!

El programa en ejecucion comprueba cada vuelta de ciclo si existe un archivo script.ex_

Si es asi, guarda los valores de los controles (Checkbox y Inputbox) en un .ini por cada usuario y lanza un programa llamado "SiActualiza.exe" con el nombre del progama como parametro y se cierra.
Este es el fuente...

Código: Seleccionar todo

#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=Drive.ico
#AutoIt3Wrapper_outfile=SiActualiza.exe
#AutoIt3Wrapper_Compression=3
#AutoIt3Wrapper_Res_Comment=Actualiza los fichero en ejecucion.
#AutoIt3Wrapper_Res_Fileversion=0.0.1.1
#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=p
#AutoIt3Wrapper_Res_Language=1069
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
#cs ----------------------------------------------------------------------------
	AutoIt Version: 3.2.10.0
	NAME: SiActualiza.au3
	Author:         Juantxo
	Script Function: Comprueba si se ha actualizado un ejecutable y lo actualiza.
#ce

#cs
VERSIONARIO:
-----------
	Version 0.0.1.0: Version inicial.
#ce

#region Ejecucion en Exclusiva
Dim $g_szVersion
$g_szVersion = "Si Actualiza"
If WinExists($g_szVersion) Then
	; **  _EscribeLOG("Ya esta en ejecucion") ; Guarda registro en LOGs
	$iMsgBoxAnswer = MsgBox(16, "En ejecucion", "La aplicacion ya esta en ejecucion" , 10)
	Exit
EndIf
AutoItWinSetTitle($g_szVersion)
#endregion

#region Parametros

If $CmdLine[0] = 0 Then 	; Si no hay parametros
	MsgBox(16,"Error", "No se ha especificado parametro")
	Exit
EndIf
#endregion Parametros

#region Proceso
$ArchivoEx_= @ScriptDir &"\"& $CmdLine[1] & ".ex_"
;~ MsgBox(0,0,$ArchivoEx_)
$ArchivoExe=@ScriptDir &"\"& $CmdLine[1] & ".exe"
;~ MsgBox(0,0,$ArchivoExe)
If FileExists($ArchivoEx_) Then
	While ProcessExists($CmdLine[1] & ".exe") ; no avanza mientras no se cierra el proceso que lo ha llamado.
	WEnd

	$Error= FileCopy($ArchivoEx_,$ArchivoExe,1)
	While $Error = 0 And FileExists($ArchivoEx_) ; si falla
		$Error= FileCopy($ArchivoEx_,$ArchivoExe,1)
	WEnd
	FileDelete($ArchivoEx_)
	Run ($ArchivoExe)
Else
	MsgBox(16,"Error", "No se encuentra el archivo:" & @CRLF & @ScriptDir &"\"& $CmdLine[1] & ".ex_")
EndIf
Exit
#endregion
El SiActualiza.Exe espera hasta que la aplicacion que le ha llamado este cerrada, y entonces hace la copia de .ex_ a.exe

Cuando acaba la copia, SiActualiza.exe llama a Script.exe y se cierra.

Script.exe comprueba si existe un INI con datos para cargar (para cada usuario) si es asi, se configura y borra los datos del INI.

Es mas dificil de explicar que el proceso en si.

La pega mayor fue con un InputBox multilinea. Al pasrlo al INI y recuperarlo solo cargaba la primera linea, pero con un StrinSplit y guardar cada linea en una variable del INI arreglado.

GRACIAS POR LA AYUDA. Sin ella no se si me habria decidido a implementar esta solucion. :smt023
Responder