(SOLUCIONADO) [ BATCH ] Ayuda con "findstr"... y contador

Iniciado por SuperDraco, 16 Marzo 2011, 11:55 AM

0 Miembros y 2 Visitantes están viendo este tema.

SuperDraco

Hola, hago este tema aparte porque lo veo distinto, espero que sea lo correcto...

Bueno, el problema es que, a ver... si yo ejecuto este comando:
mplayer 1.mp3 -frames 0

se me muestra esta información:


Yo quiero buscar distintas "frases" ahi dentro como "320.0 kbit" "192.0 kbit" o "224.0 kbit", con findstr, así que para buscar 320.0 kbit hago esto:
mplayer "%%a" -frames 0 | findstr /c:"320.0 kbit"

Pero claro, para buscar todas las frases al mismo tiempo no se hacerlo, porque no las puedo separar con comillas en findstr...
___________________________________________________________________________________________________________

EDITO: Ya he aprendido a separar las busquedas, lo estaba haciendo muy mal, tenía que usar comodines y espacios, pero ahora el problema cambia, necesito hacerlo de un modo distinto, tengo que crear un contador dentro de este comando:

for /f "tokens=*" %%a in ('dir /B *.mp3') do set nombre="%%a" & mediainfo "%%a" | findstr Bit.rate.........................:.320.Kbps >null & call :error

El contador debe sumar el valor de findstr (el numero) desde 161 hasta 320, y comrobarlos todos

Ejemplo:
| findstr 161.kbps >null & call :error
| findstr 162.kbps >null & call :error
| findstr 163.kbps >null & call :error
| findstr ...
| findstr 320.kbps >null & call :error


como leches se hace eso? xDDD
No he vuelto, solo estoy de paso.

leogtz

No te he entendido, por favor, pon un ejemplo.

No puedes buscar "varias" palabras, debes buscar una por una, fijate en la ayuda del findstr, habla solo de una cadena.

Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

SuperDraco

Vale, a ver si esta vez se me entiende xD alargaré un poco la explicación:

Con el comando "mediainfo "%%a"" recibo esta información:



En esa información, el valor del bit rate (el numero) puede cambiar, ahí en la imagen el número es 320,vale, yo lo que necesito es que findstr busque todos los posibles numeros desde el 161 hasta el 320, osea:

161
162
163
...
319
320

Y si encuentra alguno de esos numeros, entonces asignarle una función a realizar.

Esto es posible hacerlo de un modo muy "patata" por ejemplo así

mediainfo "%%a" | findstr 161.kbps 162.kbps 163.kbps

(Y así hasta completar los números hasta el 320)
Pero es una taréa muy tediosa, luego necesitaré aumentar el número final hasta el 1124 en otro comando diferente, no puedo escribir mil veces a mano el número... y sé que esta faena se podría hacer insertando un contador de numeros que vaya probando findstr desde el 161 hasta el 320 en o hasta el que yo le diga. El contador habría que insertarlo dentro del FOR, supongo.

Leo, me he leido bien como usar el findstr, no quiero reectificarte, sé que sabes muchisimo pero me parece que estás equivocado en lo que has dicho porque yo si que puedo buscar varías palabras a la vez...  Usando findstr el punto . se usa como comodín para cualquier caracter, y el espacio para separar palabras/frases que se quieran buscar, esto me permite una busqueda de multiples frases a la vez (al menos a mi si :S)

Espero que ya hayas podido entender mi problema bien está vez, gracias por todo!
No he vuelto, solo estoy de paso.

leogtz

Tú lo que estás buscando es una expresión regular. Investiga sobre eso.

Mira, yo no tengo el comando mediainfo así que si pudieras decirme de donde lo descargo o como lo instalo.

Pero bueno, lo analizaremos con un archivo de texto (er.txt):

CitarC:\>type er.txt
Audio                           : algoooo
Format                          : OK
Format version                  : OK 2
Bit rate                        : 320 Kbps
lkjasd
asd
asd
f
gdfgdfg
345edfgf
dfg
C:\>

Yo quiero buscar la cadeba Bit rate, y obtener los números, bueno:

type er.txt | findstr /r "^Bit rate"

Si quieres los trozos o tokens usas FOR /F.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

SuperDraco

Ok,ya imaginaba yo que el que estaba equivocado no eras tu xD

Perdon, Bueno el mediainfo es un programa, se descarga aqui:

