Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Introducir variable en una ruta

Estas en el tema de Introducir variable en una ruta en el foro de Visual Basic clásico en Foros del Web. Hola. Estoy aprendiendo a programas en VB. Apenas sé pero poco a poco voy haciendo... El caso es que llevo tiempo enganchado en una cosa ...
  #1 (permalink)  
Antiguo 25/08/2010, 06:36
Avatar de AkiraKazama  
Fecha de Ingreso: mayo-2009
Mensajes: 40
Antigüedad: 15 años, 5 meses
Puntos: 2
Introducir variable en una ruta

Hola.
Estoy aprendiendo a programas en VB. Apenas sé pero poco a poco voy haciendo...
El caso es que llevo tiempo enganchado en una cosa que probablemente sea muy básica, pero me pierde:


Tengo una serie de opciones a elegir. La idea es que cuando seleccionas una, y le das a un botón abre un bat situado en una ruta, pero el bat debe cambiar dependiendo de la opción.

Ej: Tenemos X, Y, Z como opciones. Hago click en la opción X, y le doy al botón de acción. Luego tengo en C:\ 3 bats llamados "ejecutarx.bat", "ejecutary.bat" y "ejecutarz.bat"

Lo que he hecho es crear una variable llamada btn, y cuando elijes una de las opciones, btn toma ese valor (x, yo z).

Lo que no sé como hacer es en el evento del botón para que cambie la URL del bat dependiendo del valor de la variable btn...

Yo había puesto...
Código:
Private Sub boton_Click()

    Shell ("C:\ejecutar btn.bat")

End Sub
...donde btn es la variable. Pero me temo que así no es como introduzco un valor variable en una cadena de ruta, porque no me funciona el programa.

Si alguien pudiese orientarme o ayudarme, lo agradecería mucho.

Un saludo muy grande a Forosdelweb.
  #2 (permalink)  
Antiguo 25/08/2010, 07:17
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años
Puntos: 53
Respuesta: Introducir variable en una ruta

Hola, para concatenar Textos con Cadenas o Variables, debes utilizar el caracter &, te pongo el ejemplo sobre tu pregunta.

Del modo en que tu lo indicas, btn forma parte de la cadena Shell ("C:\ejecutar btn.bat")
Para conseguir lo que quieres, debes indicar Shell ("C:\ejecutar " & btn & ".bat") y de esta manera si la variable btn contiene "pepe", es como si estuvieras escribiendo: Shell ("C:\ejecutar " & "pepe" & ".bat") y así Shell recibe la cadena deseada "C:\ejecutar pepe.bat"

Fijate bien en que después de ejecutar dejo adrede un caracter en blanco ya que otro modo, estaria indicando "C:\ejecutarpepe.bat" y esto te produciría un error. Si no necesitas el espacio en blanco, por supuesto no lo dejes. Lo importante es que captes la idea.

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #3 (permalink)  
Antiguo 25/08/2010, 08:30
Avatar de AkiraKazama  
Fecha de Ingreso: mayo-2009
Mensajes: 40
Antigüedad: 15 años, 5 meses
Puntos: 2
Respuesta: Introducir variable en una ruta

Hola erbuson.

Por lo visto tu consejo me ha sido de mucha ayuda. Agradezco enormemente tu paciencia y tu tiempo invertido en resolver mi duda.

Ahora he comprendido la importancia de concaternar variables en cadenas de texto utilizando el símbolo "&".

Así que sin más, gracias.

Sin embargo al ejecutar el programa ahora me está dando un error, que, por lo que leí por la red, es algo relacionado con la ruta (y leí también algo de una DLL).

El error aparecido es el siguiente:
Cita:
Run-time error '53'
File not found
El archivo bat está en el path indicado, así que no sé a que puede deberse.
Si pudiera ayudarme alguien con ésto la verdad que lo agradecería mucho también.

Ahora debo salir, ésta noche leo respuesta/s, pruebo y comento qué tal.

Muchas gracias a erbuson y a cualquiera que se preste a ayudar.

Saludos.
  #4 (permalink)  
Antiguo 25/08/2010, 09:19
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años
Puntos: 53
Respuesta: Introducir variable en una ruta

Hola:

El error pudiera parecer que no encuentra el archivo, pero tal vez sea algun archivo que supuestamente esta dentro del .bat

