schnettl
Goto Top

Variable wird mit Leerzeichen ausgegeben

Hallo,

bin jetzt schon seit einigen Stunden unterwegs um mein Problem zu lösen. Bin bei der Google Suche irgendwie immer wieder bei Euch herausgekommen und hab hier auch schon sehr viel nachgelesen. Problem ist folgendes:

Ich möchte aus einer bestehenden Textdatei eine url herauslesen und diese per wget weiterverarbeiten. Nach dem Studium zahlreicher Artikel hier auf der Seite bin ich jetzt schonmal soweit gekommen:


extract.bat:

type ws1938.txt|find /i "http://vp.video.google.com">info.txt

daraufhin ergibt sich in der Datei Info.txt folgender Inhalt:

url:http://vp.video.google.com/videodownload?version=0&secureurl=
swAAAIPcOXUjtdRa_6NY_rQR8buNnckoMj8-fUxmJljUKWauUcgN49ghAJ
FwfgmI3VoD0rVmUeZQ2smT9Og-vHsxqw5zFM5bNDUSv5xXllLG9u5lGrM
8vKFXiXAOG7ABHmUWQyX_GlY1ccHNkhu-7YfIX69XWw-UifIiD1VVFDTJTLG
_ZgvCgIvdMAimGmWeZJvTDXrOSqciOFSqIZJWSGDJaa12t7nYgfhjJI0ovuu
1b4kI69nDsks8M-CCLx72L3WCmg&sigh=HEcJ2HfIVV00UwMuP5UihSBlxN
c&begin=0&len=535601&docid=3116340055027235185

Das ist schon fast das was ich haben möchte. Störend ist nur das url: vor dem Link. Also hab ich nach einer Lösung gesucht die mir das ganze entfernt und daraus ergab sich folgendes:

delurl.bat:

for /F %%t in (info.txt) do set a=%%t

%a:~4%

Normalerweise müsste mir nun abzüglich der ersten 4 Zeichen der komplette Link angezeigt werden. Heraus kommt aber dieses:

D:\Filme\gvp>set a=url:http://vp.video.google.com/videodownload?version=0&secure
url=swAAAIPcOXUjtdRa_6NY_rQR8buNnckoMj8-fUxmJljUKWauUcgN49ghAJFwfgmI3VoD0rVmUeZQ
2smT9Og-vHsxqw5zFM5bNDUSv5xXllLG9u5lGrM8vKFXiXAOG7ABHmUWQyX_GlY1ccHNkhu-7YfIX69X
Ww-UifIiD1VVFDTJTLG_ZgvCgIvdMAimGmWeZJvTDXrOSqciOFSqIZJWSGDJaa12t7nYgfhjJI0ovuu1
b4kI69nDsks8M-CCLx72L3WCmg&sigh=HEcJ2HfIVV00UwMuP5UihSBlxNc&begin=0&len=535601&d
ocid=3116340055027235185

D:\Filme\gvp>http://vp.video.google.com/videodownload?version=0 & secureurl=swA
AAIPcOXUjtdRa_6NY_rQR8buNnckoMj8-fUxmJljUKWauUcgN49ghAJFwfgmI3VoD0rVmUeZQ2smT9Og
-vHsxqw5zFM5bNDUSv5xXllLG9u5lGrM8vKFXiXAOG7ABHmUWQyX_GlY1ccHNkhu-7YfIX69XWw-UifI
iD1VVFDTJTLG_ZgvCgIvdMAimGmWeZJvTDXrOSqciOFSqIZJWSGDJaa12t7nYgfhjJI0ovuu1b4kI69n
Dsks8M-CCLx72L3WCmg & sigh=HEcJ2HfIVV00UwMuP5UihSBlxNc & begin=0 & len=535601
& docid=3116340055027235185
Der Befehl "http:" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Der Befehl "secureurl" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Der Befehl "sigh" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Der Befehl "begin" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Der Befehl "len" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Der Befehl "docid" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.

Meines erachtens wird die Variable durch zB. das & Zeichen interpretiert und die entsprechenden nachfolgenden Zeichen werden als Befehle verwertet.Weiterhin werden auch an bestimmten Stellen Leerzeichen eingefügt. Mein erster Ansatz war, das ganze mit "delims=§" zu beeinflussen, bzw. mit der token Geschichte. Hat aber alles irgendwie nicht funktioniert.

Einen Teilerfolg brachte mir folgendes:

for /F %%t in (info.txt) do set a=%%t
"%a:~4%

