weierles
Goto Top

Dateiliste von Ordner mit Grössenangabe

hallo


ich möchte von mehreren Ordnern eine Seite im internet erstellen mit deren Inhalt. Bis jetzt habe ich dies so gelöst dass über den "dir"-Befehl die Dateiliste des Ordners in eine Excel-tabelle kopiert wurde und am Ende der Batch wurde die tabelle geöffnet; ich hab unter "speichern unter HTML" das ganze gespeichert und geschlossen, die batch hat im Hintergrunde gewartet und anschliessend das ganze per FTP hochgeladen.


Nun möchte ich das ganze ausbauen (und vielleicht auch vereinfachen). Ich wollte für jede Datei die Grösse dazu schreiben, für eine einzelne Daatei habe ich dies so gelöst:


for %%F in ("%dateiname%") do set groesse=%%~zFset /a groessevor=groesse/1000000set /a groessenach=groessevor*1000000set /a groessenach=groesse-groessenachset /a runden=groessenach/1000set /a nulltest=groessenach/100000if %nulltest%==0 set null=0set /a groessenach=groessenach/10000set /a runden2=groessenach*10set /a runden=runden-runden2if %runden% GTR 5 set /a groessenach=groessenach+1echo Dateiname: %dateiname% %groessevor%,%null%%groessenach% MB


Nun dachte ich mit einer TXT-Datei die über den "dir"-Befehl erstellt wurde könnte ich den Code oben automatisieren damit er die Variable %dateiname% fortlaufend ändert. Nun aber mein Problem:


dir /b /on >liste.txtfor /f "skip=1 tokens=*" %%i in (liste.txt) do @set dateiname=%%i


bringt mir nicht die Zeile die ich bei skip eingebe, sondern immer die Letzte Zeile. Was ist daran falsch?

Da ja keine 0 dort stehen darf baue ich noch ein Header ein.

Content-Key: 42128

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

Printed on: April 25, 2024 at 07:04 o'clock

Member: geTuemII
geTuemII Oct 13, 2006 at 11:58:23 (UTC)
Goto Top
Du siehst nur die letzte Zeile der Durchläufe, da du deine Datei liste.txt immer überschreibst.

überschreiben: dir /b /on > liste.txt
anhängen: dir /b /on >> liste.txt

[edit] Da habe ich Lötzinn geschrieben, ich ziehe diesen Beitrag zurück. Wer lesen kann... [/edit]

geTuemII
Member: bastla
bastla Oct 13, 2006 at 11:59:39 (UTC)
Goto Top
Hallo weierles!

Ich würde mal sagen, da die For-Schleife alle (bis auf die erste, wegen skip=1) Zeilen der "liste.txt" durchgeht, wird die Variable "dateiname" immer wieder überschrieben, sodass am Schluss einfach der letzte Name drinnen steht.

Als Lösung könntest Du mit einem do call :Bearbeitung %%i ein passendes Unterprogramm aufrufen, wo der übergebene Dateiname dann einfach als %1 verwendet werden kann.

HTH
bastla
Member: Metzger-MCP
Metzger-MCP Oct 13, 2006 at 12:13:48 (UTC)
Goto Top
Hm ich bin nun ein bissel verwirrt da ich nicht verstehe welches Problem du hast
oder was genau bei dir nicht funktioniert.

Was möchtest du als Endergebnis haben und wo bekommst du die Daten her ?
Ich könnte dir ja dann eine Datei zur verfügung stellen.

MFG Metzger
Member: bastla
bastla Oct 13, 2006 at 12:35:07 (UTC)
Goto Top
Hallo!

Ich nehme an, es ist etwa Folgendes gemeint:

@echo off
for /f %%i in ('dir /b /on /A-d') do call :Auswertung %%i  
goto Ende
:Auswertung
for %%F in ("%1") do set groesse=%%~zF  
set /a groessevor=groesse/1000000
set /a groessenach=groessevor*1000000
set /a groessenach=groesse-groessenach
set /a runden=groessenach/1000
set /a nulltest=groessenach/100000
if %nulltest%==0 set null=0
set /a groessenach=groessenach/10000
set /a runden2=groessenach*10
set /a runden=runden-runden2
if %runden% GTR 5 set /a groessenach=groessenach+1
echo Dateiname: %1 %groessevor%,%null%%groessenach% MB
:Ende

HTH
bastla
Member: weierles
weierles Oct 13, 2006 at 12:51:12 (UTC)
Goto Top
Was möchtest du als Endergebnis haben
und wo bekommst du die Daten her ?
Ich könnte dir ja dann eine Datei zur
verfügung stellen.

Ich habe als Daten ein paar Dateien in einem Ordner. Als Ergebnis möchte ich eine HTML Seite mit allen Dateinamen (und Ordner) mit den Dateigrössen (Ordner haben 0MB, ist aber egal).
Ich werde die Batch-Ausgabe in ein Excel schreiben und dies als HTML speichern, automatisch gehts bei mir noch nicht.


Die Lösung von bastla ist perfekt, danke!!
Member: bastla
bastla Oct 13, 2006 at 13:07:43 (UTC)
Goto Top
Hallo weierles!

Leider muss ich Dir widersprechen - die Lösung oben ist nur ein Entwurf, der zB bei Dateien mit Leerzeichen im Namen nicht funktioniert.

Hier die verbesserte Version:

