Bat que extraiga un fragmento de un .txt a otro archivo

Un servidor web me facilita una información en HTML que descargo mediante wget con la siguiente orden desde uno de mis 2 equipos ( ambos son Windows7SP1, uno x86 Home Premium y el otro x64 Professional que migraré a Windows 10 a principios del año que viene):

Wget -Oinforme.txt "http://www.servidorDeEjemplo.com/InformeNecesario.html/"

El archivo "informe.txt" descargado contiene más de 2000 líneas de las cuales solo me interesa una que tiene una dirección web que tiene el archivo fuente que realmente necesito descargar. El problema es que este servicio genera una dirección aleatoria cada vez que se utiliza, por lo que no es posible apuntar con wget hacia una url concreta. He conseguido asilar las 2000 líneas que no necesito con este código:

type informe.txt | find /i "caducidad" >link.txt

Desgraciadamente, la línea que necesito no comienza al inicio de la línea y se cuelan más caracteres, tanto al inicio de la línea como al final. Para colmo, no puedo filtrar por "http", ya que el archivo "informe.txt" descargado contiene otros enlaces varios los cuales no necesito, además que no siempre es la misma línea (unas veces es la 2105, otras la 1783...) ni la cadena deseada tiene la misma longitud o sigue algún tipo de patrón. Lo único que hace reconocible a esta cadena es la palabra que he puesto en el código anterior. Para acabar de complicarlo, la URL que necesito tiene el símbolo igual en un par de ocasiones. Esto es lo que obtengo al usar el comando Type y filtrarlo al archivo "Link.txt":

<iframe width="1" height="1" frameborder="0" src="http://reports.Servidor.com/Informes/caducidad=Num3r0Al34t0r10;urlget=Dir3cci0nAle4t0r1a/Test/informeNombreAleatorio.zip"></iframe>

Una vez obtenga el archivo limpio, la idea es devolverlo al wget mediante un bat para poder bajar lo que necesito y así realizar toda esta labor de forma desatendida mediante el comando:

Wget -i link.txt

Resumiendo,

He creado Informe.bat que funciona perfectamente, excepto la parte de generar una URL limpia que pasarle al wget:

@echo off
::Nombre de este archivo Informe.bat
::Obtiene el enlace de una URL externa, crea un txt y lo pasa al wget.
Echo.
Echo Obteniendo la URL del informe. Espere por favor...
Wget -Oinforme.txt "http://www.servidorDeEjemplo.com/InformeNecesario.html/"
::Ejecuta el wget desde la misma carpeta donde se encuentra Informe.bat,
::Conecta a la URL del servidor y descarga el archivo HTML con la info
::Necesaria, convirtiendo el HTML a TXT para manejarlo mejor.
Type informe.txt | find /i "caducidad" >link.txt
del informe.txt
::Type quita toda la morralla del fichero Informe.txt dejando solo la
::URL necesaria dentro del archivo link.txt
::Es aqui donde falla mi proceso!
::Finalmente se borra el archivo Informe.txt por no ser necesario.
Cls
Echo Descargando el informe. Puede tardar algunos minutos...
Wget -i link.txt
del link.txt
::Una vez la URL es correcta, se vuelve a ejecutar wget indicando el
::¿Archivo link.txt que contiene el enlace para descargar el .zip que necesito.

A alguien se le ocurre alguna solución para ello?

1 Respuesta

Respuesta
2

Prueba con esto:

1. Añade "setlocal enabledelayedexpansion" al comienzo del bat (sin comillas, claro)

2. Añade antes del segundo Wget lo siguiente:

for /f "tokens=1,2,* delims=;>" %%a in ('type link.txt') do (
set urldir=%%b
set urldir=!urldir:~7!
set urldir=!urldir:~0,-1!
)
Echo ! Urldir! >link.txt

Creo que te funcionará si, como supongo, la url que buscas va precedida de "urlget=" como en tu ejemplo y lo que quieres conseguir como tal url es:

Dir3cci0nAle4t0r1a/Test/informeNombreAleatorio.zip

En otro caso habría que ajustarse al caso concreto, si es posible

El editor de la página, como suele ser habitual, ha modificado alguna cosilla en mi anterior mensaje: la última línea del punto 2, el comando echo, no debe tener ningún espacio entre la "!" y el nombre de la variable "urldir" (a la que le ha puesto en mayúsculas la primera letra, aunque eso no tiene importancia práctica)

