wullebier
Goto Top

For-Schleife .txt Datei und 3 Variablen speichern

Hallo zusammen,
ich weiß , dass es schon viele Beiträge zu dem Thema gibt. Leider bin ich aus diesen nicht schlau geworden, sodass ich mein Problem hätte lösen
können.
Allgemein kann man sagen, dass ich noch ein Neuling im Bereich Batch-Programmierung bin.

Ich möchte in einem Teil meiner Batch-Datei mit einer For-Schleife .txt Dateien lesen die so aufgebaut sind:
(Anfang)
....
....(Beschreibung)....
/variable1,variable2,variable3 (quasi die letzte Zeile der .txt)

(Ende)


Sobald eine Zeile mit "/ " beginnt sollen die auf den "/ " folgenden Wörter in 3 Variablen gespeichert werden. Getrennt werden diese Wörter durch Kommas.


Ich habe schon einen kleinen Ansatz der allerdings nicht der Rede Wert sein dürfte:

 for /F "delims = / , " %%l in (datei.txt) do set  "name = %%l & set  "dateiname=   


,weiter weiß ich nicht^^

Content-Key: 171908

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

Ausgedruckt am: 28.03.2024 um 13:03 Uhr

Mitglied: Skyemugen
Skyemugen 23.08.2011 um 10:36:35 Uhr
Goto Top
Aloha,

