Batch Ordnergröße auslesen in MB?
Ich habe mir ein ein bisschen was zusammen gebastelt um die Ordnergröße zu ermitteln, allerdings kann ich diese nur in Bytes ermitteln und da ich nachher mit den Bytes was in % umrechnen will kommt mir die 32-Bit Grenze in den Weg. Nun zu meiner Frage: Kann mir jemand den Code so umschreiben das er direkt MB ermittelt ohne was umzurechnen (wegen der 32-Bit Grenze).
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"
for /f "tokens=2,3 delims=?=" %%i in ('set..') do set /a bytes="%%j"
echo bytes:%bytes%
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