ooalbert
Goto Top

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:
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

Content-ID: 60826

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

Ausgedruckt am: 23.11.2024 um 14:11 Uhr

Biber
Biber 07.06.2007 um 21:00:02 Uhr
Goto Top
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
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
ooAlbert
ooAlbert 07.06.2007 um 21:33:42 Uhr
Goto Top
ich hab das zweite beipsiel mal übertragen, jedoch hab ich dann als ausgabe !Quelle! und nicht den wert ... beim "Ziel" ist es genauso. an sich wäre das aber die elegantere lösung als das erste beispiel.

das erste beispiel hat übrogens geklappt face-smile
mal angenommen ich hätt da viele dateien die umgeschreibenw erden (1000) wäre es sinnvoll "Start /Wait" zu benutzen oder spielt das keien rolle?
Biber
Biber 07.06.2007 um 23:17:07 Uhr
Goto Top
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
ooAlbert
ooAlbert 08.06.2007 um 14:16:07 Uhr
Goto Top
Ich nochmal...

scheinbar sind an meinem rechner wirklich diese extensions ausgeschaltet da an einem anderen rechner das sofort klappte.

Ich hab da noch eine andere Frage:
Ich wollt die Pfade für quelle und ziel manuell eingeben lassen damit es variabler ist. Da kopierte Pfade aus dem explorer kein abschließendes "\" haben sollte darauf geprüft werden und gegebenenfalls das "\" angehänt werden.

Mein gedanke war das hier:
@echo off
set "a=c:\programme\ziel"  

findstr /I /E /C:"\" %a%  

if errorlevel 0 echo nichts0
if errorlevel 1 echo nichts1
if errorlevel 2 echo nichts2
pause

klappt aber nicht
bastla
bastla 08.06.2007 um 14:42:10 Uhr
Goto Top
Hallo ooAlbert!

Da sich die CMD-Shell an sich nicht daran stört, wenn einmal zwei "\" aufeinanderfolgen, könntest Du natürlich einfach schreiben:
set "a=%a%\"  
Falls Du aber nur einen "\" am Ende haben willst, müsste folgendes funktionieren:
if "%a:~-1%" neq "\" set "a=%a%\"  

Grüße
bastla
ooAlbert
ooAlbert 08.06.2007 um 22:23:41 Uhr
Goto Top
ich hab mal das ausprobiert:

SET /P "a=eingeben:"
echo %a% | findstr /e \

if errorlevel == 1 echo 1
if errorlevel == 2 echo 2
if errorlevel == 0 echo 0

ich bekomm immer Level 1,0 egal was ich eingebe; dürfte nicht immer nur ein Errorlevel erscheinen je nach dem ob was gefunden wurde oder nicht, bzw. 0 wenn "\" vorhanden und 0,1 bei "\" nicht vorhanden?

das hier versteh ich nicht face-smile ziemlich kryptisch: if "%a:~-1%" neq "\" set "a=%a%\"
bastla
bastla 08.06.2007 um 22:38:40 Uhr
Goto Top
Hallo ooAlbert!

das hier versteh ich nicht face-smile 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
Biber
Biber 17.06.2007 um 00:39:49 Uhr
Goto Top
Moin ooAlbert,

sind noch Fragen offen oder kann dieser Beitrag geschlossen werden?

Grüße
Biber
ooAlbert
ooAlbert 17.06.2007 um 19:01:31 Uhr
Goto Top
nein ich hät erstmal keine weiter.