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:
,weiter weiß ich nicht^^
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^^
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 171908
Url: https://administrator.de/contentid/171908
Ausgedruckt am: 22.11.2024 um 16:11 Uhr
22 Kommentare
Neuester Kommentar
Aloha,
hast du es schon mit
versucht? ... deine
greetz André
P.S.:
hast du es schon mit
for /f "tokens=1-3 delims=/," %%s in ('findstr /B "\/" "datei.txt"') do (
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)?
... und Leerzeichen lassen einen Batch vielleicht schöner aussehen, sind aber oft, wie zB hier:
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
set "name = %%l
Zusatzfrage: Was hast Du mit den Variablen vor - oft ist es nicht nötig, zusätzliche Variablen zu verwenden ...
Grüße
bastla
Aloha
greetz André
wie gesagt bin ein Neuling.
wir lernen alle täglich dazu Wäre diese Andordnung jetzt Richtig??
Batch ist nicht VBS, achte auf unkorrekte LeerzeichenKann ich dann nach dem "do" einfach die Variablen setzen? Ungefähr so :
An sich spricht nichts dagegen, wenn du set "geraetename=%%s"
etc. verwendestKannst du mir mal nen Link zu dem Tutorial geben?
Na sicher Tutorial zur FOR-Schleifegreetz André
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. .-)
Hallo WulleBier!
innerhalb der Schleife ausführen - auch, wenn's nur um einen Satz an Werten geht ...
Grüße
bastla
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 genausogutcall "D:\Anderer Batch.cmd" "%%l" "%%m" "%%n"
Grüße
bastla
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
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
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
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:
Dann genügt im Batch eine einfache Schleife der Art
um alle Variablen (%SPACE%, %PAGE%, %FILE%) samt Werten auszulesen und Letztere Ersteren zuzuweisen ...
Die Angabe von "
Grüße
bastla
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
for /f "eol=; delims=" %%i in (datei.txt) do "set %%i"
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
Moin WulleBier,
bist du verwandt mit dem "WulleRoseKaufen" aus Bremen-Vegesack?
Liste
Namentlich benannte Elemente
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
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
Hallo WulleBier!
Versuch es mit folgenden Inhalten (irgendwie ein Déjà-vu):
[Edit] Kann natürlich - da Du ja anscheinend die gesamte Zeile in der Variablen haben wolltest - auch
sein ... [/Edit]
Batch:
wobei ich davon ausgehe, dass in der Variablen %laufwerk% (warum immer die auch so heißt) der Pfad zur Textdatei steht ...
Grüße
bastla
kann mir jemand sagen was daran falsch ist?
Wenn ich Dir sage, was richtig ist, geht's schneller .. Versuch es mit folgenden Inhalten (irgendwie ein Déjà-vu):
;beschreibung
;beschreibung
;beschreibung
;Variablenname=zuzuweisender Wert
space=Space
page=Page
file=data.txt
;beschreibung
;beschreibung
;beschreibung
;Variablenname=zuzuweisender Wert
space=--space Space
pagee=--page Page
file=--file "data.txt"
Batch:
for /f "usebackq eol=; delims=" %%a in (%laufwerk%) do set "%%a"
echo %space%
echo %page%
echo %file%
Grüße
bastla
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
greetz André
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é
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:
Die Kunst ist jetzt, diese Eigenschaften jeweils dann zu nutzen, wenn es sinnvoll ist.
Wechsele mal zum CMD-Prompt und mach dir Platz:
Dann gib ein ( nur die erste Zeile; Rest ist Ausgabe)
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:
In deinem Batch kannst du jetzt z.B. schreiben
Grüße
Biber
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
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"]
-> 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
Moin WulleBier,
Ursprungsgedanke ein paar Kommentare früher war ja, als DELIM ein Gleichheitszeichen zu vewenden.
Dann würde aus einer Zeile
...und einer FOR-Anweisung
Grüße
Biber
Zitat von @WulleBier:
Ich schreib nochmal auf wie ich des verstanden habe korrigiert mich im Zweifel :
-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")Ich schreib nochmal auf wie ich des verstanden habe korrigiert mich im Zweifel :
-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.
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 auffasstwird nun %%j dem jeweiligen Wert nach der Leerzeile zugeordnet.
--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
FOR /F "tokens=1,2 delims==" %i in ("variable=value") do @echo Token1:[%i] Token2: [%j]
Token1:[variable] Token2: [value]
Grüße
Biber
Moin WulleBier,
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
--> hier ist das Prinzip der "Delimiter" erkennbar und vertraut.
Grüße
Biber
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
Grüße
Biber
... laut meinen PraktikantInnen gibt es seit Jahren weder SSV noch WSV, sondern ganzjährig SALE.
immer diese Haarspaltereien in gewissen Forumsbereichen...
@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
immer diese Haarspaltereien in gewissen Forumsbereichen...
@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