Deberías por ejemplo copiar aqui lo que hace uno de los bat para poder ayudarte mas facilmente, sin embargo, como mas sabe el diablo por viejo que por diablo, me aventuro a darte una opinión.

Supongamos este bat: c:\pruebas\mibat.bat evidentemente el programa lo encuentra y lo ejecuta pero si dentro del bat hay un programa que se ejecuta desde dentro de pruebas, debes forzar la entrada en el mismo, por ejemplo este bat seria incorrecto si suponemos que es así, ya que miprograma debe ejecutarse dentro de pruebas y si lo llamas desde otra carpeta, no lo hace así

--------------
Echo Ejecutando proceso
miprograma
Echo Fin de ejecución
--------------

El bat para que funcione correctamente debería ser:

--------------
Echo Ejecutando proceso
cd \pruebas
miprograma
Echo Fin de ejecución
--------------

Porque miprograma se ejecuta dentro de otra carpeta y no encuentra algún archivo necesario para su ejecución.

En cualquier caso, comenta.

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #5 (permalink)  
Antiguo 25/08/2010, 15:33
Avatar de AkiraKazama  
Fecha de Ingreso: mayo-2009
Mensajes: 40
Antigüedad: 15 años, 5 meses
Puntos: 2
Respuesta: Introducir variable en una ruta

Hola de nuevo, erbuson.
Ante todo agradezco enormemente el tiempo que estás volcando en ayudarme.

Te comento:
Lo que dices tiene mucho sentido, y seguro que en muchos casos será así, pero en mis archivos .bat hay rutas absolutas a unidades lógicas donde se montan las llaves USB.

El programa en sí lo que hace, es que te deja elegir la unidad lógica, y al darle al botón busca el bat correspondiente donde realiza una serie de acciones sobre esa unidad. Los bats se descomprimen en C:\. Cada bat realiza acciones en una unidad distinta. Si seleccionas en el programa la unidad "F:" por ejemplo, va a C:\ y busca el bat "limpiar_f.bat", y en dicho archivo tan solo se guardan órdenes que afectan a dicha unidad.

No sé si se entiende, si no está muy claro me dices y te pego directamente trozos de código o pantallazos.

Una vez más gracias, un fuerte abrazo.

PD: Las pruebas las realizo con la llave USB conectada, así que no creo que sea que no encuentra la unidad en concreto.
PPD: También ejecuté en C:\ los bats manualmente y se ejecutan correctamente..

Última edición por AkiraKazama; 25/08/2010 a las 15:40
  #6 (permalink)  
Antiguo 25/08/2010, 16:19
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años
Puntos: 53
Respuesta: Introducir variable en una ruta

Hola:
Estas comentando que los bats se descomprimen en C:\ creo que lo mejor sería que pegases el trozo de código VB que ejecuta este proceso ya que no se me ocurre que pueda ser lo que si está claro es que no encuentra el archivo que busca.

Si efectúas mas de un Shell, tal vez el anterior no ha terminado y el siguiente no encuentra el archivo.

No se, es para dar ideas, ¿ ocurre siempre con el mismo USB ?, ¿ ocurre sólo a veces ?

Si te lo da siempre, tal vez es que concatenas algo mal, si posteas el codigo será mas facil.

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #7 (permalink)  
Antiguo 25/08/2010, 16:32
Avatar de AkiraKazama  
Fecha de Ingreso: mayo-2009
Mensajes: 40
Antigüedad: 15 años, 5 meses
Puntos: 2
Respuesta: Introducir variable en una ruta

Hola erbuson, una vez y no me canso de decirlo; gracias por la ayuda.

A ver, mi idea es que el programa en VB, junto con los archivos en BAT, se compriman con winrar en un RAR-EXE autoejecutable. El RAR-EXE enviará los BATS a "C:\" y el ejecutable del programa en VB al escritorio para autoejecutarlo. Una vez realizadas las del VB, éste junto con los BATS serán eliminados, dejando nuevamente el RAR-EXE como unico ejecutable.

Sé que el método es un poco chapuza, pero tampoco sé lo suficiente como para hacerlo de otra manera...

Luego, el código del VB es el siguiente:
Código:
Private Sub boton_Click()
    Shell ("C:\arreglar_" & btn & ".bat")
