Dateigröße in KB/MB/GB in Windows-Batchdatei ermitteln

Dateigröße in KB/MB/GB in Windows-Batchdatei ermitteln

Ich habe eine Windows-Batchdatei (Windows 7/2008 R2), die täglich eine Sicherungskopie der Dateien erstellt. (Oracle-Dump-Exportdatei, z. B. dump-2016-10-17.DMP)

Ich möchte die DATEIGRÖSSE (in einer Variable) hinzufügen, die je nach Größe in KB/MB/GB angegeben werden sollte, oder zumindest sollte die Dateigröße in MB angegeben werden. CODE:

@echo off
SET DONE=0
SET Bytes=%~z1
SET KB=%Bytes:~0,-3%
SET MB=%Bytes:~0,-6%
SET GB=%Bytes:~0,-9%
SET TB=%Bytes:~0,-12%
rem echo %~f1

IF "%KB%" EQU "" SET DONE=B
IF %DONE% EQU B echo Size is... %Bytes% Bytes
IF %DONE% EQU B GOTO END

IF "%MB%" EQU "" SET DONE=K
IF %DONE% EQU K SET /a KB=(%BYTES%/1024)+1
IF %DONE% EQU K echo Size is... %KB% KB
IF %DONE% EQU K GOTO END

IF "%GB%" EQU "" SET DONE=M
IF %DONE% EQU M SET /a MB=(%BYTES%/1048576)+1
IF %DONE% EQU M echo Size is... %MB% MB
IF %DONE% EQU M GOTO END

IF "%TB%" EQU "" SET DONE=M
IF %DONE% EQU M SET /a MB=%KB%/1049
IF %DONE% EQU M echo Size is... %MB% MB (approx)
IF %DONE% EQU M GOTO END

SET DONE=G
IF %DONE% EQU G SET /a GB=%MB%/1074
IF %DONE% EQU G echo Size is... %GB% GB (approx)
IF %DONE% EQU G GOTO END
:END

Antwort1

Alternativ können Sie die Ausgabe des robocopyBefehls verwenden, um die erforderlichen Informationen abzurufen

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "file=d:\somewhere\file.ext"

    for %%z in ("%file%") do for /f "tokens=1,2" %%a in ('
        robocopy "%%~dpz." "%%~dpz." "%%~nxz" /l /nocopy /is /njh /njs /ndl /nc
    ') do if "%%~dz"=="%%~db" (
        echo "%%~z" : [%%a]
    ) else (
        echo "%%~z" : [%%a%%b] 
    )

robocopywird verwendet, um nur /ldie Informationen der zu kopierenden Datei aufzulisten ( ), alle nicht benötigten Informationen aus der Ausgabe (die restlichen Schalter) zu entfernen und einen for /fBefehl zu verwenden, um die Ausgabezeilen zu tokenisieren und nur die Dateigröße zu lesen

Im Falle von Ordnern kann dieselbe Idee verwendet werden, aber anstatt die Daten aus der Dateiliste zu lesen, können wir eine rekursive"Kopieren"und rufen Sie die Daten aus der Auftragsübersicht ab

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "folder=%~f1" & if not defined folder set "folder=%cd%"

    set "size=" & for %%z in ("%folder%") do for /f "skip=2 tokens=2,3 delims=: " %%a in ('
        robocopy "%%~fz\." "%%~fz\." /l /nocopy /s /is /njh /nfl /ndl /r:0 /w:0 /xjd /xjf /np
        ^| find ":"
    ') do if not defined size (
        (for /f "delims=0123456789." %%c in ("%%b") do (break)) && (
            set "size=%%a%%b"
        ) || (
            set "size=%%a"
        )
    )

    echo "%folder%" : [%size%]

Die Schalter wurden geändert, um nur die Jobzusammenfassung abzurufen, und gefiltert, um nur die Zeile zu lesen, die die BytesInformationen enthält.

bearbeitet26.10.2016 – Robocopy-Schalter geändert, um Berechtigungsprobleme zu beheben, Byte:Abruf auf :Zeilenfilter plus Skip-Klausel geändert, nur für den Fall, dass es ein Gebietsschema ohne die Bytes:Zeichenfolge gibt, Speichereinheitenerkennung geändert.

Antwort2

Eine Lösung wäre, den Batch aus Ihrem anderen Batch heraus aufzurufen und die Sicherungsdatei als Argument zu verwenden. Sie würden die Größe als Text erhalten und könnten diese in einer Variablen speichern.

Um dies „inline“ zu tun, können Sie es in einer Schleife wie dieser verwenden:

for %f in (%backupfile%) do set BYTES=%~zf

Aus Sicht der Lesbarkeit wäre die erste Lösung besser.

Antwort3

Vielen Dank für die Unterstützung und die Richtlinien.

Ich konnte das Problem schließlich lösen, indem ich die Version lsfür Windows heruntergeladen habe. Mithilfe dieser Version ls -lh filenameerhalte ich die benötigten Informationen sowie weitere Informationen.

Beispiel:

D:\zaib>D:\tools\ls.exe -lh setup.exe

-rwxr-x--a  1 Administrators   590M Oct  6  2015 setup.exe

Antwort4

Sie benötigen zwei Dinge.

filesize.bat 

@echo off
echo %~z1

Und dann versuchen Sie eigentlich, den hier gemeldeten Wert einzuschätzen

In diesem Beispiel werte ich %z% aus, um eine Datei nur zu kopieren, wenn sie größer als Null ist / nur eine Datei ungleich Null zu kopieren

for /f %i in ('filesize filesize.bat') do set z=%i
if %z% gtr 0 ( copy filesize.bat noodles.bat )

Wenn Sie beispielsweise %z% erreichen, können Sie eine Art Kürzungsberechnung oder ähnliches durchführen, aber die Ermittlung der Größe selbst ist etwas mühsam.

verwandte Informationen