@echo off
chcp 1252 > nul
for /f "delims=" %%i in ('dir /b /on /A-d') do call :Auswertung "%%i"  
goto Ende
:Auswertung
for %%F in (%1) do set groesse=%%~zF
set /a groessevor=groesse/1000000
set /a groessenach=groessevor*1000000
set /a groessenach=groesse-groessenach
set /a runden=groessenach/1000
set /a nulltest=groessenach/100000
if %nulltest%==0 set null=0
set /a groessenach=groessenach/10000
set /a runden2=groessenach*10
set /a runden=runden-runden2
if %runden% GTR 5 set /a groessenach=groessenach+1
echo Dateiname: %~1 %groessevor%,%null%%groessenach% MB
:Ende

bastla

[Edit] Endgültige Fassung (wie weiter unten angemerkt) erstellt. [/Edit]
Member: weierles
weierles Oct 13, 2006 at 13:15:23 (UTC)
Goto Top
Falls Du mit den Anführungszeichen
leben kannst, ist das eine leicht verbesserte
Version:
Ist ok so. Das einzige unschöne sind die Umlaute äöü. Könnte man ans Ende der batch schreiben er soll z.b. alle Ö in ™ umwandeln?
Member: bastla
bastla Oct 13, 2006 at 13:20:58 (UTC)
Goto Top
Hallo weierles!

Ach so, wegen des Excel-Imports ...

Da müsste als 2. Zeile noch ein chcp 1252 > nul hinein.

HTH
bastla
Member: weierles
weierles Oct 13, 2006 at 13:26:18 (UTC)
Goto Top
Da müsste als 2. Zeile noch ein chcp
1252
hinein.
Hat geklappt. Eine Frage noch: ich möchte an den Schluss der Batch noch was schreiben, wenn ich dies nach dem :Ende ganz am Schluss mache wird es jedes mal aufgerufen, merkt der CALL-Befehl nicht das die :Auswertung beim :Ende beendet ist? Oder soll ich meine letzten Worte vor der :Auswertung hinschreiben?
Member: bastla
bastla Oct 13, 2006 at 13:31:35 (UTC)
Goto Top
Hallo weierles!

Richtig - wenn Du ganz am Ende noch etwas ausgeben willst, muss das nach der Schleife (und vor "goto Ende" face-wink) passieren.

Und wegen der Anführungszeichen (doch noch gefunden): In der echo-Zeile statt "%1" "%~1" schreiben (ich editier das Ganze nochmal oben).

HTH
bastla
Member: geTuemII
geTuemII Oct 13, 2006 at 14:17:09 (UTC)
Goto Top
Mal eine Frage: Warum wollt ihr das erst ins Excel importieren?

::main.bat zur Ordnergroessenauswertung

@echo off
chcp 1252 > nul

echo ^<html^>^<head^>^<title^>Auswertung Datenmengen^<^/titel^>^<^/head^>^<body^>^<table border="1"^> >>auswertung.html  
echo ^<tr^>^<th^>Dateiname^<^/th^>^<th^>Gr&ouml;&szlig;e vorher^<^/th^>^<th^>Gr&ouml;&szlig;e nachher^<^/th^>^<^/tr^> >>auswertung.html

for /f "delims=" %%i in ('dir /b /on /A-d') do call Auswertung.bat "%%i"  

echo ^<^/table^>^<^/body^>^<^/html^> >>auswertung.html

:: auswertung.bat zur Ordnergroessenauswertung
:: wird von main.bat gestartet

@echo off
chcp 1252 > nul 

for %%F in (%1) do set groesse=%%~zF
set /a groessevor=groesse/1000000
set /a groessenach=groessevor*1000000
set /a groessenach=groesse-groessenach
set /a runden=groessenach/1000
set /a nulltest=groessenach/100000
if %nulltest%==0 set null=0
set /a groessenach=groessenach/10000
set /a runden2=groessenach*10
set /a runden=runden-runden2
if %runden% GTR 5 set /a groessenach=groessenach+1

echo ^<tr^>^<td^>%1^<^/td^>^<td^>%groessevor% MB^<^/td^>^<td^>%null%%groessenach% MB^<^/td^>^<^/tr^> >>auswertung.html

Gruß, geTuemII
Member: weierles
weierles Oct 13, 2006 at 14:49:26 (UTC)
Goto Top
Mal eine Frage: Warum wollt ihr das erst ins
Excel importieren?
Gute Frage nächste Frage.
Ich hatte keine gute lösung gefunden, nun hab ich eine. Eine Lösung die mit 3 Dateien auskommt (main.bat, auswertung.bat und logindaten.ftp) Vielen Dank!

Zudem kann ich jetzt, da ich ja mehrere Laufwerke habe, diese in der main.bat aufführen:

for /f "delims=" %%i in ('dir /b /on /A-d C:\unterordner\') do call Auswertung.bat "%%i"
for /f "delims=" %%i in ('dir /b /on /A-d D:\unterordner\') do call Auswertung.bat "%%i"
for /f "delims=" %%i in ('dir /b /on /A-d E:\unterordner\') do call Auswertung.bat "%%i"
Member: weierles
weierles Oct 14, 2006 at 14:52:10 (UTC)
Goto Top
Ich hab nun das ganze weiter gebaut. Läuft alles automatisch, ich gebe nur ein ob externe Festplatten dran sind oder nicht.