MUCHAS GRACIAS por tu respuesta!

Lamentablemente todo continua igual; el archivo link.txt continua teniendo antes de la dirección que necesito aislar el siguiente texto:

<iframe width="1" height="1" frameborder="0" src="

Y detrás de la dirección este otro texto:

"></iframe>

Es decir; lo que necesito es que el archivo link.txt contenga solo esta dirección (es real, solo que modificado el nombre del servicio que uso, así como /Informes/Benny.zip al final de la URL):

http://download.example.com/Protected/expiretime=1429159047;badurl=aHR0cDovL3d3dy5mb3NzaHViLmNvbS9BdWRhY2l0eS5odG1s/81267a46d5d707506775dd2aa4e940e1350a84acf575c84fcb5f1bca7b90624e/Informes/Benny.zip

Por si acaso he hecho alguna cosa incorrecta, aquí tienes el informe.bat resultante tras la modificación que me has sugerido realizar:

Setlocal EnableDelayedExpansion
@echo off
echo Obteniendo la URL del informe. Espere por favor...
wget -Oinforme.txt "http://www.servidorDeEjemplo.com/InformeNecesario.html/"
type informe.txt | find /i "caducidad" >link.txt
del informe.txt
for /f "tokens=1,2,*delims=;>"%%a in ('type link.txt') do (
set urldir=%%b
set urldir=!urldir:~7!
seturldir=!urldir:~0,-1!
)
echo !urldir!>link.txt
cls
echo Descargando el informe. Puede tardar algunos minutos...
wget -i link.txt
del link.txt

Espero ahora sea más entendible. Si necesitas cualquier dato adicional, con gusto puedo facilitártelo!

Nuevamente, GRACIAS!
Benny. 

A ver. Tengo anotado que el contenido del link.txt tal como lo obtienes (con el type y el find) tiene una estructura tipo:

<iframe width="1" height="1" frameborder="0" src="http://reports.Servidor.com/Informes/caducidad=Num3r0Al34t0r10;urlget=Dir3cci0nAle4t0r1a/Test/informeNombreAleatorio.zip"></iframe>

Y la información de la url que necesitas tiene este aspecto:

http://download.example.com/Protected/expiretime=1429159047;badurl=aHR0cDovL3d3dy5mb3NzaHViLmNvbS9BdWRhY2l0eS5odG1s/81267a46d5d707506775dd2aa4e940e1350a84acf575c84fcb5f1bca7b90624e/Informes/Benny.zip

