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, 5724 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 ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(1)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst CMD: icacls in for-Schleife (2)

Frage von Lowrider614 zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Problem bei einer For Schleife (2)

Frage von Juergen42 zum Thema Batch & Shell ...

Batch & Shell
gelöst For Schleife kaputt? (5)

Frage von Peter32 zum Thema Batch & Shell ...

Batch & Shell
Batch: Variable Expansion in einer FOR-Schleife (9)

Frage von .Sessl zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...