tommhii
Goto Top

Name Anzahl und Größe von Dateien die in einen Verzeichnis stehen ermitteln

Ich habe mir ein Script geschrieben , damit lese ich aus einen bestimmten Verzeichnis Dateinamen die Anzahl und deren Größe aus und gebe das Ergebnis aus.

Ich möchte aus einen bestimmten Verzeichnis Dateinamen ,die Anzahl der darin befindlichen Dateien und deren Größe ermitteln. Diese Ergebnisse ( die Echo Zeile )möchte ich dann ausgeben als Variable um diese dann weiter zuverwenden in einer Mail.
Nun möchte ich bei der Größen Angabe den Punkt entfernen (z.B. 319.115 Bytes) und die Pfad angabe vor dem ausgegeben Dateinamen gern entfernen. Hat jemand einen Tip wie ich das elegant lösen kann.

Danke
VG Tommhii

@echo off
cls
echo
echo * Anzahl Name und Größe von Dateien ermitteln die in einen Verzeichnis stehen *
echo * ermitteln *
echo
chcp 1252>nul
set ss=ß
set oe=ö
set ue=ü
chcp 850>nul
set filegr=d:\tmp\*.log
for /F "Tokens=1" %%a in ('dir /S /b d:\Tmp\*.log') do set Name=%%a
dir d:\tmp\*.log|Findstr "Datei" >>datei.Log
For /F "Tokens=3 Delims= " %%a in (datei.Log) do set Variable=%%a
For /F "Tokens=1 Delims= " %%a in (datei.Log) do set Anzahl=%%a

echo %Anzahl% Datei(en) mit dem Namen %Name% und einer Gr%oe%%ss%e %Variable% = Bytes

Content-Key: 187814

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

Ausgedruckt am: 28.03.2024 um 11:03 Uhr

Mitglied: bastla
bastla 11.07.2012 aktualisiert um 13:38:00 Uhr
Goto Top
Hallo tommhi!

Was Du mit dem Namen vorhast, ist mir nicht wirklich klar (es werden ja alle im angegebenen Ordner und in der Struktur unterhalb davon befindlichen "log"-Dateien einbezogen), aber nur den Namen erhältst Du mit "%%~na" oder "%%~nxa" (steht auch in der Hilfe - "for /?") ...

... ansonsten einfach:
@echo off & setlocal
cls
echo\
echo * Anzahl Name und Größe von Dateien ermitteln die in einen Verzeichnis stehen *
echo * ermitteln *
echo\
chcp 1252>nul
set ss=ß
set oe=ö
set ue=ü
chcp 850>nul
set filegr=d:\tmp\*.log
for /f "tokens=1,3" %%i in ('dir /s/-c "%filegr%"^|findstr "Datei(en)"') do set /a Anzahl=%%i & set /a Variable=%%j  
echo %Anzahl% Datei(en) mit einer Gr%oe%%ss%e von %Variable% Bytes
Grüße
bastla

P.S.: Findest Du nicht, dass Batch mit "Code"-Formatierung (lässt sich auch nachträglich hinzufügen) besser aussieht?
Mitglied: tommhii
tommhii 11.07.2012 um 14:50:11 Uhr
Goto Top
Danke bastla für Deine Antwort.
Wenn ich Dich richtig verstehe sollte die Anweisung so aussehen ?
for /F "Tokens=1" %%~na in ('dir /S /b d:\Tmp\*.log') do set Name=%%a
aber so klappt es nicht

meine Ausgabe Zeile sollte so aussehen ohne das in der Klammer
1 Datei(en) mit dem Namen (d:\Tmp\)tag.log einer Größe von 319.115 = Bytes
wie bekommt man den Punkt in der Byte Angabe weg (319.115)

