Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   if в батнике по размеру файла больше 4 гигабайт (http://forum.oszone.net/showthread.php?t=274975)

R.i.m.s.k.y. 31-12-2013 11:41 2281119

if в батнике по размеру файла больше 4 гигабайт
 
есть батник
нужно папки и файлы больше 10 гиг (для простоты гиг/мег/килобайт считаю десятичным а не 1024) передавать на обработку в секцию BIG, файлы от 600метров до 10 гиг в SMALL, файлы меньше 600 метров - VERYSMALL
условие на 1000000 это для атрибутов папки, а то размер для папки возвращается ненулевой в зависимости от атрибутов
батник выводит имя файла, размер и секцию при выполнении (чтобы видно было в какой раздел он попал)

передаю батнику параметром файл размером 12 гиг, но батник выполняет секцию small - происходит переполнение переменной SIZEFILE>2^32 и отбрасываются последние знаки, хотя должен идти в секцию BIG

как выкрутиться?

Код:

@SET FILE=%2
@SET SIZEFILE=%~z2
@SET FOLDER=%3
@SET FILENAME=%1

@echo %FILE%
@rem @rd %FOLDER%
md %FILENAME%

IF %SIZEFILE% LEQ 1000000 (goto big)
IF %SIZEFILE% LEQ 600000001 (goto verysmall)
IF %SIZEFILE% LEQ 10000000001 (goto small)
goto big
               
               
:big
@echo %SIZEFILE% Folder or BIG
...
goto end

:small
@echo %SIZEFILE% small
...
goto end

:verysmall
@echo %SIZEFILE% verysmall
...
goto end

:end


kiripanda 31-12-2013 11:48 2281122

откусывай от размера 3 или 6 последних знаков

R.i.m.s.k.y. 31-12-2013 11:53 2281125

как?
любые действия с SIZEFILE в которой лежит размер файла больше 4 гиг дают ошибку
я бы все числа поделил на 1000, но SIZEFILE 12гигового файла не дается
Код:

Неверное число. Числа ограничены 32 битами точности.

R.i.m.s.k.y. 31-12-2013 12:10 2281128

ларчик просто открывался
Код:

set /a %SIZEFILE:~0,-3%
откусывает три последних символа, т.е. делит на 1000

может еще подскажете как можифицировать батник чтобы вычислять размер папок и обрабатывать их наравне с файлами по секциям big/small/verysmall

Код:

@SET FILE=%2
@SET SIZEFILE=%~z2
@SET SIZEFILEKb=%SIZEFILE:~0,-3%
@SET SIZE1=1000
@SET SIZE2=600001
@SET SIZE3=10000001
@SET FOLDER=%3
@SET FILENAME=%1

@echo %FILE%
@rem @rd %FOLDER%
md %FILENAME%

IF %SIZEFILEKb% LEQ %SIZE1% (goto big)
IF %SIZEFILEKb% LEQ %SIZE2% (goto verysmall)
IF %SIZEFILEKb% LEQ %SIZE3% (goto small)
goto big


kiripanda 31-12-2013 12:37 2281138

Код:

dir /a-d/-c/s
см. предпоследнюю строку вывода

R.i.m.s.k.y. 31-12-2013 13:02 2281145

kiripanda, и как из команды dir в переменную занести размер папки?

kiripanda 31-12-2013 13:24 2281153

Код:

for /f "tokens=1-3" %%x in ('dir /a-d/-c/s 2^>nul ^|findstr /c:"файлов"') do set size=%%z
echo %size% Bytes


R.i.m.s.k.y. 31-12-2013 13:35 2281162

kiripanda, спасибо
но мне нужно скрестить с батником выше, т.е. добавить еще условие на разделение папки/файла

kiripanda 31-12-2013 13:38 2281164

Win Rus? Батник в cp866?
для Eng нужно
Код:

findstr /c:"File(s)"
_____________________________________________

теперь как в предыдущем случае откусывай от %size% 3-6 знаков

R.i.m.s.k.y. 31-12-2013 13:44 2281171

Цитата:

Цитата kiripanda
Win Rus? Батник в cp866? »

да
да
______
эта команда для файлов тоже сработает?

kiripanda 31-12-2013 13:58 2281179

с
Код:

dir /a-d/-c/s %2
вроде работает. Но передавать нужно полный путь, а-то посчитает сумму размеров всех одноимённых файлов

R.i.m.s.k.y. 31-12-2013 14:01 2281180

R.i.m.s.k.y., эта команда сносит моцк батнику: вместе с ним начинает архивироваться не сам файл, а все что в подпапке t:\1

основной вызывающий батник
Код:

cmd /C www-.cmd 0091 "t:\1\папка с файлами" "t:\1\"
cmd /C www-.cmd 0092 "t:\1\большой файл 12 гигов.ext" "t:\1\"

www архивирует как надо но папки архивирует как BIG даже если там пара метров
Код:

@rem русский СР866
@rem echo off

@echo.
@CD /D %3

@SET FILE=%2
@SET SIZEFILE=%~z2
@SET SIZEFILEKb=%SIZEFILE:~0,-3%
@SET SIZE1=1000
@SET SIZE2=600001
@SET SIZE3=10000001
@SET FOLDER=%3
@SET FILENAME=%1

@echo %FILE%
@rem @rd %FOLDER%
@rd /S /Q %FILENAME% > nul
@md %FILENAME%

IF %SIZEFILEKb% LEQ %SIZE1% (goto big)
IF %SIZEFILEKb% LEQ %SIZE2% (goto verysmall)
IF %SIZEFILEKb% LEQ %SIZE3% (goto small)
goto big
               
@rem if %SIZEFILE% GEQ 10000000001 (goto big)
@rem if %SIZEFILE% GEQ 600000001 (goto small)
@rem if %SIZEFILE% GEQ 20000001 (goto verysmall)
@rem goto big

:big
@echo %SIZEFILEKb% KB BIG
@"C:\Program Files\WinRAR\WinRAR.exe" m -m1 -r -t -rv25%% -ep1 -v200m %FILENAME%\%FILENAME%.rar %FILE%
goto end

:small
@echo %SIZEFILEKb% KB small
@"C:\Program Files\WinRAR\WinRAR.exe" m -m1 -r -t -rv25%% -ep1 -v50m %FILENAME%\%FILENAME%.rar %FILE%
goto end

:verysmall
@echo %SIZEFILEKb% KB verysmall
@"C:\Program Files\WinRAR\WinRAR.exe" m -m1 -r -t -rv25%% -ep1 -v3m %FILENAME%\%FILENAME%.rar %FILE%
goto end

:end

www-.cmd учитывает размер папки но в архив начинает загонять все что лежит в t:\1
Код:

@rem русский СР866
@rem echo off
@echo.
@CD /D %3

for /f "tokens=1-3" %%x in ('dir /a-d/-c/s %2 2^>nul ^|findstr /c:"файлов"') do set size=%%z
@SET SIZEFILEKb=%size:~0,-3%

@SET SIZE1=1000
@SET SIZE2=600001
@SET SIZE3=10000001
@SET FOLDER=%3
@SET FILENAME=%1

@echo %FILE%
@rem @rd %FOLDER%
@rd /S /Q %FILENAME% > nul
@md %FILENAME%

IF %SIZEFILEKb% LEQ %SIZE1% (goto big)
IF %SIZEFILEKb% LEQ %SIZE2% (goto verysmall)
IF %SIZEFILEKb% LEQ %SIZE3% (goto small)
goto big
               
@rem if %SIZEFILE% GEQ 10000000001 (goto big)
@rem if %SIZEFILE% GEQ 600000001 (goto small)
@rem if %SIZEFILE% GEQ 20000001 (goto verysmall)
@rem goto big

:big
@echo %SIZEFILEKb% KB BIG
@"C:\Program Files\WinRAR\WinRAR.exe" m -m1 -r -t -rv25%% -ep1 -v200m %FILENAME%\%FILENAME%.rar %FILE%
goto end

:small
@echo %SIZEFILEKb% KB small
@"C:\Program Files\WinRAR\WinRAR.exe" m -m1 -r -t -rv25%% -ep1 -v50m %FILENAME%\%FILENAME%.rar %FILE%
goto end

:verysmall
@echo %SIZEFILEKb% KB verysmall
@"C:\Program Files\WinRAR\WinRAR.exe" m -m1 -r -t -rv25%% -ep1 -v3m - %FILENAME%\%FILENAME%.rar %FILE%
goto end

:end


Iska 31-12-2013 18:30 2281316

R.i.m.s.k.y., самый правильный путь — перейти к использованию WSH или PoSH.


Время: 15:32.

Время: 15:32.
© OSzone.net 2001-