Consulta sobre comandos dentro de FOR [RESUELTO!]

Iniciado por plancha_hd, 7 Octubre 2014, 16:55 PM

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

plancha_hd

Buenas tardes gente del foro, pongo un nuevo tema porque luego de buscar mucho por los ya creados y por el resto de internet no encontre respuesta a mi problema. Caculo debe ser bastante simple, pero batch me tiene a mal traer.

El tema es asi, quiero guardar la salida de un comando en una variable, para lo cual entiendo tengo que usar la siguiente estructura:

Código (DOS) [Seleccionar]
For /F "Tokens=*" %%# in ('comando1 ^| comando2') Do (Set "Variable=%%#").

El problema es que cuando el comando es "echo", el Do cambia de color y no toma el for. Siendo mas puntual, quiero hacer:

Código (DOS) [Seleccionar]
FOR /F %%A IN ( ' echo %%A  ^| grep -o ../../ ' ) DO ( set variable=%%A) y no me funciona, de por si lo que necesito leer esta en un txt, probe concatenando dos for, ejemplo:


Código (DOS) [Seleccionar]
 FOR /F %%A IN ( ' prueba.txt ' ) DO (
                       FOR /F %%B IN ( ' echo %%B  ^| grep -o ../../ ' ) DO (
                                 set variable=%%B)
            )  


y nada, probe muchas alternativas pero no logro conseguir que lo que tengo en un txt, me lo guarde formateado en una variable para poder trabajar.

Espero haber sido claro y agradezco de antemano cualquier ayuda!.

Saludos

Eleкtro

Buenas

1) ¿Estás utilizando la aplicación externa Grep, el puerto para Windows?

2) ¿Cual es la intención del parámetro -o de Grep, que se supone que debe conseguir?

Para leer el contenido de un archivo de texto has de utilizar el comando Type, no Echo.

Código (dos) [Seleccionar]
For /F "UseBackQ Tokens=* Delims=" %%# In (
"Archivo.txt"
) Do (
Echo %%~#
)



Si tu intención es añadir más de una linea de texto a una variable entonces debes saber que Batch no soporta variables multilinea por naturaleza, es un lenguaje muy simple y debes recurrir a un pequeño hack para conseguirlo, y si piensas trabajar una variable multilinea lo tendrás algo dificil para manejarla de forma natural como se haria en otro lenguaje.

@Echo OFF & setlocal EnableDelayedExpansion

REM Dejar un espacio de 2 lineas vacias:
set NewLine=^


REM Fin de las lineas vacias.

set "MultiLine="

For /F "UseBackQ Tokens=* Delims=" %%# In (
"Archivo.txt"
) Do (
 Set "MultiLine=!MultiLine!%%#!NewLine!"
)

Echo !MultiLine!

Pause&Exit /B 0


Saludos








plancha_hd

De antemano mil gracias por la ayuda Elektro!.

1) Si, grep de gnuwin32 porque me estaba volviendo loco para formatear la salida jeje.
2) -o es "only-matching", o sea, muestra solo lo que coincide con la condición que le doy, en mi caso "../../".

Mi primer error es el que me marcas, creo que va type no echo en lo que quiero hacer.
Creo que en realidad no necesito variables multilinea, la cosa es asi:

En un txt tengo las fechas de creación de unos archivos que tiene un directorio (las extraje con forfiles), luego quiero leer el archivo e ir guardándolas en una variable para trabajar, porque no todas las fechas me sirven, entonces mi idea es recorrer el txt y aquellas fechas que no sean "01/**/" las guarde aparte (en otro txt por ejemplo), porque una vez pasada esa condición voy a borrar todos los archivos que contengan la fecha que tiene ese ultimo txt. No se si necesito multilinea porque el contenido de la variable quiero que cambie con cada iteracion del for. Espero haber podido explicarme mejor.

Muchas gracias por ayudar!. Saludos!

Eleкtro

#3
Cita de: plancha_hd en  7 Octubre 2014, 20:52 PMMi primer error es el que me marcas, creo que va type no echo en lo que quiero hacer.

Ahora que reviso el código que te mostré, se me olvidó comentar que en un For no es necesario usar el comando Type para leer el contenido de un txt (un ejemplo, el For que te mostré), pero en el For que tu usase si, debiste user Type en lugar de Echo para pasarle la salida a Grep, con Echo solo estás escribiendo el nombre del archivo, no accediendo a su contenido.


Cita de: plancha_hd en  7 Octubre 2014, 20:52 PMCreo que en realidad no necesito variables multilinea, la cosa es asi:

En un txt tengo las fechas de creación de unos archivos que tiene un directorio (las extraje con forfiles), luego quiero leer el archivo e ir guardándolas en una variable para trabajar, porque no todas las fechas me sirven, entonces mi idea es recorrer el txt y aquellas fechas que no sean "01/**/" las guarde aparte (en otro txt por ejemplo), porque una vez pasada esa condición voy a borrar todos los archivos que contengan la fecha que tiene ese ultimo txt. No se si necesito multilinea porque el contenido de la variable quiero que cambie con cada iteracion del for. Espero haber podido explicarme mejor.

Pues no, ahora que has explicado lo que pretendes hacer, si tu intención es filtrar un txt para pasar unas fechas a otro txt no necesitas usar variables, ni siquiera necesitas Grep, ya que puedes utilizar el comando FINDSTR.

Ejemplo:
Código (dos) [Seleccionar]
(Type "Fechas.txt" | Findstr /V "^01\/..\/....$")> "Nuevo.txt"


Fechas.txt

01/01/2011
12/10/2012
01/07/2012
10/09/2013
30/10/2010
01/12/2010
01/03/2014
18/05/2014
01/07/2014
19/11/2014


Nuevo.txt
12/10/2012
10/09/2013
30/10/2010
18/05/2014
19/11/2014


Saludos.








plancha_hd

SIIIIIII   ;D ;D ;D ;D me funciono!!, era justo lo que quería!. Mil gracias por la enorme mano que me diste, dos días entero busque data de como hacer.

Copio y pego como me quedo el código del for por si a alguien mas le resulta útil, porque le hice mínimas modificaciones porque no me buscaba bien:

FOR /F %%A IN ( Viejo.txt ) DO (
( Type Viejo.txt | Findstr /V ^01/../.... ) > Nuevo.txt )
type nuevo.txt | sort



Saludos, y gracias again!