End Sub
Private Sub z_Click(Index As Integer)
    btn = "z"
End Sub
Private Sub d_Click(Index As Integer)
    btn = "d"
End Sub
Private Sub e_Click(Index As Integer)
    btn = "e"
End Sub
Private Sub f_Click()
    btn = "f"
End Sub
Private Sub g_Click(Index As Integer)
    btn = "g"
End Sub
Private Sub h_Click(Index As Integer)
    btn = "h"
End Sub
Private Sub i_Click(Index As Integer)
    btn = "i"
End Sub
Private Sub j_Click(Index As Integer)
    btn = "j"
End Sub
Private Sub k_Click(Index As Integer)
    btn = "k"
End Sub
Private Sub l_Click(Index As Integer)
    btn = "l"
End Sub
Private Sub y_Click(Index As Integer)
    btn = "y"
End Sub
Lo que el código indica es que en el formulario seleccionas un OptionButton (la casilla circular de elección), cada una representando una unidad lógica, y buscando su bat correspondiente en C:\.
Una vez el programa ejecute el bat, se ejecuta lo siguiente (voy a poner 1 bat aleatorio, pues tengo uno distinto por unidad):
Código:
@echo off

attrib -s -h -r f:\autorun.inf
del /F /S /Q f:\autorun.inf
mkdir f:\autorun.inf
attrib +s +h +r f:\autorun.inf

rmdir /Q /S f:\recycler
type recycler>>f:\recycler
attrib +s +h +r f:\recycler
No sé si así se ve más claro.
De nuevo gracias y un fuerte saludo.

PD: El fallo me lo da siempre, seguramente debo estar haciendo algo mal.

Última edición por AkiraKazama; 25/08/2010 a las 16:41
  #8 (permalink)  
Antiguo 25/08/2010, 16:41
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años
Puntos: 53
Respuesta: Introducir variable en una ruta

Hola:

Imagino que no es este TODO el código del programa, porque si es así, creo que el problema esta en que en las lineas:

Private Sub boton_Click()
Shell ("C:\arreglar_" & btn & ".bat")
End Sub

btn no recibe ningun valor, añade esta linea

Private Sub boton_Click()
Msgbox btn
Shell ("C:\arreglar_" & btn & ".bat")
End Sub


De este modo, antes de ejecutar el proceso, debes ver claramente que btn contiene la letra de la unidad. Si no te visualiza ningun dato es porque la variable btn no está compartida y realmente ejecutas Shell ("C:\arreglar_.bat") y claro, este archivo no existe.

Espero tus comentarios.
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #9 (permalink)  
Antiguo 25/08/2010, 16:49
Avatar de AkiraKazama  
Fecha de Ingreso: mayo-2009
Mensajes: 40
Antigüedad: 15 años, 5 meses
Puntos: 2
Respuesta: Introducir variable en una ruta

En efecto, no me visualiza ningún valor... me temo que hemos dado con el problema. Ahora la cuestión es compartir la variable (y si de paso puedes explicarme a grandes rasgos el concepto en sí sería mucho mejor).

Muchas gracias erbuson, estás siendo muy amable.
  #10 (permalink)  
Antiguo 25/08/2010, 17:09
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años
Puntos: 53
Respuesta: Introducir variable en una ruta

Vamos alla, el tema es muy simple, antes del primer Sub, o sea delante de todas las sentencias del programa, debes poner:

DIM btn As String

De esta manera, las variables que están definidas antes del código o sea, fuera de las Rutinas (Sub) y Funciones, son variables compartidas en todo el código.

De este modo ya debe funcionarte. De todos modos revisando el BAT y si TODOS son iguales a excepción de la letra, si me permites, te daré un consejo ya que puedes tener 1 solo BAT con un parámetro de sustitución y de este modo SOLO tienes que modificar uno de ellos.

El bat que me has puesto en el ejemplo es este:

@echo off

attrib -s -h -r f:\autorun.inf
del /F /S /Q f:\autorun.inf
mkdir f:\autorun.inf
attrib +s +h +r f:\autorun.inf

rmdir /Q /S f:\recycler
type recycler>>f:\recycler
attrib +s +h +r f:\recycler


pues bien, este bat quiero pensar que se llama arreglar_f.bat

podrías tenerlo de esta otra manera:

@echo off

attrib -s -h -r %1:\autorun.inf
del /F /S /Q %1:\autorun.inf
mkdir %1:\autorun.inf
attrib +s +h +r %1:\autorun.inf

rmdir /Q /S %1:\recycler
type recycler>>%1:\recycler
attrib +s +h +r %1:\recycler


como ves he sustituido donde tu ponias la letra f por %1

supongamos ahora que el bat se llama arreglar.bat para ejecutar el mismo simplemente debes hacer arreglar f o arreglar y o ...
por tanto seria Shell "C:\arreglar.bat " & btn

Como ves mucho mas simple de mantener.

Cualquier aclaración pregunta.

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #11 (permalink)  
Antiguo 25/08/2010, 17:23
Avatar de AkiraKazama  
Fecha de Ingreso: mayo-2009
Mensajes: 40
Antigüedad: 15 años, 5 meses
Puntos: 2
Respuesta: Introducir variable en una ruta

Has dado en el clavo en todo. Realmente admiro la gente que sabe tanto y no duda en ayudar a pequeños novatos como yo.

He seguido tu consejo sobre unificar los BATS en uno único, es una gran idea que no se me ocurrió. Debo suponer que %1 es una variable que se ejecuta por parámetro.

Sin embargo, al ejecutar vuelve a aparecer el "run-time error 53 file not found" de antes. El debugger me selecciona el shell...

Código:
Shell ("C:\arreglar.bat" & btn)
¿Así está bien, no?

He probado de poner de nuevo el "MsgBox btn" y ésta vez si que me muestra la variable elegida. ¿Qué puede fallar?

Un fuerte saludo y gracias de nuevo.
  #12 (permalink)  
Antiguo 25/08/2010, 23:52
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años
Puntos: 53
Respuesta: Introducir variable en una ruta

Hola:

Lo siento pero ayer por la noche me quede dormido y no pude leer tu mensaje, el error es muy simple ya que 'te comiste' el espacio en blanco en la instruccion Shell ("C:\arreglar.bat" & btn) y el Shell recibe Shell ("C:\arreglar.batk") o la letra y por supuesto el archivo c:\arreglar.batk no existe, dijate que es Shell ("C:\arreglar.bat " & btn)

No te preocupes, si lo veo facilmente y tu no, es porque en mas de una ocasión me ha pasado algo parecido.

Cuando algo así te falla, lo mejor es poner un msgbox similar como antes para ver que estas enviando al programa ya que cuando la logica falla es que tenemos el error delante de nuestras narices y no lo vemos, después lo quitas y listos.

Msgbox "C:\arreglar.bat " & btn
Shell ("C:\arreglar.bat " & btn)

Respecto a lo otro, efectivamente %1 es parametro 1, si es necesario podrias tener mas de uno para hacer el bat mas flexible, los parametros de sustitucion son %1, %2, %3, etc y son muy útiles pero tambien en ellos vigila los espacios en blanco.

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #13 (permalink)  
Antiguo 26/08/2010, 03:30
Avatar de AkiraKazama  
Fecha de Ingreso: mayo-2009
Mensajes: 40
Antigüedad: 15 años, 5 meses
Puntos: 2
Respuesta: Introducir variable en una ruta

Tenías razón, menudo fallo más tonto. Efectivamente era el espacio que había omitido. Ya funciona el script correctamente.

Por otra parte, ¡no hacía falta disculparse por la tardanza!, es normal que no pudieras estar ahí delante toda la noche .

Me has ayudado mucho y al mismo tiempo he aprendido detallitos básicos sobre VB que no conocía o tenía ahí y no quería ver. Así que sin más, te doy mi más sincera gratitud y deseo que nos encontremos por aquí de nuevo en alguna otra ocasión.

Un fuerte abrazo, Jorge.
  #14 (permalink)  
Antiguo 26/08/2010, 04:14
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 15 años
Puntos: 53
Respuesta: Introducir variable en una ruta

De nada, encantado de haber podido ayudar y cualquier duda que esté a mi alcance ya sabes por donde ando habitualmente.

Saludos y hasta otra ocasión.
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...

Etiquetas: introducir, ruta, variables
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:58.