Показать полную графическую версию : if в батнике по размеру файла больше 4 гигабайт
R.i.m.s.k.y.
31-12-2013, 11:41
есть батник
нужно папки и файлы больше 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
откусывай от размера 3 или 6 последних знаков
R.i.m.s.k.y.
31-12-2013, 11:53
как?
любые действия с SIZEFILE в которой лежит размер файла больше 4 гиг дают ошибку
я бы все числа поделил на 1000, но SIZEFILE 12гигового файла не дается
Неверное число. Числа ограничены 32 битами точности.
R.i.m.s.k.y.
31-12-2013, 12:10
ларчик просто открывался
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
dir /a-d/-c/s
см. предпоследнюю строку вывода
R.i.m.s.k.y.
31-12-2013, 13:02
kiripanda, и как из команды dir в переменную занести размер папки?
kiripanda
31-12-2013, 13:24
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
kiripanda, спасибо
но мне нужно скрестить с батником выше, т.е. добавить еще условие на разделение папки/файла
kiripanda
31-12-2013, 13:38
Win Rus? Батник в cp866?
для Eng нужно findstr /c:"File(s)"
_____________________________________________
теперь как в предыдущем случае откусывай от %size% 3-6 знаков
R.i.m.s.k.y.
31-12-2013, 13:44
Win Rus? Батник в cp866? »
да
да
______
эта команда для файлов тоже сработает?
kiripanda
31-12-2013, 13:58
с dir /a-d/-c/s %2
вроде работает. Но передавать нужно полный путь, а-то посчитает сумму размеров всех одноимённых файлов
R.i.m.s.k.y.
31-12-2013, 14:01
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
R.i.m.s.k.y., самый правильный путь — перейти к использованию WSH или PoSH.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.