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..
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 por si luego no funciona...
Lo dicho... necesito un GPS en este problemilla.
GRACIAS POR ANTICIPADO!!
Mantener Script Actualizado
- arkcrew
- Profesional del Autoit
- Mensajes: 506
- Registrado: 28 Sep 2009, 19:17
- Ubicación: Granada, España
- Contactar:
Re: Mantener Script Actualizado
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!
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!
ArkCrew
http://www.nodluna.blogspot.com
http://www.nodluna.blogspot.com
- Ximorro
- Profesional del Autoit
- Mensajes: 1500
- Registrado: 10 Jul 2009, 12:35
- Ubicación: Castellón, España
Re: Mantener Script Actualizado
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...
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)
- BasicOs
- Site Admin
- Mensajes: 2085
- Registrado: 21 Nov 2006, 19:24
- Ubicación: El Internet - (Canarias, España)
- Contactar:
Re: Mantener Script Actualizado
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:)
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:)
Re: Mantener Script Actualizado
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. 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_
Creo que la 2ª opcion me va a ser mas sencilla, pero tengo que madurar la idea...
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. 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_
Creo que la 2ª opcion me va a ser mas sencilla, pero tengo que madurar la idea...
Re: Mantener Script Actualizado [Solucionado]
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...
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.
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
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.