
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 robocopy
Befehls 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]
)
robocopy
wird verwendet, um nur /l
die Informationen der zu kopierenden Datei aufzulisten ( ), alle nicht benötigten Informationen aus der Ausgabe (die restlichen Schalter) zu entfernen und einen for /f
Befehl 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 Bytes
Informationen 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 ls
für Windows heruntergeladen habe. Mithilfe dieser Version ls -lh filename
erhalte 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.