Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Doppelte For-Schleife mit Dateiinformationen

Frage Entwicklung Batch & Shell

Mitglied: Tolwyn

Tolwyn (Level 1) - Jetzt verbinden

28.08.2008, aktualisiert 18.10.2012, 5750 Aufrufe, 5 Kommentare

Hallo

ich habe wohl noch ein kleines Anfängerproblem.

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

01.
 
02.
for /F "tokens=1 delims=:" %%K in (F:\log.txt) DO (  
03.
	 
04.
	for /F "tokens=1 delims=:" %%D in (F:\logi.txt) DO (	 
05.
		 
06.
		@ECHO %%~zD 
07.
	 
08.
09.
 
10.
11.
 
in den Logs wurde folgender Befehl gespeichert: DIR /A-D /B

also nur Dateinamen ohne Verzeichnisse, bspw.

01.
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
Mitglied: bastla
29.08.2008 um 00:29 Uhr
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:
01.
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
Bitte warten ..
Mitglied: Tolwyn
29.08.2008 um 11:08 Uhr
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:
01.
for (DAteiliste von Quelle %%I) (  
02.
  if(existiert %%I auch in Ziel?) ( 
03.
  ::ja?  
04.
    for(Dateiliste von Ziel durchlaufen %%J) 
05.
      if(%%I == %%J - sind die namen gleich?) 
06.
      ::ja?  
07.
        if(%%~zI GTR %%~zJ - ist die Quelldatei größer als die Zieldatei?) ( 
08.
          :: etc etc 
09.
10.
11.
      )  
12.
13.
)
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
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..

01.
set datei=F:\test\%%K 
02.
@ECHO %datei% 
03.
@ECHO %%~zdatei
Gruß

Tolwyn
Bitte warten ..
Mitglied: bastla
29.08.2008, aktualisiert 18.10.2012
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
01.
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
Bitte warten ..
Mitglied: Tolwyn
30.08.2008 um 11:55 Uhr
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:

01.
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
Bitte warten ..
Mitglied: bastla
30.08.2008 um 19:49 Uhr
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
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
gelöst Verschachtelte FOR-Schleife mit einem Argument (3)

Frage von mp-home zum Thema Batch & Shell ...

Batch & Shell
For Schleife in einer .sh Datei (4)

Frage von CrystalFlake zum Thema Batch & Shell ...

Batch & Shell
Zwei Ergänzungen in einer For Schleife

Frage von charmeur zum Thema Batch & Shell ...

Batch & Shell
Verschachtelte For Schleife für Batch Neuling (3)

Frage von yperiu zum Thema Batch & Shell ...

Neue Wissensbeiträge
Windows Tools

Zeit für Energiesparmodus, Bildschirmabschaltung etc. schnell anpassen

Anleitung von hannsgmaulwurf zum Thema Windows Tools ...

Linux Netzwerk

Ping und das einstellbare Bytepattern

(1)

Erfahrungsbericht von LordGurke zum Thema Linux Netzwerk ...

Windows Update

Microsoft Update KB4034664 verursacht Probleme mit Multimonitor-Systemen

(4)

Tipp von beidermachtvongreyscull zum Thema Windows Update ...

Heiß diskutierte Inhalte
Firewall
Richtige Grundeinstellungen der Pfsense für mein Netzwerk (14)

Frage von Spitzbube zum Thema Firewall ...

Switche und Hubs
gelöst Cisco 2960x Stacking über mehrere Etagen (12)

Frage von b3scher zum Thema Switche und Hubs ...