kriegstreiber
Goto Top

Ordnergrösse in MB und GB anzeigen, Fileauswahl möglich

Hallo Community,

dies ist Frage und Antwort zugleich. Mein Ziel war es, in einem Ordner alle *.rar zu "scannen" und deren gesamte Dateigrösse als Variable zu speichern.
Schnell habe ich gemerkt das Batch mit solch grossen Zahlen Probleme hat und habe für die Rechnung ein kleine JS Script in den weiten des Internets gefunden.

Hier der "Antwort" Teil meiner Frage, wenn jemand mal ähnliches vorhaut, dieses kleine Script zeigt die Grösse aller *.rar Dateien im Ordner an, einmal in MB und einmal in GB , gerundet ab der zweiten Nachkommastelle:

:FOLDERCALC
rem Erstelle "Rechner" für die Umrechnung Bytes in ?  
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"  

set m_calc= cscript /nologo "%temp%\calc.js"  
rem Pfad zum scannenden Verzeichnis
set "BasePath=X:\_Backup\RAR_FILES"  
set /a FileSizeSUM_MB=0
set /a FileSizeSUM_GB=0

setlocal enableDelayedExpansion
rem Definiere Filetyp, ("%BasePath%\*.*") für alle.  
for %%i in ("%BasePath%\*.rar") do (  
	for /f "tokens=*" %%A in ('"%m_calc% ((%%~zi/1048576).toFixed(0))"') do (set /a "FileSizeSUM_MB=!FileSizeSUM_MB!+%%A")  
)
setlocal disableDelayedExpansion
rem Ausgabe in GB mit 2 Stellen nach dem Komma.
for /f "tokens=*" %%a in ('"%m_calc% (%FileSizeSUM_MB%/1024).toFixed(2)"') do (set "FileSizeSUM_GB=%%a")  

echo FILESIZE ALLER RAR DATEIEN IN MB=%FileSizeSUM_MB%
echo FILESIZE ALLER RAR DATEIEN IN GB=%FileSizeSUM_GB%
goto :eof

Nun der problematische Teil. Ich rufe diese Funktion via CALL :FOLDERCALC in einer einer if / else Kombination auf. Ein kleiner Auszug:

setlocal ENABLEDELAYEDEXPANSION
If exist "X:\_Backup\RAR_FILES" (  
	set /A "rarsize=0"  
	if exist "X:\_Backup\RAR_FILES\*.rar" for /F %%i in ('dir "%BackupDir%\%RelName%\*.rar" /B /A-d') do set /A rarfiles=rarfiles+1>nul  
	if exist "X:\_Backup\RAR_FILES\*.rar" CALL :FOLDERCALC  
	if "!rarfiles!" GTR "0" set "rarfiles_string=call :colortxt 0A "!rarfiles!""  
	if "!rarfiles!"=="0" set "rarfiles_string=call :colortxt 0C "NO RAR FILES FOUND"" & set "rarfiles_Found=FALSE"  
	call :colortxt 0E "Backup       : [" & call :colortxt 0A "FOUND" & call :colortxt 0E "]" & call :colortxt 0E " RAR Files: [" & !rarfiles_string! & call :colortxt 0E "]" & call :colortxt 0E ", Release Size: [" & call :colortxt 0A "%FileSizeSUM_GB% GB" & call :colortxt 0E "]" /n  
) else (
	call :colortxt 0E "Backup       : [" & call :colortxt 06 "NOT FOUND WILL BE SKIPPED" & call :colortxt 0E "]" /n  
	set "Backup_Found=FALSE"  
	goto :NOBACKUP
)

Das "call :colortxt" kann ignoriert werden, das färbt mir nur Wörter ein. In dem Segment:
& call :colortxt 0A "%FileSizeSUM_GB% GB"   
wird mir leider immer 0 GB angezeigt. Bei:
echo FILESIZE ALLER RAR DATEIEN IN MB=%FileSizeSUM_MB%
echo FILESIZE ALLER RAR DATEIEN IN GB=%FileSizeSUM_GB%
wird allerdings richtige Grösse angezeigt. Auch !FileSizeSUM_GB! führte nicht zum Erfolg, er übernimmt leider diese Variable aus dem CALL nicht.

Wo liegt hier mein Fehler?

Content-ID: 3708130226

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

Ausgedruckt am: 22.11.2024 um 09:11 Uhr

SeaStorm
SeaStorm 20.08.2022 aktualisiert um 18:29:45 Uhr
Goto Top
Das Problem ist das du noch immer Batch nutzt face-sad
In PS:
Function Format-FileSize() {
    Param ([int64]$size)
    If     ($size -gt 1TB) {[string]::Format("{0:0.00} TB", $size / 1TB)}  
    ElseIf ($size -gt 1GB) {[string]::Format("{0:0.00} GB", $size / 1GB)}  
    ElseIf ($size -gt 1MB) {[string]::Format("{0:0.00} MB", $size / 1MB)}  
    ElseIf ($size -gt 1KB) {[string]::Format("{0:0.00} kB", $size / 1KB)}  
    ElseIf ($size -gt 0)   {[string]::Format("{0:0.00} B", $size)}  
    Else                   {""}  
}

$folder = "c:\temp\"  
Get-ChildItem -Path $folder -Filter "*.rar" | Select-Object Name, @{Name="Size";Expression={Format-FileSize($_.Length)}}  

oder um rekursiv alles zu durchsuchen und zusammenzuzählen
Get-ChildItem -Path $folder -Recurse -File -Filter "*.rar" | measure Length -Sum | Select-Object @{Name="Size";Expression={Format-FileSize($_.Sum)}}  
Kriegstreiber
Kriegstreiber 20.08.2022 um 19:10:56 Uhr
Goto Top
Nett gemeint, aber ich baue das komplexe Script jetzt nicht in anderer Sprache um. face-smile
SeaStorm
SeaStorm 20.08.2022 um 21:00:11 Uhr
Goto Top
schade, weil mit PS ist das alles nicht mehr komplex denn man kann sich dieses unsägliche rumgemurkse sparen. Und man wäre dann so langsam mal im Jahr 2000 angekommen
em-pie
em-pie 20.08.2022 um 21:14:13 Uhr
Goto Top
Moin,

Du könntest aber in deiner Batch ein PS-Script integrieren.

Schau einfach mal hier nach:
https://stackoverflow.com/questions/14880236/windows-batch-to-convert-by ...
https://www.delftstack.com/de/howto/powershell/run-a-powershell-script-f ...

Du kannst könntest somit ein PS-Skript erstellen, als Parameter die den Integerwert deiner Datei übergeben, dynamisch berechnen und den neuen Wert als String zurück geben…

Gruß
em-pie
rubberman
Lösung rubberman 21.08.2022 um 12:53:06 Uhr
Goto Top
for /f "tokens=2-3 delims= " %%a in ('robocopy "X:\_Backup\RAR_FILES" " nul" *.rar /S /L /XJ /NFL /NDL /NJH /R:0 ^| find "Bytes"') do set "size=%%a" &set "dim=%%b"  
if "%size%"=="%dim%" set "dim="  
echo %size% %dim%
... mit %dim% undefiniert für Bytes, ansonsten k, m, g oder t je nachdem was die Größe sinnvoll darstellt.

Steffen