VG
tommhi
Mitglied: bastla
bastla 11.07.2012 aktualisiert um 15:38:32 Uhr
Goto Top
Hallo tommhi!
meine Ausgabe Zeile sollte so aussehen
1 Datei(en) mit dem Namen (d:\Tmp\)tag.log einer Größe von 319.115 = Bytes
Diese Ausgabe ist mE widersinnig - entweder gebe ich die Daten für jede einzelne Datei aus, oder ich will eine Zusammenfassung (x Dateien sind zusammen y Bytes groß) - welcher Dateiname sollte denn dann dort stehen?
Wenn ich Dich richtig verstehe sollte die Anweisung so aussehen ?
for /F "Tokens=1" %%~na in ('dir /S /b d:\Tmp\*.log') do set Name=%%a
Du hast mich weder damit richtig verstanden (und, ganz nebenbei: so viele Alternativen, die Du noch testen könntest, gibt's da nicht) noch mit meinem Hinweis auf die "Code"-Formatierung.
wie bekommt man den Punkt in der Byte Angabe weg (319.115)
Ist Dir ev der Schalter "/-c" in meinem Ansatz oben aufgefallen?

Grüße
bastla
Mitglied: tommhii
tommhii 11.07.2012 um 16:23:13 Uhr
Goto Top
Hallo bastla
Diese Ausgabe ist mE widersinnig - entweder gebe ich die Daten für jede einzelne Datei aus, oder ich will eine
Zusammenfassung (x Dateien sind zusammen y Bytes groß) - welcher Dateiname sollte denn dann dort stehen?
ja sicher die Angabe der Anzahl gehört als letzte zeile in die Datei bin ja gerade am Anfang deshalb bin ich für jeden tip dankbar.
tag.log einer Größe von 319.115 = Bytes
tag1.log einer Größe von 319.115 = Bytes
2 Datei(en)

Du hast mich weder damit richtig verstanden (und, ganz nebenbei: so viele Alternativen, die Du noch testen könntest,
gibt's da nicht) noch mit meinem Hinweis auf die "Code"-Formatierung.
wie wäre denn die anweisung richtg? und was meinst du mit dem Hinweis Code Formatierung, geht es darum weil ich das script so hier rein kopiert habe ?


Ist Dir ev der Schalter "/-c" in meinem Ansatz oben aufgefallen?
ja das ist mir aufgefallen mit dem Schalter /-c aber der lösst bei mir nicht das Problem mit dem Punkt, der erscheint trotzdem in der Ausgabe

VG
tommhi
Mitglied: bastla
bastla 11.07.2012 um 16:44:18 Uhr
Goto Top
Hallo tommhii!
ja sicher die Angabe der Anzahl gehört als letzte zeile in die Datei bin ja gerade am Anfang
Warum beschreibst Du dann Dein Vorhaben nicht gleich komplett?

Vesuch es etwa so:
...
set "Pfad=d:\tmp"  
set "Typ=log"  
set /a Anz=0
for /f "tokens=3*" %%i in ('dir /s/-c "%Pfad%\*.%Typ%"^|findstr /e "\.%Typ%"') do echo %%j einer Gr%oe%%ss%e von %%i = Bytes & set /a Anz+=1  
echo %Anz% Datei(en)
Hinsichtlich des "/-c": Hast Du schon ein einfaches "dir /-c" an der Kommandozeile getestet und funktioniert es dort auch nicht?

Grüße
bastla
Mitglied: tommhii
tommhii 11.07.2012 um 17:01:40 Uhr
Goto Top
Hallo bastla!

sorry das ich mich nicht gleich so ausgedrückt habe, das du nicht wußtest wo ich hin will.
ich will mir praktisch vor einer Sicherung die Dateinamen mit angabe der größe in eine Datei schreiben um einen Überblick zu haben, was ich gesichert habe.
das mit dem Schalter /-c funktioniert hatte da ein Zeichen falsch.
Ich hab dann nur noch eine Frage, wo baue ich die Umleitung ein, das die Dateinamen die Größe und die Anzahl in eine Datei geschrieben werden. So wie es in den Script angezeigt wird.
Dateia.log Größe von 3333=Bytes
Dateib.log Größe von 3333=Bytes
2 Datei(en)

Danke für deine Unterstützung hätte da bestimmt noch Tage dran gesessen.
VG
tommhii
Mitglied: bastla
bastla 11.07.2012 um 17:16:53 Uhr
Goto Top
Hallo tommhii!

Umleitung einfach jeweils vor das "echo":
set "Aus=D:\Dein.log"  
del "%Aus%" 2>nul  
...
for /f "tokens=3*" %%i in ('dir /s/-c "%Pfad%\*.%Typ%"^|findstr /e "\.%Typ%"') do set /a Anz+=1 & >>"%Aus%" echo %%j einer Gr%oe%%ss%e von %%i = Bytes  
>>"%Aus%" echo %Anz% Datei(en)  
Grüße
bastla
Mitglied: tommhii
tommhii 12.07.2012 um 07:22:14 Uhr
Goto Top
Hallo bastla,

danke erst mal es klappt muss die Ausgabe moch in ein ordentliches Format bringen.
Ich hab noch eine Frage kann ich die variablen die hier entstehen, in eine bestehende Textdatei einfügen.
In etwa so z.B. Inhalt der Datei : Datei.log
Bei der Sicherung wurden %ANZ% gesichert. Ist das möglich?

VG
tommhi
Mitglied: bastla
bastla 12.07.2012 um 09:54:40 Uhr
Goto Top
Hallo tommhii!
kann ich die variablen die hier entstehen, in eine bestehende Textdatei einfügen.
Du kannst eine Textdatei mit den gewünschten Inhalten - per "echo" und Ausgabeumleitung (mit ">") - erstellen oder einer bestehende Datei (mit ">>") eine Zeile hinzufügen ...

Grüße
bastla
Mitglied: tommhii
tommhii 12.07.2012 um 13:49:02 Uhr
Goto Top
Hallo bastla!
Du kannst eine Textdatei mit den gewünschten Inhalten - per "echo" und Ausgabeumleitung (mit
">") - erstellen oder einer bestehende Datei (mit ">>") eine Zeile hinzufügen ...

Ich weiss das ich an eine bestehende Datei Zeilen hinzufügen bzw anhängen kann. Meine Frage war, ob ich gewisse Inhalte, an eine bestimmte Stelle in eine bestehende Datei einfügen kann.
z.B.

Es wurden xxxxxx Dateien gesichert. (an die Stelle wo die XXX stehen den Inhalt von %Anz%)

VG
tommhi
Mitglied: bastla
bastla 12.07.2012 um 14:46:03 Uhr
Goto Top
Hallo tommhii!

Wenn es sich offensichtlich um eine Vorlage handelt, dann kannst Du in "Vorlage1.txt" den Teil vor der fraglichen Zeile und in "Vorlage2.txt" alle noch folgenden Zeilen hinterlegen und das Dokument mit dem gewünschten Inhalt so erstellen:
 >Ausgabe.txt type Vorlage1.txt
>>Ausgabe.txt echo Es wurden %Anz% Dateien gesichert.
>>Ausgabe.txt type Vorlage2.txt
Grüße
bastla
Mitglied: tommhii
tommhii 12.07.2012 um 16:21:09 Uhr
Goto Top
Zitat von @bastla:

Hallo bastla
 >Ausgabe.txt type Vorlage1.txt
> >>Ausgabe.txt echo Es wurden %Anz% Dateien gesichert.
> >>Ausgabe.txt type Vorlage2.txt
> 

Sicher hab ich mich falsch ausgedrückt die Zeile Es wurden %Anz% Dateien gesichert befindet sich in der Vorlagen Datei und zwischen dem worten "wurden und Dateien " wollte ich den ermittelten Wert der Variablen %Anz% einfügen.

 blat.exe %Email% -t Empfänger@web.de -c Kopie@web.de -s "Übermittlung des Sicherungsprotokoll ist erfolgt"  
> 
Ich habe noch eine Frage zu den Umlauten , beim Email Versand benutze ich blat das funktioniert auch gut nur das Ü von Übermittlung wird als _ dargestellt.
Wenn ich für das Ü %ue% einsetze sieht der betreff und der text in der Email so aus :
Betreff =?ISO-8859-1?Q?=DCbermittlung=20des=20Sicherungsprotokoll=
was mache ich falsch ich habe doch in dem script folgende Zeilen am Anfang eingetragen
 chcp 1252>nul
set ss=ß
set oe=ö
set ue=ü
chcp 850>nul
> 

VG
tommhi
Mitglied: bastla
bastla 12.07.2012 um 18:17:13 Uhr
Goto Top
Hallo tommhii!
Sicher hab ich mich falsch ausgedrückt die Zeile Es wurden %Anz% Dateien gesichert befindet sich in der Vorlagen Datei und zwischen dem worten "wurden und Dateien " wollte ich den ermittelten Wert der Variablen %Anz% einfügen.
Das habe ich schon verstanden - deswegen auch der Vorschlag, die Vorlagendatei aufzuteilen in "vor der Anzahl-Zeile" und "nach der Anzahl-Zeile" und die "Anzahl-Zeile" selbst einfach direkt per "echo" zu erstellen. Wenn Du allerdings tatsächlich einen Platzhalter ersetzen willst, findest Du eine Reihe von Threads zum Thema "Ersetzen in Batch" und sogar einen entsprechenden ...
Was die Umlaute anlangt: Was spricht eigentlich dagegen, auf Codepage 1252 zu bleiben?

Grüße
bastla
Mitglied: tommhii
tommhii 13.07.2012 um 10:46:54 Uhr
Goto Top
ja ich hab schon alles probiert, aber die Umlaute werden im Betreff der Email nicht dargestellt. Irgendwie komm ich nicht weiter.

jemand noch einen Tip

VG
tommhi
Mitglied: tommhii
tommhii 20.07.2012 aktualisiert um 11:51:42 Uhr
Goto Top
Hallo,

das mit den Umlauten hab ich hin bekommen, ich hab aber noch ein anderes problem wo ich nicht weiss wie ich es realisieren soll.

Folgendes problem beschäftigt mich jetzt noch, es wäre schön wenn mir jemand einen tip geben könnte.
ich habe in einen Ordner ca 10 xml Dateien aus denen lese ich eine bestimmte zeichenfolge aus. Wenn die Datei die zeichenfolge enthält setze ich eine 1 an den dateinamen und schreibe den Dateinamen eine Datei mit dem Befehl
>
 Find /C "25 , 30 ,10" *.xml | Find "XML: 1" > ergebnis.log   
> > 
wie kann man das machen, das man von allen Dateinen die jetzt in der ergebnis.log stehen nochmal eine bestimmte zeichenfolge abfragt und den Wert der Abfrage hinter den Dateinamen in der Liste (ergebnis.log) schreibt.


VG
Tommhi
Mitglied: bastla
bastla 20.07.2012 um 13:33:17 Uhr
Goto Top
Hallo tommhii!

Da Deine Zusatzfrage schon relativ weit vom ursprünglichen Thema des Threads entfernt ist, schlage ich vor, sie etwas genauer formuliert in einem neuen Beitrag nochmals zu stellen ...

Grüße
bastla
Mitglied: pbelcl
pbelcl 02.08.2016 um 18:19:25 Uhr
Goto Top
Hallo @bastla
Habe deinen Code gerade gefunden und in ein Batch von mir eingebaut, DANKE!
for /f "tokens=1,3" %%i in ('dir /s/-c "%filegr%"^|findstr "Datei(en)"') do set /a Anzahl=%%i & set /a Variable=%%j   
echo %Anzahl% Datei(en) mit einer Gr%oe%%ss%e von %Variable% Bytes
Passt hervorragend!!

Die Krönung wäre jetzt noch die Anzeige in Megabyte face-wink
Mir wär nur eingefallen die Punkte in der Zahl mit /c einzublenden, abzufragen und das ergebnis in 4 einzelne Variablen aufzuteilen
Geht das vielleicht einfacher ??
Mitglied: bastla
bastla 06.08.2016 um 17:06:28 Uhr
Goto Top
Hallo pbelcl!

Rechnen mit so großen Zahlen ist in CMD eigentlich nicht möglich (nur im Bereich von -2.147.483.648 bis +2.147.483.647, also 31 Bit), daher musst Du ohnehin tricksen - machst Du es wie die Fetplattenhersteller (1 MB = 1.000.000 Bytes), könntest Du einfach mit %Variable:~0,-6% die letzten 6 Stellen weglassen (und würdest damit dann eben auf ganze MB abrunden); ansonsten wird es etwas aufwändiger (zB mittels eines temporären VBScripts - findest Du auch hier irgendwo) ...

Grüße
bastla
Mitglied: pbelcl
pbelcl 06.08.2016 um 18:14:02 Uhr
Goto Top
Danke Bastla für den Tipp!
Das reicht mir schon, muss nur eine ungefähre Größenangabe ausgeben um zu kontrollieren ob ein Kopiervorgang erfolgreich war ....