У меня есть пакетный файл Windows (Windows 7/2008 R2), который выполняет ежедневное резервное копирование файла. (Файл экспорта дампов Oracle, например dump-2016-10-17.DMP)

Я хочу добавить размер ФАЙЛА (в переменной), который должен быть в КБ / МБ / ГБ в соответствии с размером, или, по крайней мере, он должен получить размер файла в МБ. КОД:

@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

3 ответа3

1

В качестве альтернативы вы можете использовать вывод команды robocopy для получения необходимой информации.

@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 будет использоваться только для перечисления (/l) информации о копируемом файле, удаления ненужной информации из выходных данных (остальных переключателей) и использования команды for /f для токенизации выходных строк и чтения только размер файла

В случае папок можно использовать ту же идею, но вместо чтения данных из списка файлов мы можем использовать рекурсивную "копию" и извлекать данные из резюме задания.

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

Переключатели были изменены для получения только сводной информации о задании и отфильтрованы так, чтобы считывать только строку, содержащую информацию Bytes .

изм 2016/10/26 - изменились ROBOCOPY выключателей сталкиваться с проблемами разрешений, изменился Byte: поиск : линии фильтр плюс пропустить пункт только в случае , если есть локаль без Bytes: строка, изменено обнаружение единицы хранения.

0

Одним из решений было бы вызвать пакет из другого пакета и указать в качестве аргумента резервный файл. Вы получите размер в виде текста и можете сохранить его в переменной.

Чтобы сделать это "встроенным", вы можете использовать его в цикле, например:

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

С точки зрения читабельности первое решение будет лучше.

-1

Спасибо за поддержку и рекомендации.

В конце концов мне удалось решить эту проблему, загрузив ls для окон, и используя ls -lh filename я также получаю необходимую мне информацию и другую информацию.

Пример:

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .