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

0

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

Ich möchte die Dateigröße (in einer Variablen) hinzufügen, die entsprechend der Größe in KB / MB / GB angegeben werden soll, oder zumindest die Dateigröße in MB. 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
Syed Jahanzaib
quelle
Haben Sie in Erwägung gezogen, ein PowerShell-Skript anstelle eines Stapels zu verwenden? Andernfalls könnte dies helfen: stackoverflow.com/questions/1199645/…
Seth
Ok, das habe ich aus dem Internet bekommen. Dafür muss ich aber den Dateinamen eingeben. Wie kann ich den Dateinamen in diesen Code einfügen, um das Hinzufügen von Argumenten zum Zeitpunkt der Ausführung zu verhindern? @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% echo %~f1 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 :END
Syed Jahanzaib
Bearbeiten Sie Ihre erste Frage mit diesem Code. Dieses verstümmelte Ding ist in dieser Form unbrauchbar. Um eine Vorstellung davon zu haben, wie der Dateiname integriert werden kann, müssen Sie den eigentlichen Code und nicht nur ein Fragment, das Sie gefunden haben und das etwas anderes bewirkt, posten. Der beste Ansatz wäre, zwei Codeblöcke zu haben, einen mit Ihrem Code und einen mit dem Code, den Sie gefunden haben und den Sie integrieren möchten. Dies ist in PowerShell wahrscheinlich noch einfacher.
Seth
Vielen Dank für den Vorschlag. Ich habe die ursprüngliche Frage bearbeitet, um den Code hinzuzufügen. Ich möchte nur den statischen Dateinamen in diesen Code einfügen. wie FNAME = d: \ setup.exe, damit das Skript den FNAME verarbeitet,
Syed Jahanzaib

Antworten:

1

Alternativ können Sie die Ausgabe von verwenden robocopy Befehl zum Abrufen der erforderlichen Informationen

@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] 
    )

robocopy wird nur zum Auflisten verwendet ( /l ) die Informationen der zu kopierenden Datei, entfernen nicht benötigte Informationen aus der Ausgabe (der Rest der Schalter) und verwenden a for /f Befehl, um die Ausgabezeilen zu tokenisieren und nur die Dateigröße zu lesen

Im Fall von Ordnern kann dieselbe Idee verwendet werden, aber anstatt die Daten aus der Dateiliste zu lesen, können wir ein rekursives verwenden "Kopieren" und rufen Sie die Daten aus der Jobü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 Optionen wurden geändert, um nur die Jobübersicht abzurufen, und um nur die Zeile zu lesen, die die enthält Bytes Information.

bearbeitet 2016/10/26 - Die Robocopy-Schalter wurden geändert, um Berechtigungsproblemen entgegenzutreten Byte: Abruf nach : Zeilenfilter plus Skip-Klausel für den Fall, dass es ein Gebietsschema ohne das gibt Bytes: Zeichenfolge, Erkennung geänderter Speichereinheiten.

MC ND
quelle
Wie kann ich den gleichen Stapelbefehl verwenden, um Ordnergröße zu erhalten?
Syed Jahanzaib
@SyedJahanzaib, was meinst du mit "Ordnergröße" ? Dateien im Ordner? , Dateien unter dem Ordner und einem Unterordner ?, ...?
MC ND
Beispiel: Ich möchte die volle Größe des Ordners D: \ temp erhalten. Es könnte Unterverzeichnisse wie D: \ temp \ 1 d: \ temp \ 2 geben. Ich möchte also die volle Größe des Ordners D: \ temp haben.
Syed Jahanzaib
Das Ergebnis sollte ein einzelner Eintrag wie D: \ temp = size = 900M oder 5GB sein
Syed Jahanzaib
@SyedJahanzaib, Antwort aktualisiert.
MC ND
0

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

Um es "inline" zu machen, könnten 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.

Seth
quelle
-1

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

Ich habe es endlich geschafft, es durch Herunterladen der zu lösen ls für Windows und mit ls -lh filename Ich erhalte die benötigten Informationen zusammen mit anderen Informationen.

Beispiel:

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

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