hast du es schon mit
for /f "tokens=1-3 delims=/," %%s in ('findstr /B "\/" "datei.txt"') do (
versucht? ... deine delims=-Anordnung ist, nebenbei bemerkt, vollkommen fehlerhaft (und dabei haben wir hier ein so schönes Tutorial zur FOR-Schleife)

greetz André

P.S.:
quasi die letzte Zeile der .txt
Ist sie es nun oder nicht (dann könnte man auch anders herangehen)?
Mitglied: WulleBier
WulleBier 23.08.2011 um 10:51:14 Uhr
Goto Top
Servus,

wie gesagt bin ein Neuling.

Wäre diese Andordnung jetzt Richtig??

Kann ich dann nach dem "do" einfach die Variablen setzen? Ungefähr so :

 for /f "tokens=1-3 delims=/," %%s in ('findstr /B "\/" "datei.txt"') do ( set  "geraetename = %%s  ...   

Kannst du mir mal nen Link zu dem Tutorial geben?
Mitglied: bastla
bastla 23.08.2011 um 10:52:35 Uhr
Goto Top
... und Leerzeichen lassen einen Batch vielleicht schöner aussehen, sind aber oft, wie zB hier:
set  "name = %%l
eher kontraproduktiv - sogar, wenn das schließende Anführungszeichen hinzugefügt würde.
Zusatzfrage: Was hast Du mit den Variablen vor - oft ist es nicht nötig, zusätzliche Variablen zu verwenden ...

Grüße
bastla
Mitglied: Skyemugen
Skyemugen 23.08.2011 um 10:53:43 Uhr
Goto Top
Zitat von @WulleBier:
Servus,
Aloha
wie gesagt bin ein Neuling.
wir lernen alle täglich dazu face-wink
Wäre diese Andordnung jetzt Richtig??
Batch ist nicht VBS, achte auf unkorrekte Leerzeichen
Kann ich dann nach dem "do" einfach die Variablen setzen? Ungefähr so :
An sich spricht nichts dagegen, wenn du set "geraetename=%%s" etc. verwendest
Kannst du mir mal nen Link zu dem Tutorial geben?
Na sicher Tutorial zur FOR-Schleife

greetz André
Mitglied: WulleBier
WulleBier 23.08.2011 um 10:59:24 Uhr
Goto Top
Die variablen werden für eine andere .bat Datei benötigt die ich im Verlauf aufrufe.
Sind die benötigten Parameter.

Gruss
WulleBier
Mitglied: 99045
99045 23.08.2011 um 11:11:29 Uhr
Goto Top
Zitat von @WulleBier:

Kannst du mir mal nen Link zu dem Tutorial geben?


Den kann man ziemlich einfach auch selbst finden. Man klickt auf der Hauptseite oben links auf "Anleitungen" und gibt dann im Suchfeld "nach einer Anleitung suchen" einfach "For" ein und klickt auf START. Voila, gleich der erste Treffer passt. .-)
Mitglied: bastla
bastla 23.08.2011 um 11:11:50 Uhr
Goto Top
Hallo WulleBier!
Die variablen werden für eine andere .bat Datei benötigt die ich im Verlauf aufrufe.
Das wäre noch nicht notwendiger Weise ein Grund für "eigene" Variablen - Du könntest genausogut
call "D:\Anderer Batch.cmd" "%%l" "%%m" "%%n"
innerhalb der Schleife ausführen - auch, wenn's nur um einen Satz an Werten geht ...

Grüße
bastla
Mitglied: Biber
Biber 23.08.2011 um 11:33:28 Uhr
Goto Top
Moin WulleBier,

du bekommst nun gerade kompetente Antworten von zwei geschätzten Mitgliedern, die rein handwerklich so ziemlich alles irgendwie umsetzen.
Ich halte manchmal nicht so viel von einer nur wortwörtlichen Antwort auf die gestellte Frage und bitte dann doch darum, mal zwei Schritt zurückzutreten und den Plan mal mit etwas Distanz anzuschauen.

Bei deinem Vorgehen wird
  • eine Zeile aus einer Textdatei gelesen
  • und der Nutz-Inhalt der Zeile als "Liste" weiterverarbeitet
  • die Elemente dieser "Liste" sollen nun im weiteren Verlauf wieder als namentlich identifizierbare Variablen getrennt werden und einzeln ansprechbar zur Verfügung stehen.

Das sind mir schon zu viele Paradigmenwechsel.
Eine "Liste" hat viele Vorteile - sie kann eine variable Anzahl von Elementen beinhalten und ich kann alle Elemente in einer Schleife durchlaufen
Wenn du aber in deinem Folgeablauf keine flexible Anzahl benötigst, sondern -als Beispiel- IMMER drei Parameter/Variablen, die als %Geraetename%", "%clientname%" und "%Druckername% benötigt werden - dann solltest du in der Text/Konfigdatei nicht eine "Liste mit drei Werten" hinterlegen, sondern drei konkret benannte Werte.

Also den Aufbau in der Textdatei ähnlich konzipieren wie in einer Windows-Ini-Datei.

Grüße
Biber
Mitglied: WulleBier
WulleBier 23.08.2011 um 15:22:42 Uhr
Goto Top
Servus Biber,

Also das mit der "Liste" habe ich nicht verstanden. Ich speichere die Zeile doch nur in 3 lokalen Variablen ?!

Vielleicht beschreib ich einfach mal mein Problem, dann kann man vielleicht diskutieren ob ich(wir) überhaupt den richtigen Ansatz gewählt haben:

Es geht darum Dateien, die sich lokal auf einem PC unserer Entwickler befinden, möglichst automatisiert (am Besten mit einer Art Skript (um denen die Arbeit zu erleichtern)) auf die Wiki des Betriebes, am besten gleich als Attachments einer Page des Wiki's, zu kopieren. Das hochkopieren in den richtigen Space auf die richtige Page stellt kein Problem dar, dank des Command Line Interface, welches von der Firma welches die Wiki Software herstellt, zur Verfügung gestellt wird (die Software heißt "Confluence" von der Firma Atlassian).

Dieses Tool ermöglicht es einem die Administration des Wikis per Command Shell. Confluence ist übrigens eine Tomcat-WebApplikation.

Unser Ansatz ist nun in jeden Projektordner eine beschreibende .txt Datei zu erstellen, wo angegeben wird in welchem SPACE(var1), auf welcher PAGE(var2) und welche Datei(Pfad(var3)),
benötigt wird. Diese ist vom Entwickler selbst zu editieren.

Ausgehend von diesen 3 Variablen kann ich dann, das CommandLineInterface der WebApplikation aufrufen und jeweilig den Parameter angeben. (Ist auch ein .bat Datei)
Dazu muss man natürlich die richtige Aktion( in dem Fall --action addAttachement) angeben, aber dies ist ja uninteressant.

Ich hoffe ich konnte einigermaßen Beschreiben, mit was ich mich gerade auseinander setzen muss.

gruss David
Mitglied: bastla
bastla 23.08.2011 um 15:29:33 Uhr
Goto Top
Hallo WulleBier!

Wenn Ihr die Textdatei selbst erstellen könnt (wovon ich ursprünglich einmal nicht ausgegangen bin), würde ich sie (ganz in Bibers Sinn) einfach so aufbauen:
;Kommentar
SPACE=Spaceangabe
PAGE=Pageangabe
FILE=Dateiangabe
Dann genügt im Batch eine einfache Schleife der Art
for /f "eol=; delims=" %%i in (datei.txt) do "set %%i"
um alle Variablen (%SPACE%, %PAGE%, %FILE%) samt Werten auszulesen und Letztere Ersteren zuzuweisen ...

Die Angabe von "eol=;" könnte übrigens unterbleiben, wenn Kommentarzeilen mit dem Defaultwert ";" eingeleitet werden - ansonsten ist natürlich auch zB "eol=#" möglich ...

Grüße
bastla
Mitglied: Biber
Biber 23.08.2011 um 15:47:53 Uhr
Goto Top
Moin WulleBier,

bist du verwandt mit dem "WulleRoseKaufen" aus Bremen-Vegesack?

Also das mit der "Liste" habe ich nicht verstanden. Ich speichere die Zeile doch nur in 3 lokalen Variablen ?!
Ich versuch nochmal anders auszudrücken, wo ich den Unterschied zwischen einer "Liste" und "namentlich definierten Variablen" sehe.

Liste
  • gleichartige Elemente - wie "Wein, Weib und Gesang". oder "Laufwerke D:, E: und F:"
  • Anzahl variabel
  • Reihenfolge zufällig bzw. beliebig

Namentlich benannte Elemente
  • Jeder Variableninhalt macht nur unter einem bestimmten Variablenname Sinn
  • Reihenfolge ist nicht beliebig
  • Anzahl ist nicht variabel, sondern EXAKT drei
  • unter SPACE steht eben eine Spaceangabe und unter FILE eine Dateiangabe

Und du verarbeitest doch keine Parameterliste, sondern einzelne, fast schon individuelle Parameter.

Bei einer "Listenverarbeitung" im Batch würdest du u.U. noch die drei Variablen unter %VAR1%, %VAR2% und %VAR3% weiterschieben mit dem "Kopfwissen", dass eigentlich %VAR3% für die Variable %FILES% steht.

P.S. Thx@bastla - ich denke, mit deinem Beispiel wird es deutlicher.

Grüße
Biber
Mitglied: WulleBier
WulleBier 23.08.2011 um 15:51:22 Uhr
Goto Top
Jetzt verstehe ich dich Biber.

Ich danke allen für ihre Antworten. Hat mir sehr geholfen.

Gruss WulleBier
Mitglied: WulleBier
WulleBier 25.08.2011 um 11:11:12 Uhr
Goto Top
Nochmals servus zusammen,

Es scheint irgendwie doch nicht zu funktionieren...
ich habe jetzt folgenden Aufbau der .txt datei:

;beschreibung
;beschreibung
;beschreibung
--space Space
--page Page
--file "data.txt   

Dazu folgende For-Schleife

 for /f "usebackq eol=; delims=" %%a in (%laufwerk%) do ((set "file=%%a")&&(set "page=%%b")&&(set "space=%%c"))  


	echo %space%
	echo %page%
	echo %file%

von den 3 Variablen wird nur %file% richtig ausgegeben die anderen jeweil "%b% und %c%

kann mir jemand sagen was daran falsch ist?
Mitglied: bastla
bastla 25.08.2011 um 11:32:23 Uhr
Goto Top
Hallo WulleBier!
kann mir jemand sagen was daran falsch ist?
Wenn ich Dir sage, was richtig ist, geht's schneller .. face-wink

Versuch es mit folgenden Inhalten (irgendwie ein Déjà-vu):
;beschreibung
;beschreibung
;beschreibung

;Variablenname=zuzuweisender Wert
space=Space
page=Page
file=data.txt
[Edit] Kann natürlich - da Du ja anscheinend die gesamte Zeile in der Variablen haben wolltest - auch
;beschreibung
;beschreibung
;beschreibung

;Variablenname=zuzuweisender Wert
space=--space Space
pagee=--page Page
file=--file "data.txt"  
sein ... [/Edit]

Batch:
for /f "usebackq eol=; delims=" %%a in (%laufwerk%) do set "%%a"  
echo %space% 
echo %page% 
echo %file%
wobei ich davon ausgehe, dass in der Variablen %laufwerk% (warum immer die auch so heißt) der Pfad zur Textdatei steht ...

Grüße
bastla
Mitglied: Skyemugen
Skyemugen 25.08.2011, aktualisiert am 18.10.2012 um 18:48:01 Uhr
Goto Top
Aloha,

du solltest dir einmal unser Tutorial zur FOR-Schleife durchlesen und nicht versuchen ohne Messer aus einem Kuchen drei Stücke herauszubekommen ... (wobei der Kuchen nicht einmal so geteilt werden kann, wie du es glauben möchtest) .. oder anders ausgedrückt: es gibt kein %%b und auch kein %%c

greetz André
Mitglied: Biber
Biber 25.08.2011 um 11:43:12 Uhr
Goto Top
Moin WulleBier,

es gibt Unterschiede und Gemeinsamkeiten zwischen FDP-Politikern und Skriptentwicklern.

Eine Gemeinsamkeit ist die nicht leistungsgerechte Bezahlung.
Ein Unterschied ist, dass ein Skripter sich irgendwann auf eine Strategie festlegen muss.

Bei dem Aufbau deiner jetzigen INI-Datei haben wir jetzt zwei Strategie-Elemente nutzbar:
  • alle Variablen/Wert-Pärchen sind "gleich" verarbeitbar - wie Elemente einer beliebig langen Liste
  • alle Variablen/Wert-Pärchen sind aber auch einzeln "namentlich" ansprechbar.

Die Kunst ist jetzt, diese Eigenschaften jeweils dann zu nutzen, wenn es sinnvoll ist.

Wechsele mal zum CMD-Prompt und mach dir Platz:
mode con cols=166 lines=55
Dann gib ein ( nur die erste Zeile; Rest ist Ausgabe)
C:\Users\WulleRose>for /f "tokens=1,2 delims=- " %i in ('Findstr /c:"--" e:\schnipsel\wullebiers.ini') do @echo %i Wert [%j]
space Wert [Space]
page Wert [Page]
file Wert ["data.txt"]
natürlich mit auf deine INI-Datei angepassten Namen/Pfad

-> hier behandele ich alle Variable/wert-Pärchen gleich beim Rausflöhen mit FindStr/Suche nach "--"
Ich kann aber auch alles gezielt einzeln ansprechen:
C:\Users\WulleRose>for /f "tokens=1,2 delims=- " %i in ('Findstr /c:"--" e:\schnipsel\wullebiers.ini') do @if /i "%i"=="file" @echo set "%i=%j"
set "file="data.txt""

In deinem Batch kannst du jetzt z.B. schreiben
...
for /f "tokens=1,2 delims=- " %%i in ('Findstr /c:"--" e:\schnipsel\wullebiers.ini') do (  
         If /i "%%i"=="file" @echo set "%%i=%%j"  
        REM kannst auch "page" lesen und eine andere Variable damit setzen  
         If /i "%%i"=="page" @echo set "Jimmy=%%j"  
         If /i "%%i"=="Space" @echo set "%%i=%%j"  
)

Grüße
Biber
Mitglied: WulleBier
WulleBier 25.08.2011 um 13:32:50 Uhr
Goto Top
Hah ich sehe Licht im Dunkenln face-smile !!
@bastla
Ich habe das "--" immer genommen, da man für das andere Skript so die Parameter immer angibt also :
 skript.bat --action loadFiles --space Space --file "file." --title ...   
,deswegen wollt ich immer die ganze Zeile inklusive "--".

Vielen dank für den Code, jetzt funtioniert alles!

@Biber sehr guter Vergleich ;)