(por cierto que parece que ha pasado por un "ofuscador", pero imagino que si la pones tal cual en el segundo Wget te funciona, ¿verdad?

Deduzco que esta segunda url es la que figuraría tras "urlget=" en el contenido del link.txt.

Si es así habría un ";" más de los que pensaba y podría explicar que no funcionara correctamente. Prueba con esto:

for /f "tokens=1,2,3,* delims=;>" %%a in ('type link.txt') do (
set urldir=%%b%%c
set urldir=!urldir:~7!
set urldir=!urldir:~0,-1!
)
Echo ! Urldir! >Link.txt

Ten cuidado por si vuelve a separar la "!" de "urldir!" en el comando echo (incluso usando un snippet me lo hace a veces.

¡Gracias! 

Vamos por el buen camino!!! Aunque no es la URL entera (la corta después del «badurl=» y al final del .zip sigue estando  «"</ifram » con un espacio después de la m), al menos ya se empieza a notar que algo hace la cadena que me has pasado modificada!

El resultado que obtengo es el siguiente:

aHR0cDovL3d3dy5mb3NzaHViLmNvbS9BdWRhY2l0eS5odG1s/75ebb371bcdb91e3dbfcaea738fa47009638222900ac5986710048815ff21ed8/Informes/Benny.zip"</ifram 

Cuando debería ser:

http://download.example.com/Protected/expiretime=1449168399;badurl=aHR0cDovL3d3dy5mb3NzaHViLmNvbS9BdWRhY2l0eS5odG1s/75ebb371bcdb91e3dbfcaea738fa47009638222900ac5986710048815ff21ed8/Informes/Benny.zip

Seguro que a la tercera va la vencida... Nuevamente, GRACIAS!
Benny.

Asegúrate que el contenido del link.txt obtenido a partir del type y del find tiene la estructura que decías, particularmente en cuanto a ";" y ">" (que son los caracteres que se utilizan como delimitadores en el FOR). Y para controlar los valores de las variables %%a, %%b y %%c puedes añadir sendos ECHO para cada una de ellas antes de formar la variable urldir. Por cierto me acabo de dar cuenta de que debería ser

set urldir=%%b;%%c

En lugar de lo que te puse antes (hay que añadir el ";" que se quitó al considerarlo delimitador). Me interesa mucho el contenido del link.txt original porque intuyo que no responde exactamente a la "estructura" que comentabas. Lo digo porque en mis pruebas funciona correctamente.

Te copio aquí mis pruebas con el link.txt antes y después y el kk2.bat que uso por si te dan una idea de dónde puede estar el gazapo.

D:\BAT>type link.txt
<iframe width="1" height="1" frameborder="0" src="http://reports.Servidor.com/In
formes/caducidad=Num3r0Al34t0r10;urlget=http://download.example.com/Protected/ex
piretime=1429159047;badurl=aHR0cDovL3d3dy5mb3NzaHViLmNvbS9BdWRhY2l0eS5odG1s/8126
7a46d5d707506775dd2aa4e940e1350a84acf575c84fcb5f1bca7b90624e/Informes/Benny.zip"
></iframe>
D:\BAT>type kk2.bat
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2,3,* delims=;>" %%a in ('type link.txt') do (
set urldir=%%b;%%c
set urldir=!urldir:~7!
set urldir=!urldir:~0,-1!
)
echo !urldir! >link.txt
D:\BAT>kk2
D:\BAT>type link.txt
http://download.example.com/Protected/expiretime=1429159047;badurl=aHR0cDovL3d3d
y5mb3NzaHViLmNvbS9BdWRhY2l0eS5odG1s/81267a46d5d707506775dd2aa4e940e1350a84acf575
c84fcb5f1bca7b90624e/Informes/Benny.zip
D:\BAT>

Buenas nuevamente!

Veo que no usamos el mismo contenido dentro del archivo Link.txt. He reproducido tus .bat y me he quedado a cuadros cuando veía que funcionaba, pero al probarlo con mi contenido volvía a fallar y ya veo el motivo; en tus pruebas tienes una doble dirección cuando no debe ser así. Estoy buscando información sobre el comando "For", ya que habitualmente uso Linux y el comando "Trim" soluciona mi problema, pero en Windows (que es donde debo ejecutar esto) no encuentro nada parecido y es por ello el motivo de mi consulta.

Aclárame eso de la "doble dirección" y no te preocupes que en cuanto el formato de los datos esté claro encontraremos la solución.

El FOR es bastante puñetero pero el propio MSDOS te da algo de información si tecleas FOR /?

En el primer .Bat existe esta dirección:

<iframe width="1" height="1" frameborder="0" src="http://reports.Servidor.com/Informes/caducidad=Num3r0Al34t0r10;urlget=http://download.example.com/Protected/expiretime=1429159047;badurl=aHR0cDovL3d3dy5mb3NzaHViLmNvbS9BdWRhY2l0eS5odG1s/81267a46d5d707506775dd2aa4e940e1350a84acf575c84fcb5f1bca7b90624e/Informes/Benny.zip"></iframe>

"http reports Servidor Informes Caducidad"...Bla bla bla... ;urlget= y luego otra que es "download.example..." La dirección correcta que luego hay que recortar debería ser:

<iframe width="1" height="1" frameborder="0" src="http://download.Ejemplo.com/Protected/expiretime=1449175672;badurl=CaracteresVariosDeNumerosYLetrasSinNingunTipoDePatronQuePuedaSerDeterminante/CualquierOtraCosa/Archivo.zip"></iframe>

Como indicaba antes que se me fuera el dedo al botón "Enviar" y dejar mi respuesta a medias,  estoy buscando información sobre el comando "For", ya que habitualmente uso Linux y el comando "Trim" soluciona mi problema, pero en Windows (que es donde debo ejecutar esto) no encuentro nada parecido y es por ello el motivo de mi consulta.

De todas formas, creo que ya estamos MUY cerca de dar con la solución correcta; MUCHAS GRACIAS de nuevo!!! :D

Benny.

Supongo que cuando dices "en el primer Bat" quieres decir "en el primer Link" y entiendo, entonces, que en realidad hay dos "líneas" con el texto "caducidad" en lugar de una como suponía, aunque no veo ese texto en la segunda. ¿Cómo podríamos quedarnos solo con la que interesa? Si tiene algún texto distintivo (por ejemplo que no tenga "geturl") podríamos incluirlo en el comando interno del FOR. Algo como

@echo off
Setlocal enabledelayedexpansion
for /f "tokens=1,2,3,4,5,* delims=> " %%a in ('type link.txt ^| find /V "geturl"') do (
set urldir=%%e
set urldir=!urldir:~5!
set urldir=!urldir:~0,-1!
)
echo !urldir! >link.txt

En este caso mis pruebas son así:

D:\BAT>type link.txt
<iframe width="1" height="1" frameborder="0" src="http://reports.Servidor.com/In
formes/caducidad=Num3r0Al34t0r10;urlget=http://download.example.com/Protected/ex
piretime=1429159047;badurl=aHR0cDovL3d3dy5mb3NzaHViLmNvbS9BdWRhY2l0eS5odG1s/8126
7a46d5d707506775dd2aa4e940e1350a84acf575c84fcb5f1bca7b90624e/Informes/Benny.zip"
></iframe>
<iframe width="1" height="1" frameborder="0" src="http://download.Ejemplo.com/Pr
otected/expiretime=1449175672;badurl=CaracteresVariosDeNumerosYLetrasSinNingunTi
poDePatronQuePuedaSerDeterminante/CualquierOtraCosa/Archivo.zip"></iframe>
D:\BAT>type kk2.bat
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2,3,4,5,* delims=> " %%a in ('type link.txt ^| find /V "geturl"
') do (
set urldir=%%e
set urldir=!urldir:~5!
set urldir=!urldir:~0,-1!
)
echo !urldir! >link.txt
D:\BAT>kk2
D:\BAT>type link.txt
http://download.Ejemplo.com/Protected/expiretime=1449175672;badurl=CaracteresVar
iosDeNumerosYLetrasSinNingunTipoDePatronQuePuedaSerDeterminante/CualquierOtraCos
a/Archivo.zip
D:\BAT>

Ya me dirás.

Realiza tus pruebas SÓLO con esta dirección:

<iframe width="1" height="1" frameborder="0" src="http://download.Ejemplo.com/Protected/expiretime=1449175672;badurl=CaracteresVariosDeNumerosYLetrasSinNingunTipoDePatronQuePuedaSerDeterminante/CualquierOtraCosa/Archivo.zip"></iframe>

Me refiero a que no uses la que indicas, ya que esa dirección no es la correcta (tiene dos veces el HTTP etc etc... y no es válida).

No se cómo agradecerte ya todas las molestias que te estás tomando con este tema!
Benny.

A ver si esto ya vale:

D:\BAT>type link.txt
<iframe width="1" height="1" frameborder="0" src="http://download.Ejemplo.com/Pr
otected/expiretime=1449175672;badurl=CaracteresVariosDeNumerosYLetrasSinNingunTi
poDePatronQuePuedaSerDeterminante/CualquierOtraCosa/Archivo.zip"></iframe>
D:\BAT>type kk2.bat
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2,3,4,5,* delims=> " %%a in ('type link.txt') do (
set urldir=%%e
set urldir=!urldir:~5!
set urldir=!urldir:~0,-1!
)
echo !urldir! >link.txt
D:\BAT>kk2
D:\BAT>type link.txt
http://download.Ejemplo.com/Protected/expiretime=1449175672;badurl=CaracteresVar
iosDeNumerosYLetrasSinNingunTipoDePatronQuePuedaSerDeterminante/CualquierOtraCos
a/Archivo.zip
D:\BAT>

Y no te preocupes, no es molestia. Me divierte bastante

Siiiiiiii!!!!!!
ALELUYAAAAaaaa!!!
JAjajAjAaJajajjj

Ahora funciona a la perfección todo el proceso; eres un genio!
En serio, muchas gracias por tu ayuda. Aunque no entiendo demasiado el comando FOR, prometo estudiarlo más a fondo, ya que veo que has resuelto muchas de tus respuestas con esta orden, así que a buen seguro ha de ser bastante importante. El DOS no me ha ayudado mucho en este sentido, pero seguro que encuentro un manual exhaustivo (me da igual si es en inglés o en español, ya que los entiendo perfectamente) para estudiarlo, comprenderlo y evitar hacer nuevas preguntas, o solo hacerlas cuando ya no sepa (como era este caso) por donde tirar....

En serio, 1000 gracias!
Benny ^_^"

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas