berner
Goto Top

CMD: Dir AD gibt unterschiedliche Anzahl gefundener Verzeichnisse aus

Hallo Fachleute

Warum gibt mir in einer Batch-Datei
dir /A:D /S C:\Users\xyz\test 
die richtige Anzahl der Verzeichnisse <Test> an, also 4 Stück

und
for /F %%i in ('dir /A:D /S C:\Users\xyz\test') do set /A anzahl_gefunden_Pfad_1=anzahl_gefunden_Pfad_1+1  
weist in der Variable anzahl_gefunden_Pfad_1 deren 17 aus, wobei da auch <Testtest>, <Testtesttest>, <Test1>, <Test1test1> etc. mitgezählt wird

Dies unabhängig davon, ob ich dir /A:D/ /S oder dir /AD /S schreibe und
unabhängig ob C:\Users\xyz\test in "" steht oder nicht?

Versuche nach dem Verzeichnisnahmen Sonderzeichen wie !,#,$ anzufügen haben nichts genützt.

Ich suche eine Lösung ohne Powershell, also am Liebsten klassisch mit DOS-Befehlen

Content-Key: 638931

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

Ausgedruckt am: 28.03.2024 um 14:03 Uhr

Mitglied: Friemler
Lösung Friemler 09.01.2021 um 12:40:49 Uhr
Goto Top
Hallo @Berner,

füge dem DIR-Befehl noch die Option /B hinzu, damit die Header- und Footer-Ausgaben des DIR-Befehls bei der Ausgabe unterdrückt werden. Bei Deiner derzeitigen Konstruktion der FOR-Schleife zählst Du die nämlich mit.

Außerdem könntest Du für Debug-Zwecke den Body der FOR-Schleife durch eine simple Ausgabe ersetzen, dann wäre Dir der Fehler auch selbst aufgefallen.

Grüße
Friemler
Mitglied: rubberman
Lösung rubberman 09.01.2021 aktualisiert um 12:53:01 Uhr
Goto Top
Drei Dinge vorab:
1) Ohne Option /B besteht die Ausgabe von DIR nicht nur aus den Pfaden. Deine FOR /F Schleife verarbeitet alle Zeilen die nicht leer sind, unabhängig davon ob sie einen Pfad enthalten oder irgendetwas anderes.
2) DIR sucht im Verzeichnis von C:\users\xyz\test. Es ist kein Wildcard Zeichen angegeben was DIR dazu bringen würde das letzte Element als Suchpattern zu werten.
3) Mit der Angabe eines Wildcard Zeichens wird ein Patternmatching betrieben. Um tatsächlich nur Verzeichnisse aufzulisten die auf \test enden (und nicht auf \testfoobar o.ä.) musst du die Ausgabe an FINDSTR weitergeben und gezielt filtern.
Etwa so:
dir /ad /s /b "C:\users\xyz\test*"|findstr /eic:"\\test"  
Und wo du schon dabei bist, kannst du das Zählen auch FIND überlassen.
dir /ad /s /b "C:\users\xyz\test*"|findstr /eic:"\\test"|find /c /v ""  
In eine FOR /F Schleife verpackt, müssen die Pipes maskiert werden
for /f %%i in ('dir /ad /s /b "C:\users\xyz\Test*"^|findstr /eic:"\\Test"^|find /c /v ""') do echo %%i  
Steffen
Mitglied: Berner
Berner 09.01.2021 um 15:50:50 Uhr
Goto Top
Hallo Friemler
Vielen Dank für Deinen Lösungsvorschlag. Tatsächlich gibt es mit der Option /B in der for Schleife auch nur noch 4 Treffer. Wünsche Dir ein erholsames Wochenende.
Mitglied: Berner
Berner 09.01.2021 um 15:53:51 Uhr
Goto Top
Hallo rubbermann. Vielen Dank für Deine Erklärungen und den drei Vorschlägen. Alle drei weisen die richtige Anzahl 4 aus. Wünsche auch Dir ein erholsames Wochenende