CMD Befehl auf Unterordner erweitern: for %%a in ("\\Pfad\bla\*.mp4") do set /a i+=1?
HI!
Ich will die Anzahl von .mp4 Dateien in einem Ordner samt Unterordner herausfinden. Ein Skript um es bei einen Ordner herauszufinden habe ich bereits:
@echo off
set i=0
for %%a in ("\Krulju\i\Dokumente\Movies, Series, Musicvideos*.mp4) do set /a i+=1
echo %i%
pause>NUL
exit
Herausgegeben wird nur eine Zahl und mehr will ich auch nicht. Sobald in der Variablen %i% auch nur ein Buchstabe steht, kann ich mit ihr nicht mehr rechnen und das muss ich später noch. Falls jemand eine Idee hätte wie ich also dieses Skript auch für Unterordner benutzen kann, wäre ich sehr dankbar.
Danke für jeden Tipp und für jede hilfreiche Antwort!
4 Antworten
Warum so umständlich?
dir *.mp4 >counter.txt
find /N "Datei(en)" counter.txt
fertig.
Dann halt dir /s und schon sind die Unterverzeichnisse mit dabei.
dir verzeichnis /s funktioniert schon seit über 20 Jahren.
Sorry, ich dachte du meintest meine vorgeschlagene Variante oben xd
So, ich nehme an das Ergebnis in der letzten Zeile ist die Summe der vorher aufgelisteten Dateien. Jetzt habe ich allerdings folgendes Problem:
Die Ausgabe sieht so aus:
3 Datei(en), 230.287 Bytes
Aber um eine reine Variable mit der ich rechnen kann zu erzeugen, muss alles nach der "3" weg. Auch eine Idee dafür?
Selbstverständlich.
dir *.mp4 /s > counter.txt
find /c /i "mp4" counter.txt
oder eben
dir *.mp4 /s | find /c /i "mp4"
Die Ausgabe im Counter ist wegen den fehlenden
| find "Datei(en)"
sehr unübersichtlich und listet auch Pfade ohne .mp4 Dateien auf. Außerdem steht in der Ausgabe der CMD nun
FIND: Parameterformat falsch
Hast du noch eine andere Lösung? :)
dir *.mp4 /s | find /c /i "mp4" gibt genau die Anzahl der mp4 Dateien in allen Unterverzeichnissen an und zwar nur die Zahl ohne jeglichen Text.
Letzte Frage: Wie kann ich jetzt aus dem Ergebnis eine Variable machen?
Den anderen Kram brauchst du nicht. Wie schon gesagt, einfach nur
dir *.mp4 /s | find /c /i "mp4"
und sonst nichts.
Wenn ich aber
echo %mp4%
dazu füge, erhalte ich die Ausgabe
ECHO ist ausgeschaltet (OFF).
Ich brauche diese Variable ja noch zum rechnen.
Was willst du mit echo %mp4%? Die genannte Befehlskette gibt das Ergebnis doch schon aus? Wozu nochmal ein echo?
Das echo war der Test ob die Variable existiert. Und sobald diese Variable existiert, kann ich mit ihr + rechnen. Heißt zum Beispiel:
100 MP4´s + 100 WMV´s = 100 Video Dateien
Variable setz/liest du mit set variable=x oder set variable
Hab´s gerade:
@echo off
dir "\\Krulju\i\Dokumente\Movies, Series, Musicvideos\*.mp4" /s | find /c /i "mp4" >"\\Krulju\i\Dokumente\Server\Dateien\counter.txt"
SET /p mp4=<"\\Krulju\i\Dokumente\Server\Dateien\counter.txt"
echo ---
echo %mp4%
pause>NUL
exit
Siehst du, gar nicht so schwer und viel einfacher als deine ursprüngliche Idee.
VIEL einfacher als bei jemand anderen mit den ich vorher gechattet habe. Wenn es nach ihm ginge hätte ich jetzt ein PowerShell Skript, 2 oder 3 .txt´s und eine lange CMD xxD
Respekt.
Kleiner Tipp:
statt
dir *.mp4 /s
nimm
dir *.mp4 /s/b
Dann zähle einfach die Zeilen der Ausgabe.
Das macht das Vorhaben vom Umfang her nicht kleiner, ist aber natürlich eine Alternative.
Ob
dir *.mp4 /s | find /c /i "mp4"
oder
dir *.mp4 /s/b|find /c "\"
kommt aufs Gleiche raus, wie schon gesagt. Es ist einfach nur eine Alternative.
Deine Variante würde ein Verzeichnis, das im Namen die Zeichenkette "mp4" enthält, mitzählen. Meine nicht.
Aber ich wollte nicht meckern. Ich find deine Lösung auch so gut.
Hast du vielleicht auch eine Idee wie man damit Ordner zählen kann? Das wäre meine Idee:
dir "\\Krulju\i\Dokumente\Movies, Series, Musicvideos\Serien\*(*)" | find /c /i "(" >"\\Krulju\i\Dokumente\Server\Dateien\serienordnercounter.txt"
Damit Serien besser von Kodi erkannt werden können schreibe ich das Jahr der Serie hinter den Namen:
Breaking Bad (2008)
Auf diese Art sind alle Ordner benannt, deshalb die Idee mit den "\*(*)". Das komische ist das die Ausgabe nicht richtig ist. Anzahl von Ordnern nachgezählt im Explorer: 5 . Anzahl von Ordnern in der Ausgabe der CMD: 7 . Die Attribute /s habe ich extra entfernt dass er keine Unterverzeichnisse durchsucht. Eine Idee wo der Fehler liegt? :)
Mit for/D kannst du statt Dateien Verzeichnisse durchlaufen:
set "p=\Krulju\i\Dokumente\Movies, Series, Musicvideos\"
for /D %%D in ("%p%*") do call :ForFiles "%%~D\" mp4
call :ForFiles "%p%" mp4
cls&echo %i%&pause&exit
:ForFiles
for %%F in ("%~1*.%~2") do set /a i+=1
exit /B
ist doch etwas länger geworden, da ich die ForFiles-Schleife ausgelagert hab, so kannst du sie auch für das übergeordnete Verzeichnis aufrufen.
~Tim
Hallo, Hir nochmal in einfach
@echo off
color a
cd "%userprofile%\desktop"
echo.
echo BITTE WARTEN...
dir /ON /B /S *.mp4 >"%Temp%\Mp4Suche.TEMP"
set /p a=<"%TEMP%\Mp4Suche.Temp"
cls
echo.
echo erstes Ergebnis: --^> "%a%"
ping /n 2 localhost>nul
echo ^|
echo weitere Ergebnise... \ /
ping /n 2 localhost>nul
echo.
type "%Temp%\mp4Suche.TEMP"
ping /n 2 localhost>nul
echo Fertig !
echo.
pause
echo.
echo Chach wird geloecht...
ping /n 2 localhost>nul
del /q "%TEMP%\Mp4Suche.TEMP" >nul
exit
das ist der such befel
dir /ON /B /S *.mp4 >"%Temp%\Mp4Suche.TEMP"
/on = nach namen sotiren
/b = ganzen müll weg lassen
/s = auch in unterordner suchen
hilfe findest du wen du
DIR /?
eingipst
ich hoffe ich konnte dir helfen...!
@echo off
setlocal disableDelayedExpansion
if "%~1"=="" (call :recurse ".") else call :recurse %1
exit /b
:recurse
setlocal
set i=0
for /d %%D in ("%~1\*") do call :recurse "%%~fD"
for /f %%A in ('dir /b /a-d "%~1\*.mp4" 2^>nul ^| find /v /c ""') do set /a i+=%%A
echo "%~f1" %i%
(
endlocal
set /a i+=%i%
)
echo %i%
exit /b
Sowas?
Dasselbe wie hier nur mit extra .txt file:
Das Problem hierbei ist, dass als Ausgabe keine reine Zahl raus kommt:
Außerdem besteht immer noch das Problem mit den Unterordnern die nicht erkannt werden.