maxxer
Goto Top

batch liste erstellen

Hi, ich hab schon im ganzen Netz gesucht und nichts gefunden...
Da hier, wie ich finde, die besten Batch - Programmierer sind, bin ich mit meiner Frage hierhergekommen....
Ich habe schon Teile meiner Batch, aber mir fehlt halt noch sehr viel...
Ich möchte den Ordnerinhalt in eine .txt Datei speichern (was nicht gerade schwer ist!)
Nun soll die txt Datei folgendermaßen aussehen:

Dateiname Größe Dateityp

A

B

C

D
Datei 1 2mb txt
Datei 2 10mb pdf

E
Einleitung 15mb html

F
.
.
.


Und so weiter...

also soll der Dateiname unter dem jeweiligen Buchstaben eingetragen werden...
Die Größen und Dateitypen sollten möglichst alle untereinander stehen..

Hoffe sehr, das ihr mir helfen könnt!
Vielen Dank schonmal vorweg!
mfg maxxer

Content-Key: 84233

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

Printed on: April 18, 2024 at 04:04 o'clock

Member: bastla
bastla Mar 29, 2008 at 15:21:28 (UTC)
Goto Top
Hallo maxxer und willkommen im Forum!

Danke für die Vorschusslorbeeren - schaun mer mal, ob die sich auch verdienen lassen ... face-smile

Mit gewissen Einschränkungen sollte folgendes Batch-Gerüst etwa das von Dir gewünschte Ergebnis erzeugen:
@echo off & setlocal
set "Ordner=%~1"  
if %Ordner:~-1%==\ set "Ordner=%Ordner:~0,-1%"  
for %%i in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
	echo\
	echo %%i
	for /f "delims=" %%a in ('dir /b /on /a-d "%Ordner%\%%i*.*" 2^>nul') do call :ProcessFile "%Ordner%\%%a"  
)	
goto :eof
	
:ProcessFile
set "DName=%~n1                                        "  
set "DTyp=%~x1"  
set /a "DMB=%~z1/1024/1024"  
set "DGr=      %DMB%"  
echo %DName:~0,40%%DGr:~-6%mb %DTyp:.=%
goto :eof
Die genannten Einschränkungen betreffen einerseits den Dateinamen (für Sonderzeichen , vor allem "&", im Namen ist derzeit nicht vorgesorgt bzw wäre die spaltengerechte Formatierung etwas aufwändiger; die Spaltenbreite ist außerdem vorweg anzugeben, im Beispiel oben 40 Zeichen), andererseits die Berechnung der Dateigröße in MB - ist eine Datei größer als 2.147.483.647 Byte, kann die Umrechnung in MB nicht mehr (fehlerfrei) vorgenommen werden.

Der oben dargestellte Batch ist zum Aufruf mit Übergabe des aufzulistenden Ordnerpfades gedacht.

Grüße
bastla

P.S.: Besser ginge es mit einem VBScript (welches sich auch in den Batch integrieren ließe).
Member: maxxer
maxxer Mar 29, 2008 at 17:52:42 (UTC)
Goto Top
Danke ersteinmal!
Die Einschränkungen sind nicht schlimm, da sie eh nicht vorkommen!

Aber in welcher .txt Datei wird das Ergebnis gespeichert?
Member: bastla
bastla Mar 29, 2008 at 18:00:43 (UTC)
Goto Top
Hallo maxxer!

Da diese Version als Demo gedacht war, erfolgt derzeit nur eine Bildschirmausgabe.

Zum Schreiben in eine Datei einfach am Anfang (nach der ersten "set"-Zeile)
set "Liste=D:\Dateiliste.txt"  
if exist "%Liste%" del "%Liste%"  
hinzufügen und die vorletzte Zeile ändern auf
echo %DName:~0,40%%DGr:~-6%mb %DTyp:.=%>>"%Liste%"  

Grüße
bastla
Member: maxxer
maxxer Mar 29, 2008 at 18:27:55 (UTC)
Goto Top
Iwie wills bei mir net...
Der gesamte Code sieht dann so aus:

@echo off & setlocal
set "Ordner=%~1"
set "Liste=D:\Dateiliste.txt"
if exist "%Liste%" del "%Liste%"
if %Ordner:~-1%==\ set "Ordner=%Ordner:~0,-1%"
for %%i in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
echo\
echo %%i
for /f "delims=" %%a in ('dir /b /on /a-d "%Ordner%\%%i*.*" 2^>nul') do call :ProcessFile "%Ordner%\%%a"
)
goto :eof

:ProcessFile
set "DName=%~n1 "
set "DTyp=%~x1"
set /a "DMB=%~z1/1024/1024"
set "DGr= %DMB%"
echo %DName:~0,40%%DGr:~-6%mb %DTyp:.=%>>"%Liste%"
goto :eof

Unter D: ist kein Textfile, der Dateiliste heißt...
Hoffe ihr könnte helfen

PS: Sind - _ das Sonderzeichen?
Member: bastla
bastla Mar 29, 2008 at 18:51:03 (UTC)
Goto Top
Hallo maxxer!

Bis auf die Tatsache, dass auch die beiden Zeilen
echo\
echo %%i
noch eine Umleitung benötigen und daher so aussehen sollten
echo\>>"%Liste%"  
echo %%i>>"%Liste%"  
damit auch die einleitenden Buchstaben und die Leerzeilen in die Datei geschrieben werden, gibt es mit dem Erstellen der Listendatei auf D: bei mir kein Problem.

Nur zur Sicherheit: Du hast auch beim Starten den gewünschten Ordner angegeben? Wenn der Batch zB als "MacheListe.cmd" gespeichert ist, wäre er etwa so zu starten:
MacheListe D:\Test
Beim Deinem Code fehlen übrigens diverse Leerzeichen in den Zeilen
set "DName=%~n1 "  
und
set "DGr= %DMB%"  
Diese Leerzeichen sind für die Ausrichtung der Spalten erforderlich.
Mit " - _" sollte es keine Probleme geben.

Grüße
bastla
Member: maxxer
maxxer Mar 29, 2008 at 19:06:33 (UTC)
Goto Top
Hi, ich kapier nicht, was du hiermit meinst:
"Nur zur Sicherheit: Du hast auch beim Starten den gewünschten Ordner angegeben? Wenn der Batch zB als "MacheListe.cmd" gespeichert ist, wäre er etwa so zu starten:

MacheListe D:\Test
"
Die Leerzeichen habe ich gelassen, die sind nur durch den Beitrag verloren gegangen...
Also, wenn ich die Btach ausführe, dann stürzt sie nach der Zeile:

if %Ordner:~-1%==\ set "Ordner=%Ordner:~0,-1%"

ab...das hab ich mit dem Befehl "pause" überprüft...
dann ist mir aufgefallen, dass dort "goto :eof" steht, aber es nirgendwo ":eof" steht....
Sry, bin echt Anfänger...
vllt könntest du einfach den kompletten Code posten, danke!

PS: Die besten Batch-Coder hier!!
Member: bastla
bastla Mar 29, 2008 at 19:51:55 (UTC)
Goto Top
Hallo maxxer!

Auch (oder besonders) als Anfänger ist es empfehlenswert, Batchdateien von der Kommandozeile (Start / Ausführen / cmd) zu testen - so kannst Du wesentlich besser nachvollziehen, wie der Batch abläuft und welche Fehlermeldungen ausgegeben werden. Diese Art des Startens hatte ich eigentlich gemeint.

Es gibt aber auch anderen Möglichkeiten: Du kannst Drag & Drop verwenden (also einfach aus dem Explorer einen Ordner auf die Batchdatei ziehen) oder, zumindest zum Testen, den gewünschten Ordner in die Zeile 2 schreiben, also etwa
set "Ordner=D:\Test"  
Zum "goto :eof" - damit wird ein Batch (oder ein Unterprogramm, wie ":ProcessFile") beendet ("eof" steht für "end of file" und bedeutet also einen Sprung ans Ende des Batches).
Hier noch einmal der gesamte Batch (mit einer minimalen Änderung):
@echo off & setlocal
set "Ordner=%~1"  
set "Liste=D:\Dateiliste.txt"  
if exist "%Liste%" del "%Liste%"  

if %Ordner:~-1%==\ set "Ordner=%Ordner:~0,-1%"  
for %%i in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
	echo %%i>>"%Liste%"  
	for /f "delims=" %%a in ('dir /b /on /a-d "%Ordner%\%%i*.*" 2^>nul') do call :ProcessFile "%Ordner%\%%a"  
	echo\>>"%Liste%"	  
)	
goto :eof

:ProcessFile
set "DName=%~n1                                        "  
set "DTyp=%~x1"  
set /a "DMB=%~z1/1024/1024"  
set "DGr=     %DMB%"  
echo %DName:~0,40%%DGr:~-6%mb %DTyp:.=%>>"%Liste%"  
goto :eof

Grüße
bastla

