[DUDA xD]IF Dentro De Un FOR?[SOLUCIONADO!]

Iniciado por FranciskoAsdf, 7 Octubre 2009, 16:52 PM

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

FranciskoAsdf

Hola Yo De Nuevo u.u...... tengo una duda dudosa xD, se puede hacer una compracion  si una variable está vacía dentro de un FOR ?  Ej:

Código (dos) [Seleccionar]

For /F "Tokens=1,2 Delims=;" %%f In ('Type "Listado_Clientes.csv" ^| Find "%Rut_Cliente%"') Do (
If "%%f"=="" (Echo.&Echo Cliente No Encontrado.-&Pause >Nul 2>&1& Goto :BuscarClientes)
Echo.
Echo Rut Nombre cliente
Echo %%f %%g
Pause >Nul 2>&1
Goto :BuscarClientes
)


Por ejemplo ahí después de hacer el FOR en el archivo, quiero saber si la variable quedó vacía o no, para así poder saber si existe o no el cliente en el archivo, pero no hace la comparación u.u y solo me da los dos pauses  :-\, también probé con:

Código (dos) [Seleccionar]

For /F "Tokens=1,2 Delims=;" %%f In ('Type "Listado_Clientes.csv" ^| Find "%Rut_Cliente%"') Do (
If Not "%%f"=="" (
Echo.
Echo Rut Nombre cliente
Echo %%f %%g
Pause >Nul 2>&1
Goto :BuscarClientes
) ELSE (
Echo.&Echo Cliente No Encontrado.-&Pause >Nul 2>&1& Goto :BuscarClientes
)
)


Pero ahí si que se cae el código xD, entonces ..... mi pregunta es ...

¿Cómo puedo saber si la variable %%f está vacía?, o ¿Cómo saber si no se encontró el cliente?


..........


Muchas Gracias de ante mano y saludos  :-[ :-[
Asdf debería ser algún tipo de función.

Guerrerohgp

ahora mismo se me ocurre q actives las variables retrasadas (setlocal) y en el for hagas un
set var=%%f
if not defined var (blablabla)


asi se sabe si la variable var esta vacia. otra forma es hacer un
call:etiqueta %%f %%g


y detectar con %1 y %2 si las variables estan con algo a vacias con el if "%1"==""

suerte! ;D


FranciskoAsdf

No Me Funciona la primera, porke no tengo idea de como usar las variables retardadas :S

y el segundo lo aplique ais y tampoco me funciona

Código (dos) [Seleccionar]

For /F "Tokens=1,2 Delims=;" %%f In ('Type "Listado_Clientes.csv" ^| Find "%Rut_Cliente%"') Do (
Call :SalidaFor %%1 %%2
)
:SalidaFor
If "%%1"="" (Echo Esta wea esta vacia xD&Pause&Goto :Eof)
Echo Rut Nombre cliente
Echo %%f %%g


y al ejecutarlo con un rut que no existe en la planilla me sale el siguiente error


Escriba "menu" (sin las comillas) para volver al menu principal.-
Ingrese El Rut Del Cliente Que Necesita Buscar.-

Rut: 5.555.555-5

Buscando Espere...
El sistema no puede hallar el archivo especificado.
No se esperaba ="" en este momento.


no hay alguna otra forma D:?

muchas gracias de todas maneras u.u
Asdf debería ser algún tipo de función.

flony

a ver en esto aprendiz...pero la variable tengo entendido la guarda en la ram..hasta q no apagues la pc o le des de vuelta un valor...va a seguir teniendo el mismo valor deberias tratar con un goto y un set darle un valor cero..asi estarias seguro...digo si estoy equivocado me avisan
si un problema no tiene solucion entonces no es un problema...es algo inevitable

Guerrerohgp

#4
companero creo q tu for esta mal deberias de poner junto al call
%%f %%g

y en la etiqueta
If "%1"=""

a ver si te funka. suerte!! ;D

edito para no doble post

tambien para el echo seria echo %1 %2

en ves de %%f %%g

0x5d

Yo Uso Call :etiqueta %%A
Simplifica todo.


Saludos.
¡ SIGUEME EN TWITTER -> @JavierEsteban__ !

FranciskoAsdf

Cita de: Guerrerohgp en  8 Octubre 2009, 04:07 AM
companero creo q tu for esta mal deberias de poner junto al call
%%f %%g

y en la etiqueta
If "%1"=""

a ver si te funka. suerte!! ;D

edito para no doble post

tambien para el echo seria echo %1 %2

en ves de %%f %%g

Lamentablemente no me funciona u.u, de todas maneras gracias .... saludos y gracias por intentar ayudarme.
Asdf debería ser algún tipo de función.

Aranguez

#7
Hola Panxin,
ajusta este codigo al tuyo y pruebalo

SET ESTA=NO

For /F "Tokens=1,2 Delims=;" %%f In ('Type "Lista.txt" ^| Find /I "%Rut_Cliente%"') Do (
SET ESTA=SI
ECHO AQUI VA EL PROCESO CUANDO EXISTE
)

IF %ESTA% ==NO ECHO AQUI PROCESAS SI NO EXISTE "%Rut_Cliente%"

Por cierto me podrías explicar esta instrucción que tienes al final de tu codigo?, el pause se que da una pausa pero el resto no lo entiendo.

Pause >Nul 2>&1

Saludos

xassiz_

>nul
Envía la salida a nul, es decir, a la nada.

Por eso si pones:
pause>nul
No muestra el mensaje de Presione una tecla para continuar . . .

2>&1

Pues tiene que ver con los operadores de redireccion, pero con controladores.

La siguiente tabla muestra los operadores que se pueden utilizar para redirigir la entrada y la salida de los comandos.

Operador de redirección   Descripción
>    Escribe la salida del comando en un archivo o un dispositivo, en lugar de en la ventana del Símbolo del sistema.
<     Lee la entrada del comando desde un archivo, en lugar de leerla desde el teclado.
>>     Añade la salida del comando al final de un archivo sin eliminar la información que ya está en el archivo.
>&     Escribe la salida de un controlador en la entrada de otro controlador.
<&     Lee la entrada desde un controlador y la escribe en la salida de otro controlador.
|     Lee la salida de un comando y la escribe en la entrada de otro comando. También se denomina canalización.

De forma predeterminada, la entrada del comando (es decir, el controlador STDIN) se envía desde el teclado a Cmd.exe y, a continuación, Cmd.exe envía la salida del comando (es decir, el controlador STDOUT) a la ventana del Símbolo del sistema.

La siguiente tabla muestra los controladores disponibles.

Controlador Equivalente numérico del controlador Descripción
STDIN    0 Entrada de teclado
STDOUT   1 Salida en la ventana del Símbolo del sistema.
STDERR    2 Salida de errores en la ventana del Símbolo del sistema.
UNDEFINED 3-9 Estos controladores están definidos individualmente por la aplicación y son específicos para cada programa.

Bien eso es redireccion de la entrada y salida de los comandos...
Se usa 2>&1 por que 2 si es que leiste lo que puse arriba es STDERR osea que si ocurre un error no se mostrara ya que redirije el error ha &1...



YXVuIGVyZXMgbWF0YWRvIHBhcmEgcG9uZXJ0ZSBhIGRlc2NpZnJhciBlc3RvIHhE

FranciskoAsdf

Cita de: xassiz en 10 Octubre 2009, 20:16 PM
>nul
Envía la salida a nul, es decir, a la nada.

Por eso si pones:
pause>nul
No muestra el mensaje de Presione una tecla para continuar . . .

2>&1

Pues tiene que ver con los operadores de redireccion, pero con controladores.

La siguiente tabla muestra los operadores que se pueden utilizar para redirigir la entrada y la salida de los comandos.

Operador de redirección   Descripción
>    Escribe la salida del comando en un archivo o un dispositivo, en lugar de en la ventana del Símbolo del sistema.
<     Lee la entrada del comando desde un archivo, en lugar de leerla desde el teclado.
>>     Añade la salida del comando al final de un archivo sin eliminar la información que ya está en el archivo.
>&     Escribe la salida de un controlador en la entrada de otro controlador.
<&     Lee la entrada desde un controlador y la escribe en la salida de otro controlador.
|     Lee la salida de un comando y la escribe en la entrada de otro comando. También se denomina canalización.

De forma predeterminada, la entrada del comando (es decir, el controlador STDIN) se envía desde el teclado a Cmd.exe y, a continuación, Cmd.exe envía la salida del comando (es decir, el controlador STDOUT) a la ventana del Símbolo del sistema.

La siguiente tabla muestra los controladores disponibles.

Controlador Equivalente numérico del controlador Descripción
STDIN    0 Entrada de teclado
STDOUT   1 Salida en la ventana del Símbolo del sistema.
STDERR    2 Salida de errores en la ventana del Símbolo del sistema.
UNDEFINED 3-9 Estos controladores están definidos individualmente por la aplicación y son específicos para cada programa.

Bien eso es redireccion de la entrada y salida de los comandos...
Se usa 2>&1 por que 2 si es que leiste lo que puse arriba es STDERR osea que si ocurre un error no se mostrara ya que redirije el error ha &1...


muchas gracias por explicar xassiz, no tenia idea del "porque" se usaba asi la redireccion ^^

saludos y voy a probar la opcion de aranguez :)
Asdf debería ser algún tipo de función.