C:\Users\WulleRose>for /f "tokens=1,2 delims=- " %i in ('Findstr /c:"--"
e:\schnipsel\wullebiers.ini') do @echo %i Wert [%j]
space Wert [Space]
page Wert [Page]
file Wert ["data.txt"]

Dieses Beispiel hat mir Einiges klar gemacht. Danke dafür face-smile!
Ich schreib nochmal auf wie ich des verstanden habe korrigiert mich im Zweifel face-smile:

-FOR-Schleife geht durch jede unkommentierte Zeile durch --> Führt DO-Anweisung für jede Zeile aus. Da wir nach "--" suchen wird gleich in die entsprechenden Zeilen gesprungen.
-DO Anweisung: Da Tokens auf 1,2 gesetzt wurden wird zuerst die Variable %%i, space dann page dann file zugeordnet.
Da die Zeile durch die Token-Angabe getrennt wurde(wobei ich nicht verstehe warum "delims= - ") wird nun %%j dem jeweiligen Wert nach der Leerzeile zugeordnet.

Habe ich dies soweit richtig verstanden???


Vielen Dank nochmal

Gruss WulleBier
Mitglied: Biber
Biber 25.08.2011 um 14:29:50 Uhr
Goto Top
Moin WulleBier,

Zitat von @WulleBier:
Ich schreib nochmal auf wie ich des verstanden habe korrigiert mich im Zweifel face-smile:

-FOR-Schleife geht durch jede unkommentierte Zeile durch --> Führt DO-Anweisung für jede Zeile aus. Da wir nach
"--" suchen wird gleich in die entsprechenden Zeilen gesprungen.
Jepp - bzw nur die "--"-Zeilen werden nicht überlesen (wobei doppelte Negation "nicht überlesen" == "gelesen")

-DO Anweisung: Da Tokens auf 1,2 gesetzt wurden wird zuerst die Variable %%i, space dann page dann file zugeordnet.
Jepp.
Da die Zeile durch die Token-Angabe getrennt wurde(wobei ich nicht verstehe warum "delims= - ")
wird nun %%j dem jeweiligen Wert nach der Leerzeile zugeordnet.
Die "delims" habe ich auf "Minuszeichen" und "SPACE" gesetzt, weil die FOR-Anweisung dann die Zeile wie folgt auffasst
--variable value
-->wird in Token zerlegt gelesen  als
 "-" "-" variable SPACE value
DELIM DELIM token1[=%i] DELIM token2[=%j]
--> alles, was hier DELIM heisst wird KEIN Token %i bzw %j

Ursprungsgedanke ein paar Kommentare früher war ja, als DELIM ein Gleichheitszeichen zu vewenden.
Dann würde aus einer Zeile
variable=value
...und einer FOR-Anweisung
FOR /F "tokens=1,2 delims==" %i in ("variable=value") do @echo Token1:[%i] Token2: [%j]
 Token1:[variable] Token2: [value]

Grüße
Biber
Mitglied: WulleBier
WulleBier 25.08.2011 um 16:15:43 Uhr
Goto Top
Die "delims" habe ich auf "Minuszeichen" und "SPACE" gesetzt, weil die FOR-Anweisung dann die Zeile
wie folgt auffasst
> --variable value
> -->wird in Token zerlegt gelesen  als
>  "-" "-" variable SPACE value
> DELIM DELIM token1[=%i] DELIM token2[=%j]
> --> alles, was hier DELIM heisst wird KEIN Token %i bzw %j
> 
Stimmt ist logisch. Delim bedeutet in der Zeile wo gelesen wird dieses Zeichen überlesen quasi?! ^^


Gruss WulleBier
Mitglied: Biber
Biber 25.08.2011 um 16:47:53 Uhr
Goto Top
Moin WulleBier,

Delim bedeutet in der Zeile wo gelesen wird dieses Zeichen überlesen quasi?! ^^
Hinter dem Wort "quasi" in deinem Satz steht eine Zeichenfolge, bei der ich ganz sicher bin, ob es der zum Zerreissen überdehnte Spannungsbogen einer an mich gerichtete Frage ist...
Kann ja auch sein, dass "?! ^ ^" soviel bedeutet wie "Ja wie jezz'? Ach nee, *vornKoppKlatsch* na klar! Schau mal an..."

Also FALLS es eine Frage war:
Ja, DELIMs sind so etwas wie die Löcher im Schweizer Käse - die sind nötig, aber werden nicht mitgegessen.

Oder, die Mutter aller Delimiter (nein, nicht Liz Taylor, die war zwar auch oft getrennt, aber..) ist die CSV-Datei,
in der einzelne "Felder" getrennt durch ein Semikolon transportiert werden
Name;Vorname;Ort
Pan;Peter;Berlin
Klever;Klaas;Entenhausen
Knopf;Jim;Lummerland
--> hier ist das Prinzip der "Delimiter" erkennbar und vertraut.

Grüße
Biber
Mitglied: bastla
bastla 25.08.2011 um 19:08:40 Uhr
Goto Top
... obwohl: Das Beispiel zeigt eine SSV-Datei ... face-wink

Grüße
bastla
Mitglied: Biber
Biber 25.08.2011 um 19:33:05 Uhr
Goto Top
Zitat von @bastla:
... obwohl: Das Beispiel zeigt eine SSV-Datei ... face-wink
... laut meinen PraktikantInnen gibt es seit Jahren weder SSV noch WSV, sondern ganzjährig SALE.

immer diese Haarspaltereien in gewissen Forumsbereichen... face-wink

@WulleBier
Lass dich nicht verunsichern,
Das CSV-Format heisst halt so wie es heisst und die unfreiwillige Komik des Wortsinns wird ebensowenig hinterfragt wie bei "hot dogs" oder "coffee shops" oder "Windows Professional".

Grüße
Biber