Batch Ordnergröße auslesen in MB?

1 Antwort

for /d %%i in ("%pfad%*.*") do for /f "tokens=1-3" %%a in ('dir "%%i" /a /s /-c ^|findstr "Datei(en)"') do set "..?%%i=%%c"

WTF???? , ...aber mit ein paar Klammern und etwas Ordnung weiß man was da läuft...

Das set ..?%%i ... ist tückisch und kann schlimm in die Hose gehn , wenn es als Variable am falsche Platz erscheint oder/und im Ordnernamen = ,~,& enthalten sind. (selten, kommt aber vor)

Also nich machen, es gibt so schöne selbsterklärende Variablennamen und man sogar zum (Pseudo)Array indexieren und wie ich es zeige alle gesammelten Daten in eine Variable legen... Dazu später im Script...

Da Batch selbst nur bis 2147483647 rechne kann, muss man jemandem die Rechnererei überlassen, der das besser kann.

JavaScript ist dazu fähig und wir können mit Batch ein kleines Skript speichern und ihm die Rechenaufgabe in der Kommandozeile übergeben . Die Rechenregeln und Befehle sind JavaScript!

Theoretisch kann der kleine Einzeiler alles berechnen wozu auch JScript fähig ist inclusive Wurzeln, Logarithmen , Pi etc. Zudem ist er auch noch schneller als Powershell oder C#. (weniger overhead)

zur Sache:

  • die Zeilen 4 und 6 initialisieren den Rechner...
  • der Aufruf erfolgt mit %m_calc% Rechenaufgabe (zB. %m_calc% (4+7)/8 )

let's dance with the beast... (nicht erschrecken, effektiv sind es nur 16 Zeilen, der Rest dient der Erklärung)

demo.cmd

@echo off
chcp 65001 >nul
  rem JavaScript Hilfsprogramm schreiben (mein  MiniTaschenrechner für  alles  was Batch nicht kann)
if not exist "%temp%\calc.js"  echo var Formel='';for (var i = 0; i ^< WScript.Arguments.Length;i++){Formel=Formel+WScript.Arguments(i)};WScript.Echo(eval(Formel))   >"%temp%\calc.js"
  rem Macro für  den Aufruf  des Javascript definieren
set m_calc= cscript /nologo "%temp%\calc.js"


set GrosseZahl=825666557977
  rem  mach MB draus.. (geht natürlich  nicht 32BitGrenze von Batch)
set /a result=GrosseZahl/1048576
echo ist grantiert  nicht: %result%
  rem  jetzt  mein Kleiner "Taschenrechner" im Einsatz...
  rem  hier  auf 2 Stellen nach dem Komma richtig gerundet (.toFixed()2)
for /f "tokens=*" %%a in ('"%m_calc% (%GrosseZahl%/1048576).toFixed(2)"') do (set "result=%%a")
echo ist aber: %result%


  rem Hier zu scannender OrdnerPfad (mit wenn gesetzt, mit \ am Ende)
set "BasePath="
  rem jetzt zu Deiner "spielerei"
  rem Ordnernamen  als  Variablenbezeichner? ne fürchterlich blöde Idee (wenn ein batchgiftiges Zeichen enthalten ist fliegt dir der Schei+ um die Ohren) 
  rem darum das (find /n /v "" numeriert  Zeilen)
for /f "tokens=1* delims=[]" %%a in ('dir /b /ad "%BasePath%*.*"^|find /n /v ""') do (
      rem %%a enthält die Zeilennummer , %%b den OrdnerNamen
      rem Mitzählen...
    set FolderCount=%%a
    for /f "tokens=1-3" %%d in ('dir /a /s /-c "%%b"^|find "Datei(en)"') do (
          rem %%d enthält Anzahl der Dateien %%f die Größen aller  durchsuchten Ordner Speicher  aber  nur  den jeweils letzten Wert (größe  des Hauptordners)
          rem nimm niemals  Fragezeichen in Variablennamen  das kann auch Ärger  geben!(..?Ordnername= is Kacke)
          rem gleich  alles  was wir haben wollen  als Datensatz durch ; getrennt in eien Variable  speichern
          rem  __FolderData.Nummer=Größe in Byte;Platzhalter für Größe  in MB;Anzahl Dateien;Ordnername  (muss  an letzter Stelle  stehen, weil der  Leerzeichen oder  andere Trennzeichen enthäten könnte!)
        set  "__FolderData.%%a=%%f;PlaceholderMB;%%d;%%b"
          rem   Nicht  hier Drinn die MB Berechen  Hier  laufen auch unbemerkt die Größene sehr vieler Unterordner  durch die würden auch berechnet (zum gleich  wieder verwerfen...)
    )
)
  rem  zur Demo erzeugte variablen  mal anzeigen
set  __FolderData.
echo:

  rem jetzt  berechnen  wir für jede der Variablen  die MB.
  rem  hier nehmen  wir  unseren Datensatz wieder  auseinander an .;= zelegen
  rem das Token 4 (Platzhalter brauchen  wir  nicht)
for /f "tokens=2,3,5,6 delims=.=;" %%a in ('set __FolderData.') do (
      rem %%a=Variablennummer , %%b ByteGröße ,%%c =Anzahl Dateien %%d Ordnername
      rem  jetzt lassen  wir   das "Taschenrechenerchen"  arbeiten (kein Nachkommastellen .toFixed(0))
      rem  1024*1024=1048576
    for /f "tokens=*" %%m in ('"%m_calc% (%%b/1048576).toFixed(0)"') do (
          rem %%m Größe in MB
          rem  wie oben  als Datensatz speichern nur mit %%m dort  wo Oben unser Platzhalter  war
        set  "__FolderData.%%a=%%b;%%m;%%c;%%d"
    )
)
  rem  zur Demo erzeugte variablen  mal anzeigen
set  __FolderData.
echo:

  rem  jetzt  erfährst Du weshalb  ich die  Ordner Mitgezählt  habe...
  rem  der Reihe nach die Variablen auswerden
for /l %%a in (1,1,%FolderCount%) do (
      rem  nur  noch  alles  nach dem = am ; getrennt
    for /f "tokens=2-6 delims==;" %%b in ('set __FolderData.%%a') do (
          rem  wenn man schon beim speichern eines Datensatzes Ordnung hält, ist das Leben so einfach...
          rem %%a=Variablennummer , %%b=ByteGröße, %%=MByteGröße , %%d =Anzahl Dateien %%e Ordnername
          rem  jetz kannst du für jeden Ordner machen was du möchtest
        echo Der Ordner: "%%e"  enthält %%d Dateien
        echo Die  Gesamtgöße  ist %%b Bytes
        echo Das  sind %%c MB.
        echo:
        
    )
)
  rem  so ungefähr agiert man mit der Sache richtig... keine einzelnen Variablen für jeden schnickschnack immer  als  beisammen
pause


   rem hier  nach   etwas  andere Rechnerei   ohne fixPoint
%m_calc% (5.666+222)/77

set "Radius=22"
echo der Radius   eines Kreises sei:22
  rem  Ergebniss eienr Variable zuweisen 
for /f "tokens=1* delims=," %%a in ('%m_calc% 2 * Math.PI * %radius%') do (set "result=%%a.%%b")
echo Der Umfang ist: %result%
pause
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren