Página 1 de 2

Instalar un programa con file.run

Publicado: 23 Sep 2013 13:53
por djmanuel11
Hola a todos, pues os queria preguntar si hay alguna forma de instalar un programa que no estuviese dentro de la carpeta autoplay.

Lo que quiero hacer es que me instale la ruta que tengo en una base de datos guardada.
La variable de la base de dato donde esta la ruta es sRuta_Instalador pero nose como hacerlo.
Si no es posible hacer que lo instale desde fuera de la carpeta de autoplay docs como le tengo que poner la variable para que me lo instale si lo pongo dentro de la carpeta docs.

Gracias de antemano y un saludo.

Publicado: 24 Sep 2013 22:08
por djmanuel11
Alguien me puede dar una idea de como hacerlo o algun ejemplo. Gracias

Publicado: 24 Sep 2013 22:09
por rafaxplayer
si file run apunta al instalador del programa , no veo el problema

Publicado: 24 Sep 2013 23:32
por djmanuel11
Si file.run apunta al instalador del programa pero el programa tiene que estar dentro de la carpeta de autoplay docs y yo quiero que me instale un programa que este fuera de autoplay, por ejemplo uno que tenga en mis documetos.

Publicado: 25 Sep 2013 00:10
por Metafunken
La explicacion del buen Rafa es demasiado solida...

Solo asigna la ruta del programa que deseas instalar,no es necesario que este dentro de la carpeta de ams ya que la funcion File.Run() corre cualquier aplicacion en cualquier directorio.

Saludos.

Publicado: 25 Sep 2013 00:17
por djmanuel11
Pues la verdad esque sere muy torpe jaja, porque lo he intentado y no lo he conseguido y no esque lo haya intentado una sola vez sino muchas y no lo he logrado.
Lo que quiero hacer es cargar la ruta que tengo almacenada en una base de datos, y al ponerle la variable sRuta_Instalador en File.Run() no me sale, me da error. Si fueseis tan amables de ponerme un ejemplo me ayudariais mucho. Gracias

Publicado: 25 Sep 2013 00:32
por djmanuel11
Acabo de probar con:
File.Run("C:\Users\Manuel\Programas1\Atube Carcher\aTube_Catcher.exe", "Instalar", SW_SHOWNORMAL, false);

File.Run(sRuta_Instalador, "Instalar", SW_SHOWNORMAL, false);

File.Run(sRuta_Instalador, "", SW_SHOWNORMAL, false);

Pero no me funciona, es decir no hace nada.

Publicado: 25 Sep 2013 00:45
por Metafunken
Mira, puedes utilizar las funciones File.Run() y File.open() la diferencia es que la primera funcion te permite ejecutar aplicaciones con comandos y con modo de retorno, si solo vas a "abrir" el instalador para que el solo trabaje pues no te rompas la cabeza y utiliza File.Open();

Lo harias de la siguiente manera:
File.Open("C:\\My Path\\My File.exe", "C:\\My Path", SW_SHOWNORMAL);
Analiza este pequeño script, contiene tres parametros:

1. La ruta absoluta hacia tu ejecutable.
2. La ruta absoluta hacia la carpeta del ejecutable.
3. El modo en que la ventana abrira, en este caso la he puesto "normal".

Fijate tambien en las backslash (anti-diagonales) deben ser DOBLES pues una sencilla no nos sirve, el sistema no reconoceria esa ruta.

Para que puedas ejecutar el fichero la aplicacion debe tener la ruta absoluta, de lo contrario no funcionara.

Aqui esta el mismo ejemplo pero con la funcion File.Run():
File.Run("C:\\My Path\\My File.exe", "", "C:\\My Path", SW_SHOWNORMAL, false);
Esta funcion cuenta con cuatro parametros:

1. La ruta absoluta hacia tu ejecutable.
2. La ruta absoluta hacia la carpeta del ejecutable.
3. El modo en que la ventana abrira, en este caso la he puesto "normal".
4. Modo de retorno, si es falso (como en el ejemplo) el ejecutable que acciones no afectara a la aplicacion, si es verdadero si la afectara... De que manera? Pues la aplicacion entrara en modo de "reposo" hasta que hayas cerrado el ejecutable, una vez cerrado la aplicacion continuara siendo interactiva.

Si tienes dudas ya sabes.

Saludos.

Publicado: 25 Sep 2013 00:47
por djmanuel11
Muchas gracias Metafunke, ahora la duda que tengo es, si yo estoy guardando la ruta con dialog.filebrose en una base de datos, como hago para que me doble la barra \.

Re:

Publicado: 25 Sep 2013 00:50
por Metafunken
djmanuel11 escribió:Acabo de probar con:

File.Run("C:\Users\Manuel\Programas1\Atube Carcher\aTube_Catcher.exe", "Instalar", SW_SHOWNORMAL, false);

File.Run(sRuta_Instalador, "Instalar", SW_SHOWNORMAL, false);

File.Run(sRuta_Instalador, "", SW_SHOWNORMAL, false);

Pero no me funciona, es decir no hace nada.
Al parecer mientras escribias te ponia mi ejemplo...

Ese es tu error, no estas utilizando double backslash, una "cosa" tan insignificante que puede llegar a dar dolores de cabeza cuando somos inexpertos.

Como recomendacion del foro te recomiendo que utilices la sintaxis de lua que esta en el editor, podrian llamarte la atencion por cometer esta falta, esto es lo correcto:
File.Run("C:\\Users\\Manuel\\Programas1\\Atube Carcher\\aTube_Catcher.exe", "Instalar", SW_SHOWNORMAL, false);
Saludos.

Publicado: 25 Sep 2013 00:55
por djmanuel11
Ok ya no lo se para el siguiente. Acabo de probar y con file.run no me funciona aunque le ponga la double backslach, aunque con file.open si funciona. Pero ahora mi problema es como hago para que me guarde con dialog.filebrowse la double backslach.

Re:

Publicado: 25 Sep 2013 01:13
por Metafunken
djmanuel11 escribió:Muchas gracias Metafunke, ahora la duda que tengo es, si yo estoy guardando la ruta con dialog.filebrose en una base de datos, como hago para que me doble la barra \.
Mira, te explico de manera sencilla:

Cuando asignas una ruta en modo string debes colocar dos backslash, pero si el script interactua con un string no es necesario pues "te las da por defecto".

Mas claro aqui esta un ligero ejemplo:
local sExePath = Dialog.FileBrowse(true, "My Title", Shell.GetFolder(SHF_DESKTOP), "Exe Files (*.exe)|*.exe|", "", ".exe", false, false);
if (sExePath[1] ~= "CANCEL") and (sExePath[1] ~= nil) then
	sExe = sExePath[1];
	File.Open(sExe, String.SplitPath(sExe).Drive..String.SplitPath(sExe).Folder, SW_SHOWNORMAL);
	--File.Run(sExe, String.SplitPath(sExe).Drive..String.SplitPath(sExe).Folder, SW_SHOWNORMAL, false);
end
¿Que hacemos en este ejemplo?:

1. Creamos una variable local que solo funcionara dentro del area de codigo asignada que, tambien contendra en modo de tabla el valor o ruta hacia el ejecutable mediante la funcion Dialog.FileBrowse().

2. Creamos una sentencia que como condicion le dira al script que si el dialogo no es cancelado y la ruta es existente (not nil) entonces se alojara la ruta del ejecutable dentro de la variable sExePath, caso contrario no procedera a ejecutar el bloque de la sentencia que iniciamos, esta sentencia tambien puede ser llamada de manera logica como"filtro" y nos sirven para eliminar posibles errores en tiempo de ejecucion.

¿¿Porque el indice numerico [1] ?? Pues porque estamos recibiendo datos en modo de tabla, entonces como solo estamos permitiendo un fichero es necesario colocarlo.

Finalmente pasamos la ruta a una nueva variable la cual sera anotada en la funcion File.Open() para que sea abierto el ejecutable, esto es solo para ahorrar algo de escritura de codigo, nada mas.

Para que tengas una mejor idea de los parametros que se utilizan en cada funcion que te he colocado te recomiendo que veas la ayuda del jodido ams.

Saludos.

Publicado: 25 Sep 2013 01:19
por djmanuel11
Muchas gracias por las molestias Metafunken, voy a probar haber si me funciona. Un saludo

Publicado: 25 Sep 2013 01:22
por Metafunken
Si fuera molestia no te respondo man, dale al codigo que es sencillo.

Saludos.

Publicado: 25 Sep 2013 01:29
por djmanuel11
Es sencillo para el que entienda, porque yo no se mucho de programación. He empezado hace muy poco a trastear con esto. El ejemplo que me has dado funciona a la perfección pero mi problema ahora es como sustituyo el dialog.filebrowse de el codigo por la variable donde tengo guardado la ruta y que no me de error.

Publicado: 25 Sep 2013 01:43
por djmanuel11
Bueno ya he logrado que funcione con la variable. Muchas Gracias
local sExePath = sRuta_Instalador
  if (sExePath ~= "CANCEL") and (sExePath ~= nil) then
         sExe = sExePath;
         File.Open(sExe, String.SplitPath(sExe).Drive..String.SplitPath(sExe).Folder, SW_SHOWNORMAL);
         
         --File.Run(sExe, String.SplitPath(sExe).Drive..String.SplitPath(sExe).Folder, SW_SHOWNORMAL, false);
 end

Publicado: 25 Sep 2013 01:46
por Metafunken
A ver a ver a ver... Creo que nos estamos confundiendo un poco...

No tiene caso que metas una ruta en una variable a menos que la vayas a seguir utilizando por varias veces mas dentro de tu proyecto, te dejo un ejemplo (que es el mismo que te habia puesto) con y sin variable:

En ambos casos Debes asignar manualmente la ruta absuluta al ejecutable que quieres iniciar, este ejecutable debera existir, de lo contrario no podra ser ejecutado.

Con variable:

On Preload
sExePath = "C:\\My Path\\My File.exe";
sFolderPath = "C:\\My Path";
En un boton por ejemplo:
File.Open(sPath, sFolderPath, SW_SHOWNORMAL);
Sin variable:

En un boton por ejemplo:
File.Open("C:\\My Path\\My File.exe", "C:\\My Path", SW_SHOWNORMAL);
La unica diferencia entre ambos ejemplos es la variable precisamente, en el primero le damos la ruta mediante variable y en el segundo la asignamos directamente dentro de la funcion, no hay gran ciencia aqui.

Esto esta mas que claro, si no lo comprendes entonces deberas ser aun mas especifico.

Saludos.

Publicado: 25 Sep 2013 01:52
por Metafunken
Felicidades! Aunque veo algunas ligeras discrepancias en tu codigo:
local sExePath = sRuta_Instalador
  if (sExePath ~= "CANCEL") and (sExePath ~= nil) then
         sExe = sExePath;
         File.Open(sExe, String.SplitPath(sExe).Drive..String.SplitPath(sExe).Folder, SW_SHOWNORMAL);
         
         --File.Run(sExe, String.SplitPath(sExe).Drive..String.SplitPath(sExe).Folder, SW_SHOWNORMAL, false);
 end
1. "CANCEL" no es necesaria pues jamas sera cancelado, este parametro solo se utiliza en las funciones para las cuales ha sido diseñado.

Lo correcto en ese caso es:
local sExePath = sRuta_Instalador;--Aunque aqui deberia de estar la ruta en directo y sin escalas en vez de la variable sRuta_Instalador.
  if (sExePath ~= nil) then
         sExe = sExePath;
         File.Open(sExe, String.SplitPath(sExe).Drive..String.SplitPath(sExe).Folder, SW_SHOWNORMAL);
         
         --File.Run(sExe, String.SplitPath(sExe).Drive..String.SplitPath(sExe).Folder, SW_SHOWNORMAL, false);
 end
Pensando en que la variable sRuta_Instalador se encuentre dentro de On Startup u On Preload.

Saludos.

Publicado: 25 Sep 2013 01:54
por djmanuel11
El tema de usar la variable es porque tengo hecha una base de datos donde le estoy diciendo el nombre del programa y la ruta del instalador. Entonces en un listbox muestro el nombre de los programas de la tabla y selecciono el que quiero instalar y pulso el boton. Entonces empieza la instalación del programa que he seleccionado en el listbox. Con el código que te he puesto arriba me funciona bien, nose si me has entendido ahora el porque de usar la variable. Un saludo

Publicado: 25 Sep 2013 01:56
por djmanuel11
Ok entonces quitare el "CANCEL" y como tu bien dices la variable sRuta_Instalador esta declarada en el On Preload.