duda con FOR

Iniciado por crisoof, 24 Febrero 2015, 13:26 PM

0 Miembros y 1 Visitante están viendo este tema.

crisoof

hola nuevamente xD, volvi con mis preguntas raras xD

tengo el siguiente codigo
@echo off
echo    éíííííííííííííííííííííííííííííííííííííííííííííííííííííííííí»
echo    º       shapes de los errores encontrados en archivos      º
echo    èíííííííííííííííííííííííííííííííííííííííííííííííííííííííííí¼

for /f "delims=! usebackq" %%c in (`sqlplus -s %conexion% @%path_sql%t`) do set res=%%c
fme.exe %path_fme%errores_archivos.fmw --comuna %res% --destdataset_oracle8i_db orcl_qa --out_user qa_datac --out_password qa_dc
echo  %res%
pause


los -- indican que viene un parametro, luego el nombre del parametro y el valor para el parametro
la %path_fme% ruta donde esta almacenado el archivo para que se ejecute con el programa fme
la %path_sql% es la ruta donde se almacenan los archivos de extension .sql osea las querys para la BD

el asunto es que el for no se cierra solo, me pide cerrarlo a mano escribiendo exit cuando el bat esta ejecutandoce y si al bat le dejo escrito exit me termina el bat, hay alguna forma de obligar a cerrar el for?

t solo es una consulta que dice select nombre_comuna from var_comuna (var comuna mi tabla), este valor lo rescato y se lo paso a %res% quien llenara comuna que servirá para hacer un log del programa fme
eso muchas gracias, ojala que lo pueda cerrar o me puedan orientar por que no se cierra solo el for....

Ahh se me olvidaba el For no tiene las llaves o parentesis () porque si le pongo los parentesis si o si me pedira que lo cierre yo mismo y luego de eso pasa al siguiente bat, en todos los otros bat al dejarlo sin los paréntesis termina de iterar y vuelve al for que lo llamo o sigue con lo siguiente

gracias, :silbar:
Saludos

EDITO: lo modifique para explicar un poco mejor unas variables  y unas comas que le daban otro sentido a mi explicacion

Eleкtro

#1
1. En la expresión del FOR debes utilizar la comilla ' para encerrarla, no este caracter de acentuación `


2. Batch no puede "pedir el cierre de de un bloque de código abierto añadiendo el comando Exit", especifica claramente cual es el mensaje de error que se muestra en consola (aunque obviamente el mensaje sea un error de sintaxis).


3. El bloque del FOR deberías tratar de cerrarlo usando los operadores de agrupación () más que nada para no caer en malas prácticas de programación que conllevan inevitablemente a posibles errores de ejecución (sobre todo de sintaxis, al concatenar comandos en un bloque abierto de FOR), cierra el bloque sí o sí.

Si tras cerrarlo tienes algún problema/error, especifica el error e intenta solucionarlo por los medios adecuados que no sea dejar abierto el bloque del FOR.
Puedes empezar por encerrar también la variable, ya que no estás utilizando la sintaxis apropiada y dependiendo de las circunstancias (el valor de %%c) eso puede resultar en conflictos de sintaxis.

For /F ... In (...) Do (Set "res=%%c")


4. Ten en cuenta que, en caso de que la variable "%path_sql%" no contenga comillas dobles al principio y al final, y si además la ruta contuviese caracteres reservados por el sistema (ej: C:\Program Files (x86)\sql\ ) entonces ahí tienes el motivo del error, o mejor dicho del cierre inesperado de la consola, debido a un conflicto de sintaxis al intentar parsear los falsos operadores de agrupación por haber dejado la cadena de string abierta, para solucionarlo, encierra el string debidamente.


5. Aplica también las mismas reglas de cierre de string a esta instrucción (repito, en caso de que no estén cerrados, porque por lo que muestras no lo puedo saber:
Citarfme.exe %path_fme%errores_archivos.fmw --comuna %res% --destdataset_oracle8i_db orcl_qa --out_user qa_datac --out_password qa_dc

Por norma general las rutas con espacios en el nombre deben encerrarse usando comillas dobles para poder pasarlo como argumento, ya que cada argumento está delimitado por un espacio y por ende una ruta abierta y con espacios será una ruta dividida en varios argumentos para la aplicación, la ruta completa será irreconocible debido a que el recuento de parámetros será incorrecto.

Lo mismo se aplica a cualquier valor de string que quieras pasarle a un parámetro (tenga o no espacios, es lo correcto):
fme.exe "%path_fme%errores_archivos.fmw" --comuna "%res%" --destdataset_oracle8i_db "orcl_qa" --out_user "qa_datac" --out_password "qa_dc"

Saludos








crisoof

#2
1. modificado el codigo a lo que deberia estar correcto como buena practica
Código (dos) [Seleccionar]
@echo off
echo    ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
echo    º           SHAPES DE LOS ERRORES ENCONTRADOS              º
echo    ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ


For /F "Tokens=* Delims=" %%a In ('""sqlplus.exe" -s QA_DATAC/qa_dc@orcl_qa @%sqlPath%t"')  do (set res=%%c
fme.exe "%PATH_FME%SHAPE_ERRORES.fmw" --COMUNA "%res%" --DestDataset_ORACLE8I_DB "ORCL_QA" --OUT_USER "QA_DATAC" --OUT_PASSWORD "qa_dc"
)

quedo en la misma face que el anterior, ejecuta todo sin problemas hasta que tiene que cerrarse el for de echo, si lo analizo bn esto queda pausado antes de llamar al programa FME.EXE

Cita de: Eleкtro en 24 Febrero 2015, 14:41 PM
2. Batch no puede "pedir el cierre de de un bloque de código abierto añadiendo el comando Exit", especifica claramente cual es el mensaje de error que se muestra en consola (aunque obviamente el mensaje sea un error de sintaxis).
R.- la consola no me muestra ni un error, la consola no se cierra, sigue ejecutando mi programa, si no escribo nada, queda eternamente ahi, el prompt puede escribir o saltar espacios, solo despues que escribo exit, sigue con la parte que falta del bat

Cita de: Eleкtro en 24 Febrero 2015, 14:41 PM
3. El bloque del FOR deberías tratar de cerrarlo usando los operadores de agrupación () más que nada para no caer en malas prácticas de programación que conllevan inevitablemente a posibles errores de ejecución (sobre todo de sintaxis, al concatenar comandos en un bloque abierto de FOR), cierra el bloque sí o sí.
R.- corregido en pto 1

Cita de: Eleкtro en 24 Febrero 2015, 14:41 PM
4. Ten en cuenta que, en caso de que la variable "%path_sql%" no contenga comillas dobles al principio y al final, y si además la ruta contuviese caracteres reservados por el sistema (ej: C:\Program Files (x86)\sql\ ) entonces ahí tienes el motivo del error, o mejor dicho del cierre inesperado de la consola, debido a un conflicto de sintaxis al intentar parsear los falsos operadores de agrupación por haber dejado la cadena de string abierta, para solucionarlo, encierra el string debidamente.
R.-no se cuales serian las palabras reservadas del sistema, para evitar esto en la declaracion le coloco las "" o al momento de usar esta variable la uso con "" ?... de todas maneras la ruta que tienen todas las path_XX es \\111.111.11.111\qa_datac\ENTRADA\

si esta variable tiene que ser usada con "", como se esta usando en el mismo ejemplo, deberia tener comillas por si sola? me explico
Código (dos) [Seleccionar]
DEL ""%PATH_SQL%"ESTADISTICA.SQL"--¿?

Cita de: Eleкtro en 24 Febrero 2015, 14:41 PM
5. Aplica también las mismas reglas de cierre de string a esta instrucción (repito, en caso de que no estén cerrados, porque por lo que muestras no lo puedo saber:
Por norma general las rutas con espacios en el nombre deben encerrarse usando comillas dobles para poder pasarlo como argumento, ya que cada argumento está delimitado por un espacio y por ende una ruta abierta y con espacios será una ruta dividida en varios argumentos para la aplicación, la ruta completa será irreconocible debido a que el recuento de parámetros será incorrecto.

Lo mismo se aplica a cualquier valor de string que quieras pasarle a un parámetro (tenga o no espacios, es lo correcto):
fme.exe "%path_fme%errores_archivos.fmw" --comuna "%res%" --destdataset_oracle8i_db "orcl_qa" --out_user "qa_datac" --out_password "qa_dc"
R.- Modificado tambien en Pto 1



PERDÓN PERDÓN  :-[ :-[ :-[ :-[ ;D ;D ... EL ERROR NO ESTA EN EL FOR, me dedique a verificar si estaba bn, porque al hacer las modificaciones que me indicasteme di cuenta que tambien funcionaba la llamada al programa FME, le puse pauses por doquier xD, hasta que di con el error, no se si es que me puedes ayudar porque es una mezcla entre Sql y el Bat tengo un codigo gigante, solo te mostrare el error para no marear
Código (dos) [Seleccionar]
DEL "%PATH_SQL%ESTADISTICA.SQL"
ECHO EXEC SP_VALIDACION_GEOMETRIAS;>>"%PATH_SQL%ESTADISTICA.SQL"
ECHO EXIT>>"%PATH_SQL%ESTADISTICA.SQL"
sqlplus %conexion% @%PATH_SQL%ESTADISTICA.SQL

sqlplus %conexion% @%PATH_SQL%COUNT.SQL rem <-- el desgraciado esta aca
CALL "%PATH_SCRIPT%VAR_ERRORES.BAT" rem --> aqui pense que estaba el error


eso que vez, es una llamada una query de oracle, conexion tiene la contraseña/user/service @bla...bla es la llamada a count que es un archivo almacenado en la ruta que esta en Path_SQL, el archivo tiene esccrito esto
Código (sql) [Seleccionar]
select count(*) from errores_geom; -- en oracle las sentencias se terminan con un ;
/* en la segunda linea dice */ exit -- sin ;
el exit es para que pueda salir de la llamada desde el bath, pero no la esta tomando, aqui es donde te pido ayuda a ti, se supone que escribiendole al archivo exit sale de la query, pero no lo hace, me hecharias una mano? que puede ser?
Saludos y perdon por la equivocacion de antes... aaa de todas maneras me puedes responder lo que esta en Rojo en el punto 4, para saber para una, siguiente vez

Saludos y gracias por tu ayuda y sorry por la mezcla de etiquetas, intente dejarlo ordenado pero parece que no me funciono xD...Ahi si, tenia una etiqueta de citar de mas

Eleкtro

Cita de: crisoof en 24 Febrero 2015, 16:45 PMde todas maneras me puedes responder lo que esta en Rojo en el punto 4, para saber para una, siguiente vez

Tanto al declararla:
Set "Var=C:\ruta con espacios"

Cómo al usarla:
Echo "%Var%"

Las comillas dobles en la declaración son para evitar errores de sintaxis, no para añadirle comillas dobles al string, ej:

Bien:
Set "Var=C:\ruta con espacios" & Echo ready

Mal:
Set Var=C:\ruta con espacios & Echo ready

Saludos