http://mediainfo.sourceforge.net/es/Download/Windows
(La versión CLI para usarla por CMD)


Ahora, con lo que me has dicho, supongo que lo que debo hacer es cortar el "trozo" para mostrar lo que me interesa, a ver, intento esto:

Código (dos) [Seleccionar]
for /f "tokens=*" %%a in ('dir /B *.mp3') do mediainfo "%%a" | findstr /r "^Bit rate" >prueba.txt

Pero el mediainfo me proporciona varías lineas que contienen "Bit rate", asi que en el texto queda esto:

Overall bit rate                 : 320 Kbps
Bit rate mode                    : Constant
Bit rate                         : 320 Kbps
Sampling rate                    : 44.1 KHz



:/
No he vuelto, solo estoy de paso.

leogtz

Mmmm, ya decía yo que el findstr era una ***** para las expresiones regulares.

Prueba con:

... | findstr "^Bit rate"
... | findstr /b "Bit rate"
... | findstr /r "Bit rate"
... | findstr /r "^\<Bit rate"
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

SuperDraco

#6
Porfavor, mirate este código cuando tengas un rato, está mal echo pero se entiende mi mala idea de lo que quiero hacer y quizás sea más fácil asi, pero no se como hacerlo bien para repetir "findstr" con cada numero de "%rate%:



@echo off
Set rate=161

for /f "tokens=*" %%a in ('dir /B *.mp3') do mediainfo "%%a" | findstr Bit.rate.........................:.%rate%.Kbps & call :convertir

:Find Rate
set /a rate+=1
if %rate%=320 pause
goto :eof

:Convertir
IF %ERRORLEVEL% LEQ 0 echo+ %nombre% >> %lista% & coreconverter.exe -infile=%nombre% -outfile=%nombre% -convert_to="mp3 (Lame)" -b 160 --cbr -q 0 -noidtag
No he vuelto, solo estoy de paso.

SuperDraco

#7
Al menos ya he resuelto una parte del problema:

mediainfo "%%a" "--Inform=General;%BitRate%"

Ese comando me devuelve un número, NADA MÁS... asi puedo usar findstr más comodamente (Aunque yo sigo igual XD)

_________________________________________________________________________

EDITO:
Bueno, el código ya va creciendo mucho y me surge una duda importante para que funcione bien...

Fijarse en la cádena "CALL", para acabar su función sin que luego haga el "pause" ¿lo he puesto correctamente? me refiero al "& goto :eof", es que en algunos códigos he visto que se hace así:
|| (Goto :eof) y no puedo comprobarlo del todo bien yo mismo :/...


Call :M4A

:M4A
IF %ERRORLEVEL% LEQ 0 coreconverter.exe -infile="%nombre:~0,-5%.m4a" -outfile="%nombre:~0,-5%.mp3" -convert_to="mp3 (Lame)" -b 160 --cbr -q 0 -noidtag & del /q "%nombre%" & goto :eof

pause
No he vuelto, solo estoy de paso.

SuperDraco

#8
Al final me he decantado por usar findstr de esta manera:

Mediainfo "1.mp3" "--Inform=General;%BitRate%" | findstr "161... 162... 163... 164... 165... 166... 167... 168... 169... 17.... 18.... 19.... 2..... 3....." >nul

Recordemos que mi proposito es buscar los bitrates mayores de 160000...

Si tengo un mp3 de un bitrate de 320 kbps, el comando del mediainfo me devuelve este numero:
320000

Entonces de la forma que uso findstr:
findstr "3....."
Estaría buscando (En mi caso) cualquier número superior al 300000
Osea, Busca que el primer digito sea el 3, y el resto puede ser cualquiera.

¿Me equivoco?

Parece que no me da fallos, lo he probado con todos los bitrates de mis MP3 en distintas maneras y el comando parece que no se equivoca, pero necesito estar seguro antes de probarlo a la ligera y que me destruya mi coleccion de mp3 xD...

Leo espero tu respuesta para que me digas si estoy usando findstr bien aunque no sea la forma más correcta de usarlo, muchas gracias, o quien pueda sacarme de dudas

PD: Aun estoy con la duda del "goto :eof" xD

Y otra cosa, cuando termine mi batch, me gustaría postearlo, puedo hacerlo en esta sección, la de scripting?


Saludos!
No he vuelto, solo estoy de paso.

leogtz

Okay, son las 1:17 am, mañana checo tu duda.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com