tolwyn
Goto Top

Doppelte For-Schleife mit Dateiinformationen

Hallo

ich habe wohl noch ein kleines Anfängerproblem.

Ich habe zwei For-Schleifen mit denen ich zwei Dateilisten durchlaufen will:

for /F "tokens=1 delims=:" %%K in (F:\log.txt) DO (   
	
	for /F "tokens=1 delims=:" %%D in (F:\logi.txt) DO (	  
		
		@ECHO %%~zD
	
	)

)

in den Logs wurde folgender Befehl gespeichert: DIR /A-D /B

also nur Dateinamen ohne Verzeichnisse, bspw.

textdatei_auslesen.bat

Jetzt möchte ich die Dateigrößen oder sonstige DAteiattribute (über %%~zD etc) beider Parameter auslesen.
Aber aus einem Grund, den ich nicht verstehe, funktioniert es nicht.

Es macht für mich dabei recht wenig Sinn, warum ich mit Batch die Dateigröße von %%K auslesen kann, aber nicht die Dateigröße von %%D, obwohl beides exakt die gleiche Syntax ist.
Hier wird mir nur die Meldung: "ECHO ist ausgeschaltet (OFF)." ausgegeben.
Die Dateinamen (also %%K und %%D) gibt er mir fehlerfrei aus.

Gruß

Tolwyn

Content-Key: 95592

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

Printed on: April 19, 2024 at 01:04 o'clock

Member: bastla
bastla Aug 28, 2008 at 22:29:41 (UTC)
Goto Top
Hallo Tolwyn!

Da Du in den Dateilisten keine Pfadangaben gespeichert hast, werden vermutlich die Dateien aus "F:\logi.txt" nicht gefunden (während jene aus "F:\log.txt" im aktuellen Verzeichnis liegen dürften und deshalb auch ohne Pfad angesprochen werden können).

Du könntest aber die Listen von Vornherein gleich so erstellen:
for /f "skip=5 tokens=3*" %%i in ('dir /-c /a-d^|findstr ":"') do @echo %%i "%%j">>F:\log.txt  
Was hast Du eigentlich überhaupt vor? So, wie die Schleifen derzeit geschachtelt sind, werden für jede Datei aus "F:\log.txt" alle Dateien aus "F:\logi.txt" durchlaufen - soferne weiterhin nur ein Größenvergleich für eine nachfolgende Kopieraktion gefragt wäre, ließe sich das vermutlich effektiver lösen (wie schon in Deinem vorigen Beitrag gezeigt).
Eine letzte Anmerkung: Auch wenn in den Zeilen der Log-Dateien kein ":" vorkommen kann, wäre dennoch "delims=" der noch sicherere Weg, die gesamte Zeile am Stück zu lesen (dann kannst Du auch noch die Angabe "tokens=1" einsparen) ...

Grüße
bastla
Member: Tolwyn
Tolwyn Aug 29, 2008 at 09:08:14 (UTC)
Goto Top
erstmal der Kommentar zum Kommentar:

ja, das war der fehler, allerdings hab ich dafür noch keine lösung (siehe unten).
das mit den delims=" ist gut;
die dateiliste direkt in die for-schleife einzubauen, hab ich auch schon gemacht;
macht natürlich mehr Sinn für die "Endanwendung".
Da ich allerdings noch mit ein paar anderen dingen zu kämpfen habe, hab ichs erstmal gelassen, um eine Fehlerquelle weniger zu haben.

Die Fortsetzung:

hm im prinzip ist das nur eine "erweiterte" Lösung:

Ich hatte bei meinem alten Skript das Problem, dass ich nicht an die Dateigröße von der zweiten Datei rangekommen bin über die %%~zJ Option.

Deswegen hätte ich nun folgenden Aufbau gemacht:
for (DAteiliste von Quelle %%I) ( 
  if(existiert %%I auch in Ziel?) (
  ::ja? 
    for(Dateiliste von Ziel durchlaufen %%J)
      if(%%I == %%J - sind die namen gleich?)
      ::ja? 
        if(%%~zI GTR %%~zJ - ist die Quelldatei größer als die Zieldatei?) (
          :: etc etc
        )
       )
      ) 
    )
)

Das Problem nochmal in Worte gefasst:

