yan2021
Goto Top

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:

@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 face-wink

Content-ID: 5291759959

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

Ausgedruckt am: 22.11.2024 um 03:11 Uhr

3063370895
3063370895 11.01.2023 aktualisiert um 16:45:40 Uhr
Goto Top
Hi,

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
TwistedAir
TwistedAir 11.01.2023 um 17:20:16 Uhr
Goto Top
Moin,

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
rubberman
rubberman 11.01.2023 um 18:03:17 Uhr
Goto Top
Ggf. auch so
@echo off &setlocal
set "root=S:\DELETE\ARCHIV\FIBU"  
set "spaces=                                        "  
>"test.txt" (  
  for /d /r "%root%" %%d in (*) do (  
    for /f %%n in ('2^>nul dir /a-d /b "%%~d"^|find /c /v ""') do (  
      set "folder=%%d%spaces%"  
      setlocal EnableDelayedExpansion
      echo !folder:~,40! %%n Dateien
      endlocal
    )
  )
)
Yan2021
Yan2021 12.01.2023 aktualisiert um 10:45:46 Uhr
Goto Top
Danke Euch für die Hilfe...

Ich habe den Code von @rubberman eben mal ausprobiert, da er für eine Batch gedacht ist (ist mir halt lieber...) face-wink

Problem hierbei ist nur, dass offenbar nur 2 Verzeichnisebenen nach unten geschaut wird (und es werden auch nur 2 Ebenen in der Textdatei aufgeführt). Ich füge hier mal einen Screenshot ein, wo man sieht, wie sich das auswirkt:

nur 2 ebenen

Wie man sieht, ist die letzte Ebene das Verzeichnis "Knstlersozial", welches eigentlich "Künstlersozialkasse" heißt. Aber es gibt noch mehrere Ebenen darunter. Warum der Verzeichnisname abgekürzt wird und auch Umlaute nicht ausgegeben werden, weiss ich nicht... wäre aber vielleicht ne gute Idee, das noch entsprechend anzupassen (wenn möglich).

Weiterhin werden auch alle Verzeichnisse angegeben, die 0 (Null) Dateien enthalten (siehe Screenshot).
Übersichtlicher wäre es, wenn nur die Verzeichnisse in die Textdatei geschrieben würden, die mindestens 1 Datei enthalten. Und vielleicht ganz unten auch eine Addition aller Dateien (Anzahl).

Was müßte ich ändern?

Grüße von
Yan face-wink
rubberman
rubberman 12.01.2023 um 11:50:48 Uhr
Goto Top
Warum der Verzeichnisname abgekürzt wird
Verstehst du deinen eigenen Code nicht? face-big-smile 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
Yan2021
Yan2021 12.01.2023 aktualisiert um 14:23:11 Uhr
Goto Top
Danke Dir nochmal @rubberman.

Ich hatte den größten Teil meines Codes von einer Webseite kopiert. Daher war mir das mit den 40 Zeilen nicht klar. Ich bin nämlich überhaupt kein Spezialist für Batch-Code (wie Du ja siehst...) face-smile

Wie genau muss die Codezeile (siehe unten) mit den Zeichen denn aussehen?

echo !folder:~,40! %%n Dateien

Ich hatte es so gelöst (siehe unten), aber dann erscheinen natürlich super lange Verzeichnisse.

      echo !folder:~! %%n Dateien

Vielleicht könnte man ja sogar einen Zeilenumbruch integrieren? Das würde dieses Problem lösen.

Das mit den Umlauten habe ich jetzt gelöst.

Kannst Du mir noch schreiben, wo genau ich welche "IF Bedingung" einsetzen muss, damit nur die Verzeichnisse angezeigt werden, die mindestens 1 Datei enthalten und was genau dort hin muss?
Ebenso in Bezug auf die Addition am Schluss mittels SET /A.

Hier mal mein jetziger Code:

@echo off &setlocal

chcp 1252
color 1F

REM "mode con lines=40 cols=100" = Groesse des Fensters: 40 Linien hoch und 100 Spalten breit  
mode con cols=130 

echo.
echo  ==== es wird die Anzahl der zu loeschenden Dateien in jedem Verzeichnis gezaehlt ====
echo.
echo  ==== Zum Beginn bitte Taste druecken! ====
pause>nul
echo. 
echo.
echo  === SUCHE LAEUFT ====
echo.

set "root=S:\DELETE\ARCHIV\FIBU"  
set "spaces=                                        "  
>"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 "folder=%%d%spaces%"  
      setlocal EnableDelayedExpansion
      echo !folder:~! %%n Dateien
      endlocal
    )
  )
)

echo  ==== Zum Beenden bitte Taste druecken! ====
chcp 850
pause>nul

Danke...

Grüße von
Yan face-wink
rubberman
Lösung rubberman 12.01.2023 um 17:44:02 Uhr
Goto Top
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
Yan2021
Yan2021 13.01.2023 um 08:49:59 Uhr
Goto Top
Danke Dir, Steffen für die weitere Hilfe.
Hat super gut funktioniert und nun habe ich den Code auch etwas besser verstanden, da ich es anhand der Code-Entwicklung hier im Thread besser nachvollziehen konnte.

Werde mir den Link von Dir aber auf jeden Fall auch mal anschauen face-wink

Grüße von
Yan face-wink
Yan2021
Yan2021 13.01.2023 aktualisiert um 10:16:31 Uhr
Goto Top
So... habe jetzt mal die komplette Seite inkl. aller Kommentare durchgelesen.
Puuuh, viel Lesestoff, den ich nicht verstehe face-wink Werde mich aber sicher mal damit beschäftigen und eine gute Webseite suchen, wo man PS Schritt für Schritt lernen kann.

Was mir jedoch ins Auge sprang und was mich (auch wenn es Batch ist) wirklich interessieren würde, ist die Sache mit den Umlauten.

Da wird angegeben:

"chcp 65001", wobei man dann die Datei als UTF-8 abspeichern soll. Das habe ich in meinem "Notepad++" Editor so gemacht und jetzt funktioniert es. Vorher hatte ich es mit "chcp 1252" versucht, was nicht funktionierte.

Aber...
Manchmal sieht man auch solche Einträge:

">nul chcp 65001" oder
"chcp 65001>nul"

Wo ist da der Unterschied? Denn diese Angabe wird doch eh nicht sichtbar ausgegeben... Da kann man den Zusatz ">nul" doch auch weglassen - oder?

Und... ich hatte es mal so gelesen, dass man dann am Ende der Batch-Datei das Ganze auch wieder auflösen soll mit
"chcp 850"

Das hat aber meine Datei auch wieder verändert, wenn ich sie erneut editiert habe mit Notepad++, denn danach waren die Umlaute wieder nur Hyroglyphen.

Soll man also das "chcp 850" am Ende nicht mehr setzen?

Grüße von
Yan face-wink
rubberman
rubberman 13.01.2023 aktualisiert um 20:27:12 Uhr
Goto Top
Zum Chaos mit Zeichencodierungen unter Windows kann ich ein komplettes Essay schreiben, verkneife ich mir aber in deinem Thread face-big-smile

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"  
... 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.


echo 1 >"test.txt"  
... tut fast das was es soll. Das Leerzeichen hinter der 1 landet aber mit in der Datei.


>"test.txt" echo 1  
... macht dann endlich alles richtig.

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"  
... besser ...
 >"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.
Yan2021
Yan2021 16.01.2023 um 08:20:23 Uhr
Goto Top
Hallo Steffen,

danke für die super detaillierte Erläuterung.
Habe alles verstanden und das ursprüngliche Script läuft ja jetzt auch perfekt.

Vielen Dank für Deine Mühe.

Grüße von
Yan face-wink