elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  variables en batch
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: variables en batch  (Leído 10,492 veces)
crisoof

Desconectado Desconectado

Mensajes: 48


Ver Perfil
variables en batch
« en: 11 Febrero 2015, 17:16 pm »

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
Código:
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
Código:
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 Desconectado

Mensajes: 9.885



Ver Perfil
Re: variables en batch
« Respuesta #1 en: 11 Febrero 2015, 18:54 pm »

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:
Código:
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 Desconectado

Mensajes: 48


Ver Perfil
Re: variables en batch
« Respuesta #2 en: 11 Febrero 2015, 19:18 pm »

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
Citar
(`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 Desconectado

Mensajes: 9.885



Ver Perfil
Re: variables en batch
« Respuesta #3 en: 11 Febrero 2015, 20:04 pm »

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:
Código:
(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 Desconectado

Mensajes: 48


Ver Perfil
Re: variables en batch
« Respuesta #4 en: 20 Febrero 2015, 14:35 pm »

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
Código:
%%i 
no puedo hacer un
Código:
 set %result%=%%i
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
Código:
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
Código:
select count(*) from tabla 
no se como subir la imagen, pero mueStra algo asi como ESTO
Código:
COUNT
--------
       0
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 >:D
« Última modificación: 20 Febrero 2015, 15:30 pm por crisoof » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: variables en batch
« Respuesta #5 en: 20 Febrero 2015, 15:31 pm »

no puedo hacer un
Código:
 set %result%=%%i
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 >:D

Código:
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:
Código:
setx "nombre" "valor"
(es necesario reiniciar la instancia de la CMD para que los cambios surjan efecto)

Saludos
En línea



crisoof

Desconectado Desconectado

Mensajes: 48


Ver Perfil
Re: variables en batch
« Respuesta #6 en: 20 Febrero 2015, 15:42 pm »

Muchas gracias Master!!, voy a probar que tal y sino molesto de nuevo xD...
VUELVO

PUES NO ME RESULTO XD, ME SIGUE INDICANDO QUE EL ECHO NO ESTA ACTIVO, ES LO MISMO QUE ME INDICABA ANTES

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
)

eso es para probar y lo usare asi
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"
"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 Desconectado

Mensajes: 9.885



Ver Perfil
Re: variables en batch
« Respuesta #7 en: 20 Febrero 2015, 16:34 pm »

¿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:
Citar
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
)
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:
Código:
CALL ECHO %%VALUE%%


EDITO 2: Te muestro un ejemplo funcional:

Script1.cmd
Código
  1. @Echo OFF
  2.  
  3. For /F "Tokens=* Delims=" %%# In (
  4. 'Echo 123'
  5. ) Do (
  6. Set /A "var=%%#"
  7. Call Echo Variable dentro del FOR="%%Var%%"
  8. Call ".\Script2.cmd"
  9. )
  10.  
  11. Pause&Exit

Script2.cmd
Código
  1. @Echo OFF
  2.  
  3. Echo Variable desde otro script="%var%"
  4.  
  5. Exit /B 0

Saludos
« Última modificación: 20 Febrero 2015, 16:47 pm por Eleкtro » En línea



crisoof

Desconectado Desconectado

Mensajes: 48


Ver Perfil
Re: variables en batch
« Respuesta #8 en: 20 Febrero 2015, 16:59 pm »

ELEKTRO USO EL USEBACKQ, PORQUE SE VEZ EN EL FOR

Código:
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
Código:
%path_sql%
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 Desconectado

Mensajes: 9.885



Ver Perfil
Re: variables en batch
« Respuesta #9 en: 20 Febrero 2015, 18:18 pm »

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:

Código
  1. @Echo OFF
  2.  
  3. REM Declaro una variable que almacenará el valor de la variable 'path_sql', pero sin comillas dobles, las elimino.
  4. Set sqlPath=%path_sql%
  5. Set sqlPath=%sqlPath:"=%
  6.  
  7. For /F "Tokens=* Delims=" %%a In ('""sqlplus.exe" -s QA_DATAC/qa_dc@orcl_qa @^'%sqlPath%^'ESTADISTICA | "FindStr.exe" "[0-9]""') Do (
  8. Echo %%~a
  9. )
  10.  
  11. Pause&Exit /B 0

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



Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Variables dentro de variables (batch)
Scripting
MK-Ultra 8 7,912 Último mensaje 6 Febrero 2008, 23:18 pm
por GUN$
Variables batch y vb
Programación Visual Basic
gdegrau 3 2,387 Último mensaje 27 Enero 2009, 20:03 pm
por krackwar
[BATCH] ¿Como puedo meter variables dentro de variables?
Scripting
Meine programmen 1 4,192 Último mensaje 24 Marzo 2012, 16:48 pm
por Eleкtro
Variables en BATCH « 1 2 »
Scripting
crazykenny 17 8,717 Último mensaje 26 Enero 2014, 11:10 am
por crazykenny
Variables Batch en C++
Programación C/C++
OmarHack 2 2,025 Último mensaje 19 Julio 2014, 01:56 am
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines