Batch- Textdatei Zeilenweise auslesen
For-Schleife übergibt keine Daten
Hi,
ich hab eine TXT in der pro zeile ein dateiname steht, das soll mit eine Batchdatei auslesen und dann jeden wert einzeln an ein Kommandozeilenprogramm übergeben mittels "Start".
Das Problem ist jetzt, die forschleife ließt korrekt die werte aus und ichs eh die sogar auf dem Bildschirm aber es wird nichts an eine verarbeitende variable übergeben, warum auch immer.
Die Schleife sieht so aus:
Da ich der Meinung bin das die Schleife korrekt ist und es mir unklar ist warum diese simple werteübergabe nicht geht, hoffe ich das hier wer eine erklärung hat.
mfg
Hi,
ich hab eine TXT in der pro zeile ein dateiname steht, das soll mit eine Batchdatei auslesen und dann jeden wert einzeln an ein Kommandozeilenprogramm übergeben mittels "Start".
Das Problem ist jetzt, die forschleife ließt korrekt die werte aus und ichs eh die sogar auf dem Bildschirm aber es wird nichts an eine verarbeitende variable übergeben, warum auch immer.
Die Schleife sieht so aus:
PUSHD %Pfad1%
For /F "delims=" %%i IN ('TYPE Speicher.txt') DO (
ECHO Quelldatei :%%i
SET Quelle = %%i
SET Ziel = %%i
echo %Quelle% <=Leere Anzeige
START /min pdftk "%Stempel%" background "%Pfad2%%Quelle%" output "%Pfad3%%Ziel%"
)
POPD
Da ich der Meinung bin das die Schleife korrekt ist und es mir unklar ist warum diese simple werteübergabe nicht geht, hoffe ich das hier wer eine erklärung hat.
mfg
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 60826
Url: https://administrator.de/contentid/60826
Ausgedruckt am: 23.11.2024 um 14:11 Uhr
9 Kommentare
Neuester Kommentar
Moin ooAlbert,
die Schleife sieht optisch korrekt aus, das stimmt.
Dennoch ist für den CMD-Interpreter alles innerhalb der Klammern nach dem "FOR /F...DO" nur eine einzige Zeile.
Auch wenn es optisch anders wirkt.
Alle Variablen innerhalb dieser einen einzigen Zeile werden genau einmal aufgelöst und bekommen den Wert, den sie vor Ausführung bzw. Interpretation der Anweisung hatten.
Ausgenommen sind "dynamische Variablen", z.B. die Zählvariablen einer FOR-Anweisung.
Abhilfe a) (recommended) mit CALL :Block
oder b) mit DelayedExpansion und Variablen in !var!-Schreibweise statt %var&
Zu DelayedExpansion: Forumssuche oder im Bereich Batch & Shell stöbern.
Gruß
Biber
die Schleife sieht optisch korrekt aus, das stimmt.
Dennoch ist für den CMD-Interpreter alles innerhalb der Klammern nach dem "FOR /F...DO" nur eine einzige Zeile.
Auch wenn es optisch anders wirkt.
Alle Variablen innerhalb dieser einen einzigen Zeile werden genau einmal aufgelöst und bekommen den Wert, den sie vor Ausführung bzw. Interpretation der Anweisung hatten.
Ausgenommen sind "dynamische Variablen", z.B. die Zählvariablen einer FOR-Anweisung.
Abhilfe a) (recommended) mit CALL :Block
PUSHD %Pfad1%
For /F "delims=" %%i IN ('TYPE Speicher.txt') DO call :ProcessNext "%%i"
POPD
goto :eof
:ProcessNext Erster Parameter heißt dann %1, der zweite %2....
ECHO Quelldatei :%1
SET "Quelle=%~1"
SET "Ziel=%~1"
echo %Quelle% <=Leere Anzeige
START /min pdftk "%Stempel%" background "%Pfad2%%Quelle%" output "%Pfad3%%Ziel%"
goto :eof
oder b) mit DelayedExpansion und Variablen in !var!-Schreibweise statt %var&
PUSHD %Pfad1%
setlocal EnableDelayedExpansion
For /F "delims=" %%i IN ('TYPE Speicher.txt') DO (
ECHO Quelldatei :%%i
SET "Quelle=%%i"
SET "Ziel=%%i"
echo !Quelle!
START /min pdftk "%Stempel%" background "%Pfad2%!Quelle!" output "%Pfad3%!Ziel!"
)
POPD
Zu DelayedExpansion: Forumssuche oder im Bereich Batch & Shell stöbern.
Gruß
Biber
Moin ooAlbert,
waum das zweite Beispiel nicht klappt, kann ich mir nur auf zwei relativ abwegige Arten herleiten.
Theorie1 [Sehr ungewöhnlich]
An Deinem Rechner sind -warum auch immer- die so genannten CMD-Extensions nicht aktiviert.
Passiert eigentlich nie - die sind defaultmäßig aktiviert und eingefleischte M$-Fans müssten erst nachlesen, wie sich die ausknipsen lassen.
Kannst ja dennoch mal bitte versuchen, die Zusatzzeile
Setlocal EnableExtensions vor der anderen Setlocal-Zeile einzufügen.
Theorie 2: Du hast wie in Deinem Beispiel oben ein Leerzeichen zwischen dem "Set variablennamen" und dem "=". Das funktioniert nicht.
Zu Deiner "Start /wait"-Frage...
Geschmackssache.
Durch Start /Wait wird es natürlich ein Parallelthreading mit dem (ja gewollten) Vorteil, dass Du nicht auf das Ende eines einzelnen pdftk-Prozesses warten musst.
Andererseits ...wenn mehr als 123 pdftk-Parallelinstanzen sich um eine der Windows-Zeitscheiben balgen und alle außerdem noch jeweils ihren Verwaltungsoverhead im Gepäck haben, dann führt es meistens dazu, dass ein im Hintergrund laufender Antiviren-Prozess langsam aber sicher austrocknet und als toter Prozess im Hauptspeicher hängt.
Jedenfalls wenn Du mit (lokalen) Admin-Rechten so etwas lostrittst.
Ist ein Seiteneffekt, der eine Menge über Windows aussagt.
Ich bin da eher Batch-Purist: wenn es denn ein Batch ist, dann heißt das klassischerweise, dass der Batch gestartet wird , dann still vor sich hinschurrt und irgendwann fertig ist.
Batches startet ja normalerweise niemand, der dabei zuguckt und wartet, dass sie fertig werden.
Das ist eher Windows-Style: Auf einen Installationsbalken starren, der anderthalb Stunden auf einer 99%-Anzeige eingefroren ist.
Gruss
Biber
waum das zweite Beispiel nicht klappt, kann ich mir nur auf zwei relativ abwegige Arten herleiten.
Theorie1 [Sehr ungewöhnlich]
An Deinem Rechner sind -warum auch immer- die so genannten CMD-Extensions nicht aktiviert.
Passiert eigentlich nie - die sind defaultmäßig aktiviert und eingefleischte M$-Fans müssten erst nachlesen, wie sich die ausknipsen lassen.
Kannst ja dennoch mal bitte versuchen, die Zusatzzeile
Setlocal EnableExtensions vor der anderen Setlocal-Zeile einzufügen.
Theorie 2: Du hast wie in Deinem Beispiel oben ein Leerzeichen zwischen dem "Set variablennamen" und dem "=". Das funktioniert nicht.
Zu Deiner "Start /wait"-Frage...
Geschmackssache.
Durch Start /Wait wird es natürlich ein Parallelthreading mit dem (ja gewollten) Vorteil, dass Du nicht auf das Ende eines einzelnen pdftk-Prozesses warten musst.
Andererseits ...wenn mehr als 123 pdftk-Parallelinstanzen sich um eine der Windows-Zeitscheiben balgen und alle außerdem noch jeweils ihren Verwaltungsoverhead im Gepäck haben, dann führt es meistens dazu, dass ein im Hintergrund laufender Antiviren-Prozess langsam aber sicher austrocknet und als toter Prozess im Hauptspeicher hängt.
Jedenfalls wenn Du mit (lokalen) Admin-Rechten so etwas lostrittst.
Ist ein Seiteneffekt, der eine Menge über Windows aussagt.
Ich bin da eher Batch-Purist: wenn es denn ein Batch ist, dann heißt das klassischerweise, dass der Batch gestartet wird , dann still vor sich hinschurrt und irgendwann fertig ist.
Batches startet ja normalerweise niemand, der dabei zuguckt und wartet, dass sie fertig werden.
Das ist eher Windows-Style: Auf einen Installationsbalken starren, der anderthalb Stunden auf einer 99%-Anzeige eingefroren ist.
Gruss
Biber
Hallo ooAlbert!
neq = "not equal" = ungleich (siehe Hilfe zu "if")
set "a=%a%\" fügt einen "\" an den Inhalt von %a% an und speichert wieder in %a%
Zu "findstr": Da "\" als Escape-Zeichen bei RegEx-Suche verwendet wird, musst Du "\\" schreiben, wenn nach "\" selbst gesucht werden soll (siehe Hilfe zu "findstr").
Zu "errorlevel": Eine Abfrage auf Errorlevel 0 is eigentlich sinnlos, da gilt (Hilfe zu "if"): "Bedingung ist erfüllt, wenn das zuletzt ausgeführte Programm einen Code größer oder gleich der Nummer zurückgibt." Du kannst aber mit "echo %errorlevel%" den Wert anzeigen lassen.
Grüße
bastla
das hier versteh ich nicht ziemlich kryptisch: if "%a:~-1%" neq "\" set "a=%a%\"
%a:~-1% liefert das letzte Zeichen der Variablen %a% (siehe Hilfe zu "set")neq = "not equal" = ungleich (siehe Hilfe zu "if")
set "a=%a%\" fügt einen "\" an den Inhalt von %a% an und speichert wieder in %a%
Zu "findstr": Da "\" als Escape-Zeichen bei RegEx-Suche verwendet wird, musst Du "\\" schreiben, wenn nach "\" selbst gesucht werden soll (siehe Hilfe zu "findstr").
Zu "errorlevel": Eine Abfrage auf Errorlevel 0 is eigentlich sinnlos, da gilt (Hilfe zu "if"): "Bedingung ist erfüllt, wenn das zuletzt ausgeführte Programm einen Code größer oder gleich der Nummer zurückgibt." Du kannst aber mit "echo %errorlevel%" den Wert anzeigen lassen.
Grüße
bastla