ich hab in jeweils beiden Ordnern mehrere Dateien und ich hab im Grunde genommen keine Ahnung in welchem Ordner welche Dateien liegen. Damit die Logik vllt doch mal etwas klarer wird: Es handelt sich um mp3s aus Radiomitschnitt face-smile
Und wenn ich jetzt mal wieder mitstreame, kann es natürlich sein, dass gerade ein Mix läuft, den ich schonmal oder nur teilweise habe.
Dann möchte ich aber natürlich die größere (vollständigere) Version ins Ziel kopieren.

Das hätte ich mit obigen Aufbau versucht.
Erstmal feststellen, ob überhaupt die Dateiliste durchlaufen werden muss (Zeit!) oder direkt kopiert werden kann.
und dann soll die Kopieraktion natürlich auch nicht für alle Dateien des Ziels durchgeführt werden, sondern nur für die eine Datei mit dem gleichen Namen.

Das Problem, dass ich jetzt immer noch habe: wie komm ich an die Größenangabe der Datei ran, die nicht im gleichen Verzeichnis liegt?

Wenn ich den Pfad mit in eine neue Variable kopiere, klappt das auch nicht..

set datei=F:\test\%%K
@ECHO %datei%
@ECHO %%~zdatei

Gruß

Tolwyn
Member: bastla
bastla Aug 29, 2008, updated at Oct 18, 2012 at 16:36:10 (UTC)
Goto Top
Hallo Tolwyn!

Abgesehen davon, dass ein %~zVariable nur für Schleifenvariable oder %0 bis %9 angewendet werden kann (und daher etwa so zu lösen wäre
for /f "delims=" %%D in ("F:\test\%%K") do echo %%~zD  
hätte ich (auch aufgrund Deiner Rückmeldung) angenommen, dass die hier dargestellten Ansätze funktionieren ...

Grüße
bastla
Member: Tolwyn
Tolwyn Aug 30, 2008 at 09:55:23 (UTC)
Goto Top
Hi

also ich hab mir deine Version aus dem letzten Beitrag nochmal genauer angeschaut.

Wenn man direkt auf die Dateien im Ordner zugreifen kann, wieso packt man das überhaupt noch in "eine Textdatei" mit dem dir Befehl? Kann Windows bei dem direkten Zugriff evtl keine versteckten Dateien finden?

Die einzige Zeile die ich nicht verstehe ist diese hier:

copy "%%i" "%Ziel%\">nul   

Was bewirkt das >nul ?
Ist das nochmal eine Überprüfung vor dem Copy-befehl, ob das Ziel existiert?

Auf die Dateiattribute lässt sich also nur per Pfad zugreifen (logisch), dazu muss die Datei entweder im gleichen Verzeichnis sein, auf das andere Verzeichnis direkt zugreifen (so wie du es gemacht hast) oder auf eine Textdatei zugreifen in der die Dateien samt Pfad gespeichert sind (klingt umständlich zu realisieren).

Danke für deine Hilfe.

Gruß

Tolwyn
Member: bastla
bastla Aug 30, 2008 at 17:49:51 (UTC)
Goto Top
Hallo Tolwyn!

Wenn man direkt auf die Dateien im Ordner zugreifen kann, wieso packt man das überhaupt noch in "eine Textdatei" mit dem dir Befehl?
"Man" warst ja in diesem Fall eigentlich nur Du selbst - miniversum hatte bereits darauf hingewiesen, dass es auch ohne Textdatei geht, und in meiner Version kommen weder "dir" noch Temporärdateien zum Einsatz.

Kann Windows bei dem direkten Zugriff evtl keine versteckten Dateien finden?
Das wäre tatsächlich ein Argument für die Verwendung des "dir", nicht aber für eine Umleitung in eine Datei (das "dir"-Ergebnis kannst Du ja in einer "for /f"-Schleife direkt abhandeln) - allerdings war aus Deinem Beitrag nicht hervorgegangen, dass versteckte Dateien zu berücksichtigen wären ...

Was bewirkt das >nul ?
Ist das nochmal eine Überprüfung vor dem Copy-befehl, ob das Ziel existiert?
Eine nochmalige Überprüfung wäre gar nicht sinnvoll, da aufgrund der vorhergehenden Abfragen bereits feststeht, dass kopiert werden soll - es geht hier nur um "Kosmetik" (was Du leicht nachvollziehen kannst, wenn Du ">nul" weglässt) ...

Grüße
bastla