Alle Dateien in einem Ordner + Unterordner zählen
Hallo,
ich habe einen Ordner mit einer Menge Unterordner.
Darin befinden sich DOC-Dateien, TXT-Dateien sowie XLS-Dateien (od. XLSX).
Nun möchte ich gerne wissen, wie viele Dateien sich in welchem Ordner befinden.
Das Ergebnis soll dann in eine Text-Datei geschrieben werden.
Versucht habe ich es hiermit... aber leider nicht mit dem gewünschten Erfolg:
Wer kann mir weiterhelfen?
Grüße von
Yan
ich habe einen Ordner mit einer Menge Unterordner.
Darin befinden sich DOC-Dateien, TXT-Dateien sowie XLS-Dateien (od. XLSX).
Nun möchte ich gerne wissen, wie viele Dateien sich in welchem Ordner befinden.
Das Ergebnis soll dann in eine Text-Datei geschrieben werden.
Versucht habe ich es hiermit... aber leider nicht mit dem gewünschten Erfolg:
@echo off &setlocal
set "root=S:\DELETE\ARCHIV\FIBU"
>test.txt type nul
for /f "delims=" %%a in ('dir /ad /b "%root%" 2^>nul') do (
set "folder=%root%\%%~a"
set /a n=0
setlocal enabledelayedexpansion
for /f "delims=" %%b in ('dir /a-d /b "!folder!" 2^>nul') do (
set /a n+=1
)
set "folder=%%~a "
>>test.txt echo !folder:~,40! !n! Dateien
endlocal
)
Wer kann mir weiterhelfen?
Grüße von
Yan
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 5291759959
Url: https://administrator.de/contentid/5291759959
Ausgedruckt am: 22.11.2024 um 03:11 Uhr
11 Kommentare
Neuester Kommentar
Hi,
ich würde zur Powershell greifen.
Ergebnis:
ich würde zur Powershell greifen.
$path = "c:\tmp"
$outTXT = "c:\tmp\out.txt"
$subfolders = Get-ChildItem $path -Directory
if(Test-Path $outTXT){
Remove-Item $outTXT
}
foreach ($folder in $subfolders) {
$count = (Get-ChildItem -File $folder.FullName | Measure-Object).Count
"Im Ordner $folder liegen $count Dateien" | Out-File -Append -Encoding utf8 -FilePath $outTXT
}
Ergebnis:
Im Ordner unterordner1 liegen 3 Dateien
Im Ordner unterordner2 liegen 1 Dateien
Im Ordner unterordner3 liegen 14 Dateien
Im Ordner unterordner4 liegen 7 Dateien
Im Ordner unterordner5 liegen 7 Dateien
Moin,
wenn du einen Quick'n'dirty-Einzeiler suchst, bitte:
Ist jetzt für die Kommandozeile , aber du kannst dir das bestimmt für die Batch anpassen. Zwei Einschränkungen gelten allerdings:
Gruß
TA
wenn du einen Quick'n'dirty-Einzeiler suchst, bitte:
for /f "delims=" %a in ('dir c:\users\TwistedAir\downloads /ad /b /s') do ((echo %a & dir "%a"|findstr "Datei")>>test.txt)
Ist jetzt für die Kommandozeile , aber du kannst dir das bestimmt für die Batch anpassen. Zwei Einschränkungen gelten allerdings:
- Bei den Verzeichnissen werden "Junctions" (Verknüpfungen zwischen Verzeichnissen) mitgezählt. Das siehst du, wenn du den Schalter /b bei dir /ad /b /s weglässt. Beim Vorhandensein von Junctions können somit Verzeichnisse doppelt gezählt werden.
- Keine Datei darf im Namen Datei haben, sonst greift das findstr
- und es wird die Größe des Verzeichnisse angezeigt (aus der Zusammenfassung des zweiten Dir-Befehls - aber da bietet sich das Komma als Trennzeichen an, wenn es stört)
Gruß
TA
Warum der Verzeichnisname abgekürzt wird
Verstehst du deinen eigenen Code nicht? Auch da wolltest du eine fixe Länge von 40 Zeichen. Ist der Pfad kürzer, wird mit Leerzeichen aufgefüllt. Bedeutet aber auch dass Pfade die länger sind abgeschnitten werden.und auch Umlaute nicht ausgegeben werden
Ist halt Batch, was mit einer anderen Zeichencodierung arbeitet. Ein ...>nul chcp 1252
... irgendwo an den Anfang des Scripts reinpacken.
die mindestens 1 Datei enthalten
Simple IF Bedingung.Und vielleicht ganz unten auch eine Addition aller Dateien
Addition mittels SET /A
im Schleifenrumpf.Steffen
Ich hatte den größten Teil meines Codes von einer Webseite kopiert.
Wenn du dann nicht verstehst was du kopierst, dann hör besser auf mit kopieren. Ich würde jedenfalls nicht davon ausgehen dass du mit copy/paste durchkommst. Mach ich jetzt aus Jux noch mal, aber eigentlich hatte ich dir geschrieben was du tun musst. Den Code hast du ansonsten wieder nicht gelesen, ansonsten wäre dir aufgrund meiner Erklärung aufgefallen dass du das Anhängen der Leerzeichen nicht mehr brauchst.set "root=S:\DELETE\ARCHIV\FIBU"
set "total=0"
>"s:\delete\dateien.txt" (
for /d /r "%root%" %%d in (*) do (
for /f %%n in ('2^>nul dir /a-d /b "%%~d"^|find /c /v ""') do (
set /a "total+=%%n"
if %%n neq 0 echo "%%~d" - %%n Datei(en^)
)
)
setlocal EnableDelayedExpansion
echo Summe: !total! Datei(en^)
endlocal
)
Noch ein gut gemeinter Rat - Bei deinem Wissenstand zu Batch Scripting tut es noch nicht weh wenn du so schnell wie möglich wieder aufgibst dich damit zu beschäftigen und statt dessen gleich auf PowerShell umschwenkst.
Warum PowerShell und nicht Batch?
Steffen
Zum Chaos mit Zeichencodierungen unter Windows kann ich ein komplettes Essay schreiben, verkneife ich mir aber in deinem Thread
Um zu viel Mist zu vermeiden, stelle die Zeichencodierung per CHCP entweder auf die auf deinem Rechner verwendete ANSI Codierung (Codepage 1252 hierzulande) oder auf moderneren Windowsversionen auch UTF-8 (Codepage 65001). Achte darauf dass die eingestellte Codierung dieselbe ist, in der dein Scriptcode gespeichert ist, sonst erzeugst du nur noch mehr Mist.
CHCP funktioniert natürlich komplett ohne
Ob man die Umleitung nun voran- oder nachstellt, ist für CHCP irrelevant. Beides funktioniert. Aber da das Nachstellen der Umleitung Sideffects haben kann, habe ich mir angewöhnt Umleitungen voranzustellen, dann brauche ich nicht mehr darüber nachzudenken.
... schreibt ein "ECHO ist eingeschaltet (ON)." oder "ECHO ist ausgeschaltet (OFF)." in die Datei, da die 1 direkt vor dem Umleitungssymbol > als Stream-Identifikator für den Standard-Ausgabestream interpretiert wird.
... tut fast das was es soll. Das Leerzeichen hinter der 1 landet aber mit in der Datei.
... macht dann endlich alles richtig.
Außerdem kann das Voranstellen die Lesbarkeit des Codes verbessern. Statt ...
... besser ...
Steffen
Edit: vergessen zu beantworten
Um zu viel Mist zu vermeiden, stelle die Zeichencodierung per CHCP entweder auf die auf deinem Rechner verwendete ANSI Codierung (Codepage 1252 hierzulande) oder auf moderneren Windowsversionen auch UTF-8 (Codepage 65001). Achte darauf dass die eingestellte Codierung dieselbe ist, in der dein Scriptcode gespeichert ist, sonst erzeugst du nur noch mehr Mist.
CHCP funktioniert natürlich komplett ohne
>nul
, schreibt dann aber immer eine Meldung. Das >nul
leitet diese Meldung ins Nirvana um und unterdrückt somit die Ausgabe.Ob man die Umleitung nun voran- oder nachstellt, ist für CHCP irrelevant. Beides funktioniert. Aber da das Nachstellen der Umleitung Sideffects haben kann, habe ich mir angewöhnt Umleitungen voranzustellen, dann brauche ich nicht mehr darüber nachzudenken.
echo 1>"test.txt"
echo 1 >"test.txt"
>"test.txt" echo 1
Außerdem kann das Voranstellen die Lesbarkeit des Codes verbessern. Statt ...
echo Lorem ipsum dolor sit amet,>"test.txt"
echo consectetur adipiscing elit,>>"test.txt"
echo sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.>>"test.txt"
echo Ut enim ad minim veniam,>>"test.txt"
echo quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.>>"test.txt"
>"test.txt" echo Lorem ipsum dolor sit amet,
>>"test.txt" echo consectetur adipiscing elit,
>>"test.txt" echo sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
>>"test.txt" echo Ut enim ad minim veniam,
>>"test.txt" echo quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
Steffen
Edit: vergessen zu beantworten
Soll man also das "chcp 850" am Ende nicht mehr setzen?
CHCP ändert den Zeichensatz nur für den derzeitigen Prozess. Heißt, in deinem Fall ist das vermutlich völlig egal, es sei denn du führst das Script aus einem laufenden CMD Prozess aus (bspw. per CALL aus einem anderen Script), der nach der Abarbeitung weiter läuft.