Daraufhin wird die Variable mit vorangestellten " Zeichen in korrekter Form ausgegben, aber es erscheint die Fehlermeldung, dass die eingegebene Zeile zu lang ist. War auch eher nur ein Versuch.

Wäre sehr schön wenn mir jemand helfen könnte. Bin für alle Antworten dankbar.

P.S. Betreffende Dateien die heruterzuladen sind, sollen im Rahmen einer studentischen Arbeit analysiert werden. Sind Videodokumente betreffend der Berichterstattung der USA im 2.WK.

Content-Key: 36618

Url: https://administrator.de/contentid/36618

Printed on: April 16, 2024 at 08:04 o'clock

Member: Biber
Biber Jul 24, 2006 at 21:03:18 (UTC)
Goto Top
Moin schnettl,

willkommen im Forum.

na, da hast Du ja gleich beim ersten Batchproblem mal richtig in die Grütze gefasst...

Da sind mehr als zwei Stolpersteine drin, weil nicht nur das Ampersand-Zeichen "&", sondern auch das Gleichheitszeichen "=" im Batch bzw. für den CMD-Interpreter ein Steuerzeichen ist.

Ich kann Dir daher also keinen Einzeiler als Lösung anbieten, sonst wird es ein bisschen schwer lesbar.

::-------snipp getLongurl.bat
@echo off & set "theUrl="   
set "longurlfile=%temp%\longurl.txt"  
type ws1938.txt|find /i "http://vp.video.google.com">%longurlfile%  
For /f "tokens=1-4 delims=&" %%i in (%longurlfile%) do call :setTheUrl "%%i" "%%j" "%%k" "%%l"  
Set TheUrl=%theUrl:~4%
set TheUrl=%theUrl:"&"=^&%  
set theUrl
REM COMMENT PREVIOUS LINE FOR NODEBUG
goto :eof