P.S.: Damit beim Posten keine Leerzeichen verloren gehen, gibt es hier -Tags ...
Member: maxxer
maxxer Mar 29, 2008 at 20:17:28 (UTC)
Goto Top
Bei mir läuft die Batch einfach nicht! -.-
Ich habe ans Ende ne Pause gesetzt, um zu testen, ob die Batch überhaupt bis dahin kommt...
Aber das Fenster schließt sich vorher!

Edit: Hab hier mal die Fehlerzeile und die Fehlermeldung!

if %Ordner:~-1%==\ set "Ordner=%Ordner:~0,-1%"


"-1"" ist syntaktisch an dieser Stelle nicht verarbeitbar.

@bastla: Benutzt du einen Instant-Messenger?
Member: bastla
bastla Mar 29, 2008 at 20:34:09 (UTC)
Goto Top
Hallo maxxer!

Für die von Dir beschriebene Fehlermeldung gibt es nur eine Erklärung: Die Variable %Ordner% hat keinen Inhalt, weil Du keinen Ordner angegeben/übergeben hast.

Magst Du es daher nochmals mit einer der beschriebenen Methoden "Kommandozeile", "Drag & Drop" oder Eintragen des gewünschten Pfades direkt in den Batch versuchen?

Grüße
bastla
Member: maxxer
maxxer Mar 29, 2008 at 20:41:49 (UTC)
Goto Top
Ahh du bist der Beste!!
Das mit dem Drag&Drop klappt prima...das andere kapier ich net (bin zu dumm)
Nur kann man den Abstand zwischen der Dateigröße und dem Dateitypen etwas größer sein?
Member: bastla
bastla Mar 29, 2008 at 20:57:35 (UTC)
Goto Top
Hallo maxxer!

Nur kann man den Abstand zwischen der Dateigröße und dem Dateitypen etwas größer sein?
Um vielleicht Deine zukünftige Batcher-Karriere etwas zu fördern, eine etwas genauere Erklärung der folgenden Zeile (dann kannst Du die Ausgabe leicht anpassen):
echo %DName:~0,40%%DGr:~-6%mb %DTyp:.=%>>"%Liste%"  
In %DName% stehen der Dateiname und eine Menge Leerzeichen - die ersten 40 Stellen davon werden ausgegeben (das wäre also der Teil "%DName:~0,40%").

%DGr% enthält einige Leerzeichen und danach die Dateigröße als Zahl - hier werden die letzten 6 Stellen (wegen -6) ausgegeben (für eine Datei mit 12 MB also zB 4 Leerzeichen und die Zahl 12 - das macht der Teil "%DGr:~-6%").

Dahinter folgt der fixe Text "mb" und ein Leerzeichen, und dann noch der Dateityp (%DTyp%, Inhalt zb ".txt"), von dem wir allerdings den Punkt nicht wollen und diesen daher durch Nichts (steht zwischen dem "=" und dem "%" face-wink) ersetzen (%DTyp:.=%).

Wenn Du also zwischen der Dateigröße und dem Typ mehr als nur ein Leerzeichen willst, schaffst Du das (bin ich mir sicher) jetzt auch selbst ... face-smile

Ach ja, damit die so erstellte Zeile an die Dateiliste angefügt wird, kommt dann noch: >>"%Liste%"

Grüße
bastla
Member: maxxer
maxxer Mar 29, 2008 at 21:22:44 (UTC)
Goto Top
Vorab ersteinmal: Tausend Dank! Ein so kompetente Hilfe hatte ich schon lange nicht mehr!
Respekt!

Hab ich nach ein bisschen probieren dann auch hinbekommen!

Eine wirklich allerletzte Frage:
Es gibt nun auch Dateien, die mit Zahlen beginnen...
könnten eine Katergorie 0-9 noch vor dem Buchstaben A angelegt werden?
Wäre wirklich sehr dankbar...

Werde das Forum hier auch weiterempfehlen!!!
Member: bastla
bastla Mar 29, 2008 at 21:29:26 (UTC)
Goto Top
Hallo maxxer!

Freut mich wenn's geholfen hat ... face-smile

Die Ergänzung um Ziffern oder zB auch Sonderzeichen kannst Du in der Zeile
for %%i in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
vornehmen - dabei ist nur zu beachten, dass jeweils ein Leerzeichen als Trennzeichen gesetzt werden muss.

Grüße
bastla
Member: maxxer
maxxer Mar 29, 2008 at 21:36:22 (UTC)
Goto Top
Soweit war ich dann doch schon :D:D
Aber wenn ich folgendes schreib,

