maccox
Goto Top

In einer xml Liste eingetragene URLs per cURL laden - 1. geht, wie Schleife drum rum bauen?

Hallo,

ich habe eine einfach xml Liste in der URLs zu Dateien auf meinem Webserver stehen.

Per Batch möchte ich diese jetzt alle auslesen und mit die Dateien per cURL laden, bisher funktioniert das auch soweit, das ich mir eine gewisse Zeile der xml aussuchen kann und dann die dort angegebene Datei geladen wird. Aber wie bekomme ich es hin, das jede enthaltene URL geladen wird, also eine Schleife um die ganze Geschichte?

set "file="  
for /f "tokens=2 delims=<> " %%a in ('more +1 %verzeichnis%%loadlist%') do if not defined file set file=%%a  
echo %file%
for /f "tokens=5 delims=/ " %%a in ("%file%") do if not defined filename set filename=%%a  
curl %file% -o %verzeichnis%%filename%

Hier wird dank 'more +1 %verzeichnis%%loadlist%' die erste Zeile der immer unterschiedlich langen xml ausgelesen.
Jetzt ist nur die Frage wie man alle schön nacheinander in Schleife abarbeiten kann.

Ich denke mal das dürfte nicht allzu schwer sein, aber ich bekomms leider nicht hin face-sad

Gruß, maccoX

Content-ID: 166114

Url: https://administrator.de/forum/in-einer-xml-liste-eingetragene-urls-per-curl-laden-1-geht-wie-schleife-drum-rum-bauen-166114.html

Ausgedruckt am: 22.12.2024 um 16:12 Uhr

Skyemugen
Skyemugen 12.05.2011 um 10:57:50 Uhr
Goto Top
Aloha,

nun, dann eventuell so:
@echo off & setlocal
set "verzeichnis=%temp%\"  
set "loadlist=bla.xml"  
set "file="  
for /f "tokens=2 delims=<> " %%a in ('more +1 %verzeichnis%%loadlist%') do call :Ablauf "%%a"  
pause
goto :eof

:Ablauf
if not defined file set file=%1
echo %file%
for /f "tokens=5 delims=/ " %%a in (%file%) do if not defined filename set filename=%%a  
echo "%filename%"  
curl %file% -o "%verzeichnis%%filename%"  
set file=
set filename=
goto :eof

greetz André

gut, man könnte eigentlich die if not defined-Sachen wegstreichen aber was soll's

edit: Mehr fliegende Zollstöcke ... und einige weg face-smile
maccoX
maccoX 12.05.2011 um 11:35:28 Uhr
Goto Top
Hey,

super, hab jetzt die "1" bei more +1 durch eine Variable ersetzt, die ich im Ablauf hochzähle, damit funktioniert es jetzt wunderbar face-smile

Danke!!!!

Gruß, maccoX
Skyemugen
Skyemugen 12.05.2011 um 11:48:17 Uhr
Goto Top
Aloha,

ah noch etwas, wo ich es gerade noch einmal gelesen habe
Hier wird dank 'more +1 %verzeichnis%%loadlist%' die erste Zeile der immer unterschiedlich langen xml ausgelesen.
... eigentlich wird ja die zweite Zeile und nicht die erste Zeile ausgelesen ;)

greetz André
bastla
bastla 12.05.2011 um 12:28:49 Uhr
Goto Top
... vor allem, weil Du für die erste Zeile ja doch einfach
set /p filename=<"%file%"
verwenden würdest ...

Grüße
bastla
maccoX
maccoX 13.05.2011 um 15:57:33 Uhr
Goto Top
Hallo,

ja damit wird die 2. Zeile ausgelesen, ich meinte ja die 1. "Inhaltszeile" :D


Ich hab allerdings noch ein Problem das mir gerade aufgefallen ist: face-sad

Ich hab auch eine PHP URL mit Variablenübergabe in der xml:
<item>http://meinserver.de/files/test.php?var1=hallo&amp;var2=welt</item>

Bis zum curl Befehl oder sonst wo komm ich damit erst gar nicht, denn schon beim Auslesen aus der XML mit
for /f "tokens=2 delims=<> " %%a in ('more +1 %verzeichnis%%loadlist%') do call :Ablauf %%a  
geht etwas schief. Nach dem Ausschlussprinzip mag die Funktion weder den Stichpunkt, noch das Gleichzeichen oder Undzeichen face-sad
... als einziges Sonderzeichen wird wohl das Fragezeichen geschluckt.

Kann man da was machen? face-sad

Gruß, maccoX
Skyemugen
Skyemugen 13.05.2011 um 16:48:21 Uhr
Goto Top
Aloha,

jo, kann man:
edit siehe Änderung oben im Skript

wobei ... eigentlich überflüssig, denn du kannst ja keinen derartigen Dateinamen anlegen *gg* (das Fragezeichen würde wegfallen)

greetz André

P.S.: sind das nicht eigentlich dann tokens=4 statt 5 in der zweiten Schleife? ...
maccoX
maccoX 14.05.2011 um 10:28:47 Uhr
Goto Top
Hallo,

danke werds gleich mal testen!

Den Dateinamen will ich eigentlich noch mit einem angepassten %filename% abfangen, so das nur noch ein test.php übrig bleibt.


EDIT: Scheint wunderbar zu funktionieren - super face-smile
Leider etwas blöd, dass die PHP Datei ein Verzeichnis höher auf dem Server liegt wie die restlichen Dateien ... sonst wär ich jetzt schon am Ziel, habe nämlich beim 2. Find Befehl bei Delims noch ein "?" rein gemacht - bloß bräuchte ich jetzt halt bei der .php nur Tokens 4, bei den restlichen Dateien immer Tokens 5 ...


Schönes Wochenende,
maccoX
bastla
bastla 14.05.2011 um 10:55:53 Uhr
Goto Top
Hallo macoonX!

Wenn ich das soweit richtig gesehen habe, brauchst Du doch eigentlich nur eine Variable zu verwenden - ungetestet etwa so:
set tok=5
if /i "%~x1"==".php" set tok=4  
for /f "tokens=%tok% delims=/ " %%a in (%file%) do set "filename=%%a"  
Übrigens sollte sich eigentlich %file% durch %1 ersetzen lassen ...

Grüße
bastla
maccoX
maccoX 14.05.2011 um 11:12:45 Uhr
Goto Top
Guten Morgen!

das scheint genau das zu sein was ich brauche, allerdings scheint der if Befehl nicht zu greifen, tok bleibt leider stets 5.

Gruß, maccoX
Biber
Biber 14.05.2011 um 11:32:29 Uhr
Goto Top
Moin maccoX,

Zitat von @maccoX:
..., allerdings scheint der if Befehl nicht zu greifen, tok bleibt leider stets 5.
bastlas Zeile
if /i "%~x1"==".php" set tok=4
...setzt natürlich voraus, dass die Datei mit (möglicherweise) der Endung ".php" auch als Parameter1 übergeben wird.
Wenn die aber in einer anderen variable steht (z.B. %file%) dann musst du den Vergleich im IF-Konstrukt daraufhin anpassen.
... 
REM Ersatz für die bisherige IF ...Zeile
for %%i in (%file%) do if /i "%%~xi"==".php" set tok=4
...

Grüße
Biber
maccoX
maccoX 14.05.2011 um 11:49:19 Uhr
Goto Top
Morgen Biber,

auch mit der Zeile will es irgendwie nicht. Tok ist weiterhin 5.


Gruß
maccoX
Biber
Biber 14.05.2011 um 11:55:22 Uhr
Goto Top
Moin maccoX,

bevor T-Mo uns hier erwischt und uns beide zusammenfaltet:
  • poste bitte deinen JETZERTLE verwendeten Schnipsel ( nicht dass wie von verschiedenen Code-Ständen ausgehen)
  • setze bitte zu Testzwecken in eine der ersten Zeilen ein "echo on", bevor du den Schnipsel vom CMD-Prompt aus startest
  • Setze nach der neuen IF-Zeile ein PAUSE
  • und poste die Ausgabe, die bis zu diesem Punkt auf dem Schirm leuchtet

Grüße
Biber
maccoX
maccoX 14.05.2011 um 12:23:47 Uhr
Goto Top
Hallo Biber,

also hier die bat:
@echo on

set "url=http://meinserver.de/daten/"  
set "verzeichnis=..\daten\"  
set "loadlist=load.xml"  

set zeile=1

for /f "tokens=2 delims=<> " %%a in ('more +%zeile% %verzeichnis%%loadlist%') do call :load "%%a"  
goto :eof

:load
set "filename="  
set /a zeile=zeile+1
set file=%1
echo %file%
set tok=5
for %%i in (%file%) do if /i "%%~xi"==".php" set tok=4   
echo %tok%
pause
for /f "tokens=%tok% delims=/? " %%a in (%file%) do if not defined filename set "filename=%%a"   
echo load "%filename%"  
curl -s %file% -o "%verzeichnis%%filename%"   
goto :eof

...und hier die Ausgabe:

C:\Dokumente und Einstellungen\Administrator\Desktop\ms\fscommand>set "url=http://meinserver.de/daten/"  

C:\Dokumente und Einstellungen\Administrator\Desktop\ms\fscommand>set "verzeichnis=..\daten\"  

C:\Dokumente und Einstellungen\Administrator\Desktop\ms\fscommand>set "loadlist=load.xml"  

C:\Dokumente und Einstellungen\Administrator\Desktop\ms\fscommand>set zeile=1

C:\Dokumente und Einstellungen\Administrator\Desktop\ms\fscommand>for /F "tokens=2 delims=<> " %a in ('more +1 ..\daten\load.xml') do call :load "%a  
"  

C:\Dokumente und Einstellungen\Administrator\Desktop\ms\fscommand>call :load "http://meinserver.de/phps/test.php?var1=hallo&amp;var2=welt"  

C:\Dokumente und Einstellungen\Administrator\Desktop\ms\fscommand>set "filename="  

C:\Dokumente und Einstellungen\Administrator\Desktop\ms\fscommand>set /a zeile=zeile+1

C:\Dokumente und Einstellungen\Administrator\Desktop\ms\fscommand>set file="http://meinserver.de/phps/test.php?var1=hallo&amp;var2=welt"  

C:\Dokumente und Einstellungen\Administrator\Desktop\ms\fscommand>echo "http://meinserver.de/phps/test.php?var1=hallo&amp;var2=welt"  
"http://meinserver.de/phps/test.php?var1=hallo&amp;var2=welt"  

C:\Dokumente und Einstellungen\Administrator\Desktop\ms\fscommand>set tok=5

C:\Dokumente und Einstellungen\Administrator\Desktop\ms\fscommand>for %i in ("http://meinserver.de/phps/test.php?var1=hallo&amp;var2=welt") do if /I "%~xi" == ".php" set tok=4  

C:\Dokumente und Einstellungen\Administrator\Desktop\ms\fscommand>echo 5
5

C:\Dokumente und Einstellungen\Administrator\Desktop\ms\fscommand>pause
Drücken Sie eine beliebige Taste . . .

Gruß, maccoX
bastla
bastla 14.05.2011 um 12:31:12 Uhr
Goto Top
Hallo maccoX!

Du brauchst als Übergabe an das Unterprogramm in diesem Fall ja aber nicht nur den Dateinamen "test.php", sondern auch die Aufrufparameter nach dem "?" - daher müsste die "if"-Zeile dann so aussehen:
echo %file%|findstr /i "\.php">nul && set "tok=4"
Wenn Du gleich noch etwas Ballast abwerfen möchtest, könnte sich das Ganze etwa so darstellen:
@echo off & setlocal

set "url=http://meinserver.de/daten/"  
set "verzeichnis=..\daten\"  
set "loadlist=load.xml"  

for /f "usebackq tokens=2 delims=<> " %%a in ("%verzeichnis%%loadlist%") do call :load "%%a"  
goto :eof

:load
echo %~1
set tok=5
echo %1|findstr /i "\.php">nul && set "tok=4"  
echo %tok%
for /f "tokens=%tok% delims=/? " %%a in (%1) do set "filename=%%a"   
echo load "%filename%"  
curl -s %1 -o "%verzeichnis%%filename%"   
goto :eof
Anmerkung: "echo off", weil ohnehin viele "debug-echo"-Zeilen enthalten sind ...

Grüße
bastla
maccoX
maccoX 14.05.2011 um 13:30:10 Uhr
Goto Top
Hallo Bastla,

jetzt klappt das mit dem Token If - Danke!!


Nur mein Curl will mich jetzt noch ärgern ... einfach nur gemein :D
http://meinserver.de/phps/test.php?var1=hallo&amp;var2=welt
will curl leider nicht laden. Wenn ich "amp;" hinter dem "&" rauslösche, also die Formatierung ändere geht es. Dumm nur, das ich Curl auch unter Mac OS X verwende und dort brauche ich mit dem Applescript und allem eben genau diese "&amp;" Formatierung ... so ein Mist face-sad
... und von den amps gibt es sogar 4 Stück, da ich 5 Variablen an der php dran hängen hab.

Ich vermute mal da kann man so jetzt nichts machen, oder?

Gruß,
maccoX
bastla
bastla 14.05.2011 um 13:38:15 Uhr
Goto Top
Hallo maccoX!

Dann vielleicht so:
@echo off & setlocal

set "url=http://meinserver.de/daten/"  
set "verzeichnis=..\daten\"  
set "loadlist=load.xml"  

for /f "usebackq tokens=2 delims=<> " %%a in ("%verzeichnis%%loadlist%") do call :load "%%a"  
goto :eof

:load
echo %~1
set tok=5
echo %1|findstr /i "\.php">nul && set "tok=4"  
echo %tok%
for /f "tokens=%tok% delims=/? " %%a in (%1) do set "filename=%%a"   
echo load "%filename%"  
set "file=%~1"  
curl -s "%file:amp;=%" -o "%verzeichnis%%filename%"   
goto :eof
Grüße
bastla
maccoX
maccoX 14.05.2011 um 13:50:14 Uhr
Goto Top
Hallo bastla,

wirklich großartig, so ein winziges Stückchen Code und schon ist alles gut face-smile - danke!!


Euch Allen ein großes, großes DANKE! - wirklich super!

Wünsche euch noch ein super Wochenende!

Gruß,
maccoX