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:
Nun der problematische Teil. Ich rufe diese Funktion via CALL :FOLDERCALC in einer einer if / else Kombination auf. Ein kleiner Auszug:
Das "call :colortxt" kann ignoriert werden, das färbt mir nur Wörter ein. In dem Segment:
wird mir leider immer 0 GB angezeigt. Bei:
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?
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"
echo FILESIZE ALLER RAR DATEIEN IN MB=%FileSizeSUM_MB%
echo FILESIZE ALLER RAR DATEIEN IN GB=%FileSizeSUM_GB%
Wo liegt hier mein Fehler?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 3708130226
Url: https://administrator.de/contentid/3708130226
Ausgedruckt am: 22.11.2024 um 09:11 Uhr
5 Kommentare
Neuester Kommentar
Das Problem ist das du noch immer Batch nutzt
In PS:
oder um rekursiv alles zu durchsuchen und zusammenzuzählen
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)}}
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
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
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%
Steffen