:SetTheUrl ...max vier Parameter vorgesehen... also drei Ampersands je Zeile...
:: UNCOMMENT FOR DEBUG echo [1[%~1] [2[%~2] [3[%~3] [4[%~4]
Set TheUrl=%theUrl%%~1
If NOT "%~2"=="" set TheUrl=%theUrl%"&"%~2  
If NOT "%~3"=="" set TheUrl=%theUrl%"&"%~3  
If NOT "%~4"=="" set TheUrl=%theUrl%"&"%~4  
goto :eof
::-------snapp getLongurl.bat

..wenn es Dich interessiert, kann ich Dir den Lösungsansatz auch herleiten.
Probier es auch - es sollte funtionieren.

Ergebnis-Output bzw. Wert der Variablen %TheUrl% bei mir am CMD-Prompt:
(=22:57:07  D:\temp=)
>f:\getlongUrl.bat
TheUrl=http://vp.video.google.com/videodownload?version=0&secureurl=swAAAIPcOXUjtdRa_6NY_rQR8buNncko
Mj8-fUxmJljUKWauUcgN49ghAJFwfgmI3VoD0rVmUeZQ2smT9Og-vHsxqw5zFM5bNDUSv5xXllLG9u5lGrM8vKFXiXAOG7ABHmUW
QyX_GlY1ccHNkhu-7YfIX69XWw-UifIiD1VVFDTJTLG_ZgvCgIvdMAimGmWeZJvTDXrOSqciOFSqIZJWSGDJaa12t7nYgfhjJI0o
vuu1b4kI69nDsks8M-CCLx72L3WCmg&sigh=HEcJ2HfIVV00UwMuP5UihSBlxNc&begin=0&len=535601&docid=31163400550
27235185
...as should do...

Gruß
Biber
Member: schnettl
schnettl Jul 26, 2006 at 18:53:55 (UTC)
Goto Top
Hallo,

hatte gestern Geburtstag, deswegen erst heute die Rückmeldung.
Danke erstmal für das herzliche Willkomen und ganz grosses Kompliment an dich Biber. Habe heute die ganze Sache mal in die Tat umgesetzt und es funktioniert wunderbar. Musste nur die Anzahl der Tokens bisschen hochnehmen und dann hat er die ganze URL genommen. Den nächsten Strich hat mir dann wget durch die Rechnung gemacht. Kommt wohl irgendwie auch nicht ganz mit der Schreibweise der URL klar und interpretiert aus der URL gleich den Remote Ordner zum Speichern der Dateien. Nunja nach einigem probieren hab ich mich dann für Firefox entschieden und dort wird die Datei anstandslos heruntergeladen. Am Ende sieht der ganze Spass so aus:

::-------snipp getLongurl.bat
@echo off & set "theUrl="   
set "longurlfile=d:\filme\gvp\longurl.txt"  
type d:\filme\gvp\006.gvp|find /i "http://vp.video.google.com">%longurlfile%  
For /f "tokens=1-7 delims=&" %%i in (%longurlfile%) do call :setTheUrl "%%i" "%%j" "%%k" "%%l" "%%m" "%%n" "%%o"  
set TheUrl=%theUrl:~4%
set TheUrl=%theUrl:"&"=^&%  
set theUrl
REM COMMENT PREVIOUS LINE FOR NODEBUG

C:\Programme\WEB\Firefox\Firefox.exe "%theUrl%"  

goto :eof



:SetTheUrl ...max vier Parameter vorgesehen... also drei Ampersands je Zeile...
:: UNCOMMENT FOR DEBUG echo [1[%~1] [2[%~2] [3[%~3] [4[%~4] [5[%~5] [6[%~6] [7[%~7]
Set TheUrl=%theUrl%%~1 
If NOT "%~2"=="" set TheUrl=%theUrl%"&"%~2  
If NOT "%~3"=="" set TheUrl=%theUrl%"&"%~3  
If NOT "%~4"=="" set TheUrl=%theUrl%"&"%~4  
If NOT "%~5"=="" set TheUrl=%theUrl%"&"%~5  
If NOT "%~6"=="" set TheUrl=%theUrl%"&"%~6  
If NOT "%~7"=="" set TheUrl=%theUrl%"&"%~7  
goto :eof


::-------snapp getLongurl.bat
Einzige Verbesserung die ich noch vornehmen muss ist die Quelldatei für die URL variabel einzutragen, bzw. mit einer Schleife hochzuzählen. Wird heute wohl nichts mehr werden, warten noch ein paar andere Sachen. Werde das Endergebnis aber bekanntgeben.

Mein besonderer Dank und meine Hochachtung an dich Biber. Hab schon einige einfache Sachen mit Batch gemacht und hab bis jetzt alles soweit zufriedenstellen hinbekommen, aber hierbei wäre ich ohne dich hoffnungslos untergegangen. Werde dein Angebot der Herleitung gern wahrnehmen. Insbesondere die Schleifenverarbeitung, bzw. der Algorithmus interessiert mich, also ab Zeile 4.

MfG

schnettl *jetztabendbrotmachend*
Member: Biber
Biber Aug 03, 2006 at 18:18:30 (UTC)
Goto Top
Na, schnettel,
dann mit ganz viel Verspätung Glückwunsch nachträglich und eine versuchte Herleitung.
Wobei ich nicht so gut im Erklären bin...

Ich geh mal von Deinem angepassten Schnippsel aus:
::-------snipp getLongurl.bat
01 @echo off & set "theUrl="   
02 set "longurlfile=d:\filme\gvp\longurl.txt"  
03 type d:\filme\gvp\006.gvp|find /i "http://vp.video.google.com">%longurlfile%  
04 For /f "tokens=1-7 delims=&" %%i in (%longurlfile%) do call :setTheUrl "%%i" "%%j" "%%k" "%%l" "%%m" "%%n" "%%o"  
...
In der Textdatei %longurlfile% steht ja jetzt eine auf mehrere Zeilen umgebrochene URL wie oben abgebildet.
Würde ich einen "normalen" mehrzeiligen Text als "langen String" in eine Variable packen, wäre es einfacher. Ich könnte zeilenweise auslesen und jede neue Zeile ans Ende der bisherigen Variablen setzen. Beispiel:
..For /F %%i "delims=" in (c:\test\einpaarZeilen.txt) do call :setMyVar %%i
goto :eof
:SetMyVar
Set MyVar=%SetMyVar%%1
:: Lies: Setze Myvar auf %aktuellerInhaltvonMyVar% plus Parameter 1 (==die nächste Zeile)
goto :eof

Das kann ich mit den Zeilen in %longurlfile% aus 2 Gründen nicht machen.
Erstens ist in den Einzelzeilen ein Gleichheitszeichen, welches ich nur als Variableninhalt "transportieren" kann, wenn
- es maskiert wäre (siehe Forumssuche oder meine Batch-Tuts) oder
- wenn in Anführungszeichen eingeschlossen ist.
Zweitens sind auch Ampersands "&" enthalten, die ebenfalls als Steuerzeichen interpretiert werden, sobald sie der CMD.exe vor die Füße fallen.
Zwei Steuerzeichen gleichzeitig kann ich nicht im Auge behalten, also versuche ich eines davon zu eliminieren (vergl J. Caesar; "Divide et impera" oder Aka Wakanabe; "Zen und die Kunst ein Soduku zu lösen").
Ich zerlege also jede Zeile in Einzel-Tokens (=Bestandteile) und gebe als Trennzeichen zwischen Token ein Ampersand an.
Das ist die Klausel "tokens=1-7 delims=&" in der FOR..IN..DO-Anweisung.
Das ich 1-4 Tokens erwarte und Du bis zu 7 Tokens, lässt auf unterschiedliche Grade von Optimismus/Pessimismus bzw Fatalismus/Realismus schließen... aber das würde zu weit führen..

Wo war ich...ach ja...sieben Tokens werden erwartet, die rechts des <b<DO..</b>..herausfallen.
Daher bei einer Init-Zählvariablen %%i links entsprechend %%i %%j........%%o rechts
Diese 7 Variablen kommen weiter untern in dem geCALLeten Block dort als Variablen %1 %2...%7 an.
Also...erst lesen, was in Zeile 14 bis 23 passiert, dann geht es im Ablauf mit Zeile 5 weiter.

In Zeile 14 steht nur der LABEL-Name ":SetTheUrl"
Den leeren Raum dahinter für Kommentare zu nutzen, ist eher eine persönliche Note.
14 :SetTheUrl ...max vier Parameter vorgesehen... also drei Ampersands je Zeile...
Müsste jetzt auch
14 :SetTheUrl ...max sieben Parameter vorgesehen... also sechs Ampersands je Zeile...
..heißen.
Wenn Du testen wolltest, dann mach aus Zeile 15...
15 :: UNCOMMENT FOR DEBUG echo [1[%~1] [2[%~2] [3[%~3] [4[%~4] [5[%~5] [6[%~6] [7[%~7]
...diese hier:
15 echo [1[%~1] [2[%~2] [3[%~3] [4[%~4] [5[%~5] [6[%~6] [7[%~7]
dann wird jeweils am Bildschirm angezeigt, was in dem ":SetTheUrl"-Block als Parameter 1-7 ankommt.

In Zeile 16 wird der Variablen SetTheUrl der Wert "aktuellerInhaltVonSetTheUrl" plus Parameter 1 zugewiesen
16 Set TheUrl=%theUrl%%~1

In Zeile 17ff wird der Variablen SetTheUrl der Wert "aktuellerInhaltVonSetTheUrl" plus Parameter 2 (3, 4,..n) zugewiesen,
wenn es denn einen n-ten Parameter gibt
17 If NOT "%~2"=="" set TheUrl=%theUrl%"&"%~2

In zeile 23 erfolgt wieder der Rücksprung zur aufrufenden FOR..IN..DO..Anweisung.
23 goto :eof
...also zurück in Zeile 4.
In Zeile 05 werden die ersten 4 zeichen entsorgt (da steht immer ein "url:" drin.)
Zeile 06 ersetzt alle Zeichen "&" durch ein einzelnes Ampersand &.
Da mein CMD-Interpreter mich versteht, muss ich das Ampersand allerdings maskieren mit einem Caret "^".

...
05 set TheUrl=%theUrl:~4%
06 set TheUrl=%theUrl:"&"=^&%  
07 set theUrl
08 REM COMMENT PREVIOUS LINE FOR NODEBUG
09
10 C:\Programme\WEB\Firefox\Firefox.exe "%theUrl%"  
11
12 goto :eof
13
14 :SetTheUrl ...max vier Parameter vorgesehen... also drei Ampersands je Zeile...
15 :: UNCOMMENT FOR DEBUG echo [1[%~1] [2[%~2] [3[%~3] [4[%~4] [5[%~5] [6[%~6] [7[%~7]
16 Set TheUrl=%theUrl%%~1 
17 If NOT "%~2"=="" set TheUrl=%theUrl%"&"%~2  
18 If NOT "%~3"=="" set TheUrl=%theUrl%"&"%~3  
19 If NOT "%~4"=="" set TheUrl=%theUrl%"&"%~4  
20 If NOT "%~5"=="" set TheUrl=%theUrl%"&"%~5  
21 If NOT "%~6"=="" set TheUrl=%theUrl%"&"%~6  
22 If NOT "%~7"=="" set TheUrl=%theUrl%"&"%~7  
23 goto :eof
24 
25 ::-------snapp getLongurl.bat

Hoffe, es war halbwegs klärend.
Um sicherzugehen, werde ich einfach den Beitrag auf "Gelöst" setzen und vertröste eventuelle Fragesteller auf spätere Tutorials. face-wink

Gruß
Biber