Autor
|
Tema: variables en batch (Leído 10,492 veces)
|
crisoof
Desconectado
Mensajes: 48
|
Hola de nuevo, tengo una duda existencial, estoy seguro que en algun momento resolvi esto, pero se me olvido, y no lo encuentro en la web, tengo lo siguiente FOR /F "usebackq delims=!" %%i IN (`sqlplus -s QA_DATAC/qa_dc@orcl_qa @%PATH_SQL%t1`) DO ( set valor= %%I )
no me regulsta, por si las dudas la query T! solo es un count de una tabla select count(*) from errores_geom
necesito pasar el valor de i a una variable local, que pueda existir fuera del for, como lo puedo lograr? y aprovechando, esa valor de la tabla, cuanta registros, se esta pasando bien a la variable %%i, aunque no exista fuera del for Saludos Gracias por su ayuda
|
|
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.885
|
Cualquier variable que inicialices dentro del For seguirá existiendo tras finalizar el bloque del FOR, ¿por que piensas que no es así?, otra cosa muy distinta sería que el output de la aplicación sqlplus.exe tuviera más de una linea, con una linea final en blanco, y en ese caso el For, al iterar las lineas, se estaría sobre-escribiendo el valor de la variable, al final asignando un valor vacio. Asegúrate de filtrar lineas vacías y/o en blanco del output, de la siguiente manera: For ... in (`sqlplus -s QA_DATAC/qa_dc@orcl_qa @%PATH_SQL%t1 ^| findstr "^[^\s]"`) Do (...) Nota: Ten en cuenta que en el código que has mostrado estás utilizando el modificador UseBackQ en el For, y eso altera el comportamiento de las comillas dobles, no manejo sqlplus, pero creo que no necesites usarlo. Además de eso, estás dejando un espacio en blanco a la derecha del operador de asignación ( Set valor= %%i)), corrígelo, utiliza la sintaxis correcta: Set "valor=%%~i". Saludos
|
|
« Última modificación: 11 Febrero 2015, 18:59 pm por Eleкtro »
|
En línea
|
|
|
|
crisoof
Desconectado
Mensajes: 48
|
pero entoncs Elektro porque no puedo pasar a una variable %v1% el valor del %%i, que se saca de la consulta sql, esto me a pasado cada vez que e intentado entregarle ese valor a una variable %x%, lo digo porque cuando intento de usar la variable, %%i DENTRO DEL FOR POR EJEMPLO NO HAY PROBLEMA, PERO FUERA DEL FOR, AL LLAMAR A LA VARIABLE NO TIENE VALOR o Y INDICA QUE EL ECHO ESTA DESACTIVADO, perdon por las mayusculas programo con la mayuscula activa y aveces se me queda pegada la tecla mira te explico, lo que estoy intentando de hacer es que, si la tabla errores_geom no tiene nada, siga corriendo un procedimiento, pero si esta tabla tiene un registro al menos, no siga corriendo el procedimiento, y salte a la siguiente archivo para proceder a validar si tiene errores, si tiene errores, la tabla se llena y nuevamente, salta a la siguiente archivo, esto debe tener una salida, para que la persona sepa porque se cayo para este archivo y si no le entregara los resultados esperados, tengo listo la lectura de los archivos, pasa uno por uno, el problema es que a veces esos archivos que son dibujados por personas tienen errores, por lo tanto debo ingresar esa validacion, lo que necesito es pasar el valor de esa query (`sqlplus -s QA_DATAC/qa_dc@orcl_qa @%PATH_SQL%t1`)
entregarla a una variable, para usarla indiscriminadamente, entre todos los batch que necesito usar, asi tbn puedo sacar el nombre de las comunas, que tambien esta almacenado en una BD, si me puedes dar alguna otra idea de como entregarle a una variable el valor de la query mas arriba, esa query solo muestra un valor, porque como indicaba es un count de la tabla, ojalas me puedas hechar una mano, o algun otro que me pueda ayudar, gracias saludos
|
|
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.885
|
pero entoncs Elektro porque no puedo pasar a una variable %v1% el valor del %%i Muestra el código donde manejas las variables, el output, y te diré el por qué xD. La razón más común te la he explicado, a veces una aplicación externa agrega una linea final en blanco a la salida, a veces no percibimos esa linea vacía, y pasa eso. Pero podría haber más motivos, como por ejemplo utilizar esa variable dentro del for sin haberla expandido, aunque esa no es la causa al menos en el código que has mostrado arriba. EDITO: También podría deberse a que el output de sqlplus tuviera una codificación Unicode, y eso necesitaría otro tipo de tratamiento en la variable, ya que podría estar asignandose un valor "nulo" (en blanco). cuando intento de usar la variable, %%i DENTRO DEL FOR POR EJEMPLO NO HAY PROBLEMA, PERO FUERA DEL FOR, AL LLAMAR A LA VARIABLE NO TIENE VALOR Es que la variable %%i es una variable especial de For, no tiene vida fuera del bloque For, por otro lado, la variable "valor", como ya he comentado, si que sigue existiendo. mira te explico, lo que estoy intentando de hacer es que, si la tabla errores_geom no tiene nada, siga corriendo un procedimiento, pero si esta tabla tiene un registro al menos, no siga corriendo el procedimiento, y salte a la siguiente archivo para proceder a validar si tiene errores, si tiene errores, la tabla se llena y nuevamente, salta a la siguiente archivo, esto debe tener una salida, para que la persona sepa porque se cayo para este archivo y si no le entregara los resultados esperados, tengo listo la lectura de los archivos, pasa uno por uno, el problema es que a veces esos archivos que son dibujados por personas tienen errores, por lo tanto debo ingresar esa validacion, lo que necesito es pasar el valor de esa query entregarla a una variable, para usarla indiscriminadamente, entre todos los batch que necesito usar, asi tbn puedo sacar el nombre de las comunas, que tambien esta almacenado en una BD, si me puedes dar alguna otra idea de como entregarle a una variable el valor de la query mas arriba, esa query solo muestra un valor, porque como indicaba es un count de la tabla, ojalas me puedas hechar una mano, o algun otro que me pueda ayudar, gracias Lo siento pero como ya te digo no manejo sql/sqlplus, desconozco cual es el output que envia la aplicaicón sqlplus porque también desconozco la funcionalidad y el comportamiento de los parámetros que estás utilizando al ejecutar esa aplicación mediante la consola, aunque me hago una ligera idea no puedo evaluarlo correctamente, solo te puedo ayudar y/o orientar en lo otro. Haz una cosa, envia la salida de la aplicación sqlplus.exe a un archivo de texto plano: (sqlplus -s QA_DATAC/qa_dc@orcl_qa @%PATH_SQL%t1)>"archivo.txt" Comprueba si el texto resultante contiene lineas vacias al final del archivo, en caso de tener lineas vacias (o con espacios en blanco) ya te indiqué como corregir el problema con la variable "valor", en caso contrario, muestra más detalles del código bat, muestra también el output de la tabla que se ha enviado al archivo de texto, y por último indica que valor de la salida es la que intentas asignar a la variable "valor". Saludos!
|
|
« Última modificación: 11 Febrero 2015, 20:14 pm por Eleкtro »
|
En línea
|
|
|
|
crisoof
Desconectado
Mensajes: 48
|
RESOLVI EL PROBLEMA TOMANDOLO DESDE OTRO PUNTO DE VISTA (CAMBIE LA FORMA EN LA QUE CORRE EL PROCESO XD), pero lamentablemente una y otra vez me vuelvo a topar con el mismo problema, necesito hacer uso de la informacion fuera del for pero como la informacion la tiene una variable no puedo hacer un por que no le pasa el valor a la variable, ahora necesito lo mismo, contar lo que tiene la tabla, pero no logro saber como pasarle la informacion de la variable que muere fuera del for a una variable que siga existiendo fuera del for, ¿help? xD Edito:lo que sucede es que al tener ejemplo esto for /f in %%i (sqlplus -s QA_DATAC/qa_dc@orcl_qa @%PATH_SQL%t1)do set (echo %%i) o esto (sqlplus -s QA_DATAC/qa_dc@orcl_qa @%PATH_SQL%t1)>COMUNAS.TXT
FOR /F "DELIMS=" %%B in (%PATH_COMUNAS%COMUNAS.TXT) donde comunas tiene el valor de la query select count(*) from tabla no se como subir la imagen, pero mueStra algo asi como ESTO SIN EMBARGO A PESAR DE QUE TIENE DOS LINEAS, HACIENDO ANTERIORMENTE EN OTRA CONSULTA, PARA BUSCAR EL VALOR DE UNA COMUNA, LE ENTREGO A LA VARIABLE EL VALOR DE LA COMUNA NI MA NI MENOS, bueno en sintesis me gustaria saber de que manera puedo entregarle la informacion obtenida de una query o de un txt como les sea mas facil , a una variable, para poder usar esta variable CON el valor fuera del bat, gracias
|
|
« Última modificación: 20 Febrero 2015, 15:30 pm por crisoof »
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.885
|
no puedo hacer un por que no le pasa el valor a la variable Jamás podrás hacer eso de esa manera, estás utilizando caracteres reservados de variable (%%) al definir el nombre de una variable. Batch no te avisará del error, pero no puedes hacer eso. me gustaria saber de que manera puedo entregarle la informacion obtenida de una query o de un txt como les sea mas facil , a una variable, para poder usar esta variable CON el valor fuera del bat, gracias For /F ...%%# In ('sqli... ^| Findstr "[0-9]"') Do (Set /A "Value=%%#") Con eso puedes utilizar la variable fuera del búcle del FOR, como ya comenté. Si por " utilizar la variable fuera del bat" te refieres a que una vez haya terminado todo el Script, puedas utilizar la variable en cualquier otra instancia de la CMD, entonces debes definir una variable de entorno en el sistema operativo: (es necesario reiniciar la instancia de la CMD para que los cambios surjan efecto) Saludos
|
|
|
En línea
|
|
|
|
crisoof
Desconectado
Mensajes: 48
|
Muchas gracias Master!!, voy a probar que tal y sino molesto de nuevo xD... VUELVOPUES NO ME RESULTO XD, ME SIGUE INDICANDO QUE EL ECHO NO ESTA ACTIVO, ES LO MISMO QUE ME INDICABA ANTES FOR /F "usebackq delims=!" %%c in (`sqlplus -s QA_DATAC/qa_dc@orcl_qa @%PATH_SQL%ESTADISTICA ^|Findstr "[0-9]"`) DO ( SET /A "VALUE=%%c" ECHO %VALUE% PAUSE ) eso es para probar y lo usare asi FOR /F "usebackq delims=!" %%c in (`sqlplus -s QA_DATAC/qa_dc@orcl_qa @%PATH_SQL%ESTADISTICA ^|Findstr "[0-9]"`) DO ( SET /A "VALUE=%%c" "call otro.bat" ) dentro del otro.bat voy a llamar a la variable que tiene el valor de la query
|
|
« Última modificación: 20 Febrero 2015, 15:53 pm por crisoof »
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.885
|
¿Porque usas el modificador 'usebackq' ?, estás cambiando el comportamiento de las comillas de la expresión del For, prueeba sin ese modificador. EDITO: Ah, por cierto, el Echo del primer For no te va a funcionar por que no estás expandiendo la variable: FOR /F "usebackq delims=!" %%c in (`sqlplus -s QA_DATAC/qa_dc@orcl_qa @%PATH_SQL%ESTADISTICA ^|Findstr "[0-9]"`) DO ( SET /A "VALUE=%%c" ECHO %VALUE% PAUSE ) Pero fuera del bloque del For si que podrás visualizar el contenido de la variable, que eso es lo que supuestamente quieres. Para que te funcione ese ejemplo que he citado, utiliza la declaración "Setlocal enabledelayedpexpansion" (y usa el símbolo !! en lugar de %% para mostrar variables) o simplemente añade un call y duplica los símbolos reservados de variable: EDITO 2: Te muestro un ejemplo funcional: Script1.cmd For /F "Tokens=* Delims=" %%# In ( )
Script2.cmd Echo Variable desde otro script=" %var%"
Saludos
|
|
« Última modificación: 20 Febrero 2015, 16:47 pm por Eleкtro »
|
En línea
|
|
|
|
crisoof
Desconectado
Mensajes: 48
|
ELEKTRO USO EL USEBACKQ, PORQUE SE VEZ EN EL FOR Código: FOR /F "usebackq delims=!" %%c in (`sqlplus -s QA_DATAC/qa_dc@orcl_qa @%PATH_SQL%ESTADISTICA ^|Findstr "[0-9]"`) DO ( SET /A "VALUE=%%c" ECHO %VALUE% PAUSE ) La palabra sqlplus se refiere a un programa de oracle a bases de datos, si no uso el usebackq, me desconoce la palabra sqlplusy me pide inicializarla, bueno solo me da el error de que no la encuentra, los siguientes datos corresponden a user/schema/service y luego le digo que es una ruta, le digo en esta ruta encontraras un archivo sql se llama estadistica, ejecutalo y tate, no me devuelve nada xD, echo no esta activo, la otra duda que me sugio elektro, y si la devolucion no es un numero? como seteas a la variable?? xq el set /a es para numeros no?, gracias por tu tiempo y tanta molestia de mi parte, saludos Edito DISCULPA RESPONDI SIN VERIFICAR SIQUIERA CQUE HABIAN DOS EDICIONES, VOY A BUSCAR COMO MANEJAR LA "Setlocal enabledelayedpexpansion" sorry, buscare y te cuento, gracias y saludos
|
|
« Última modificación: 20 Febrero 2015, 17:08 pm por crisoof »
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.885
|
y si la devolucion no es un numero? como seteas a la variable?? xq el set /a es para numeros no? Para setear valores numéricos se añade el modificador "Set /A", para strings, simplemente "Set". si no uso el usebackq, me desconoce la palabra sqlplusy me pide inicializarla El problema no es con el nombre del exe (sqlplus.exe) sino con la variable "path_sql" que me imagino que será una variable de entorno definida por la instalación de SQL, y seguramente la variable contiene comillas dobles al principio y al final, y por eso habrás visto o leido por ahí que utilizan el modificador "usebackq", es para poder trabajar esas comillas dobles. El problema es que ese modificador altera el comportamiento de las comillas y comillas dobles, y la expresión del FOR se vuelve bastante tediosa/compleja de escribir con la sintaxis correcta, la redirección (^| Findstr...) no te va a funcionar correctamente a menos que le quites el "usebakq". Cuando se usa 'usebackq', los problemas siemrpe son por el uso inadecuado de las comillas/comillas dobles. Seguramente te estoy mareando porque, como ya comenté, no tengo el sqlplus para testear y corregir la expresión del FOR... pero prueba de esta manera, debería funcionar: REM Declaro una variable que almacenará el valor de la variable 'path_sql', pero sin comillas dobles, las elimino. For /F "Tokens=* Delims=" %%a In ('""sqlplus.exe" -s QA_DATAC/qa_dc @orcl_qa @^'%sqlPath%^'ESTADISTICA | "FindStr.exe" "[0-9]""' ) Do ( )
EDITO: Por despiste puse la variable que no era en la expresión FOR (^'path_sql^' en lugar de ^'sqlPath^'), ya está correjido. ¿te funciona? Saludos
|
|
« Última modificación: 20 Febrero 2015, 18:26 pm por Eleкtro »
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Variables dentro de variables (batch)
Scripting
|
MK-Ultra
|
8
|
7,912
|
6 Febrero 2008, 23:18 pm
por GUN$
|
|
|
Variables batch y vb
Programación Visual Basic
|
gdegrau
|
3
|
2,387
|
27 Enero 2009, 20:03 pm
por krackwar
|
|
|
[BATCH] ¿Como puedo meter variables dentro de variables?
Scripting
|
Meine programmen
|
1
|
4,192
|
24 Marzo 2012, 16:48 pm
por Eleкtro
|
|
|
Variables en BATCH
« 1 2 »
Scripting
|
crazykenny
|
17
|
8,717
|
26 Enero 2014, 11:10 am
por crazykenny
|
|
|
Variables Batch en C++
Programación C/C++
|
OmarHack
|
2
|
2,025
|
19 Julio 2014, 01:56 am
por ivancea96
|
|