for %%i in (1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (

dann listet er jede Zahl einzeln...
Ich möchte aber gerne eine Kategorie die 1-9 heißt, in die alle Zahlen hinein getragen werden..
Member: bastla
bastla Mar 29, 2008 at 21:54:13 (UTC)
Goto Top
Hallo maxxer!

Ich möchte aber gerne eine Kategorie die 1-9 heißt, in die alle Zahlen hinein getragen werden..
Ich biete Dir sogar 0-9 ... face-wink

Dazu den folgenden Block nach der Zeile "if %Ordner..." einfügen:
echo 0-9>>"%Liste%"  
for %%i in (0 1 2 3 4 5 6 7 8 9) do (
	for /f "delims=" %%a in ('dir /b /on /a-d "%Ordner%\%%i*.*" 2^>nul') do call :ProcessFile "%Ordner%\%%a"  
)	
echo\>>"%Liste%"  

Grüße
bastla
Member: maxxer
maxxer Mar 29, 2008 at 22:16:26 (UTC)
Goto Top
Du hast es einfach drauf!
Wieso gibt es NICHT nur solche hilfsbereiten User mit einem so ernormen Wissen und Können^^?

Eine, letzte Frage...
Was müsste ich verändern, damit Dateien aus Unterordnern mit aufgelistet werden?
Member: bastla
bastla Mar 30, 2008 at 08:15:16 (UTC)
Goto Top
Hallo maxxer!

Was müsste ich verändern, damit Dateien aus Unterordnern mit aufgelistet werden?
Eigentlich nur jeweils "dir /s /b ..." schreiben - allerdings werden dann die kompletten Pfade ausgegeben ...

Grüße
bastla
Member: maxxer
maxxer Mar 30, 2008 at 12:45:08 (UTC)
Goto Top
Geht es auch, dass der Pfad nicht angezeigt wird?
Member: bastla
bastla Mar 30, 2008 at 14:53:29 (UTC)
Goto Top
Hallo maxxer!

Wenn tatsächlich nur der Dateiname (ohne Hinweis darauf, in welchem Unterordner sich die Datei befindet) ausgegeben werden soll, dann etwa so:
@echo off & setlocal
set "Ordner=%~1"  
set "Liste=D:\Dateiliste.txt"  

if exist "%Liste%" del "%Liste%"  
if %Ordner:~-1%==\ set "Ordner=%Ordner:~0,-1%"  

echo 0-9>>"%Liste%"  
for %%i in (0 1 2 3 4 5 6 7 8 9) do (
	for /f "delims=" %%a in ('dir /s /b /on /a-d "%Ordner%\%%i*.*" 2^>nul') do call :ProcessFile "%%a"  
)	
echo\>>"%Liste%"  

for %%i in (A B C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
	echo %%i>>"%Liste%"  
	for /f "delims=" %%a in ('dir /s /b /on /a-d "%Ordner%\%%i*.*" 2^>nul') do call :ProcessFile "%%a"  
	echo\>>"%Liste%"	  
)	
goto :eof

:ProcessFile
set "DName=%~n1                                        "  
set "DTyp=%~x1"  
set /a "DMB=%~z1/1024/1024"  
set "DGr=     %DMB%"  
echo %DName:~0,40%%DGr:~-6%mb   %DTyp:.=%>>"%Liste%"  
goto :eof
Die Sortierung innerhalb eines Buchstabens funktioniert nur auf Ordnerebene - es werden daher zB zunächst alle mit A beginnenden Dateien des übergebenen Ordners sortiert ausgegeben, danach jene des ersten Unterordners (bezogen auf den Unterordner sortiert), dann die des nächsten Unterordners and so on ...

Grüße
bastla
Member: maxxer
maxxer Mar 30, 2008 at 20:24:22 (UTC)
Goto Top
Hi, danke läuft alles prima...
nun eine komplett andere Frage:
Ich möchte alle .rar - Archive aus einem Ordner entpacken und wenn das entpacken erfolgreich ist, sollen die Archive gelöscht werden.
Wenn das entpacken nicht erfolgreich war, sollen die Archive nicht gelöscht werden....
Also z.b:
Datei.part1.rar + Datei.part2.rar + Datei.part3.rar --> Datei.txt
Wenn das entpacken erfolgreich ist, dann werden Die Parts "Datei.part1.rar", "Datei.part2.rar" und "Datei.part3.rar" gelöscht, wenn nicht, dann nicht!
Und das soll für alle Archive eines Ordner gemacht werden!

Danke jetzt schonmal!!
Member: bastla
bastla Mar 30, 2008 at 20:42:03 (UTC)
Goto Top
Hallo maxxer!

... eine komplett andere Frage ...
... sollte in einem komplett anderen Thread stehen. face-wink

Grüße
bastla