amel27, примерно так и поступил, только в Вашем примере непонятен смысл "
delims=0" (подозреваю, что обход ошибки автоматического преобразования из восьмеричной системы), ну да не столь важно, т.к. подумывал об использовании шестнадцатиричной системы для хранения и разбиения строки значения на части...
Цитата amel27:
имхо "универсальные" варианты противоречат духу скриптов... »
|
согласен, но в большинстве случаев "ухищрения" вместо использования универсальной функции могут почти не дать оптимизации, а время на отладку потрачено будет значительное...
зы: впервые вопрос ограничения 32 бит возник в батнике, лепящем HTML-ки для выкладывания фоток и прочего (с уже готовыми превьюшками), там сделал процедурку для пересчета размера в "более наглядный" вид:
читать дальше »
Код:

@Echo off
SetLocal EnableExtensions
@rem b2-20100525
set Mask=*.*
set PreView=Thumbnails
set StartUp=.
@rem Simple List - файл странички с простым списком файлов:
set SL=index.htm
@rem Advanced List - файл странички с превьюшками:
set AL=index.html
if not "%1"=="" if exist %1 set StartUp=%1
pushd %StartUp%
set Pth=%CD%
set Root=%CD%
set CurDir=.\
set DirName=.
set ExistDir=0
set SubTotal=0
set Total=0
set PVstat=0
set Deep=0
:DirLen
set /a Deep+=1
for /f "tokens=1,* delims=\" %%D in ("%Pth%") do set Pth=%%E
if not "%Pth%"=="" goto DirLen
@rem Заголовки странички
echo ^<HTML^>^<meta http-equiv="Content-Type" content="text/html;charset=cp866"^>^<BODY^>^<P align=right^>^<a href="%AL%"^>^<B^>Включить "иконки"^</B^>^</a^>^</p^> >%SL%
echo ^<HTML^>^<meta http-equiv="Content-Type" content="text/html;charset=cp866"^>^<style^>.F{text-align:center;float:left;border:4px solid #44F;margin:4px;}.N{clear:both;}A{text-decoration:none;}^</style^>^<BODY^>^<P align=right^>^<a href="%SL%"^>^<B^>Выключить "иконки"^</B^>^</a^>^</p^>>%AL%
for /f "tokens=* delims=" %%D in ('dir /a-d /s /on /b "%Mask%" 2^>nul ^| findstr /I /V /C:"\\%PreView%\\"') do call :ParseDir "%%D"
call :ShowSubTotal
rem Заключение (итого, подпись, закрывающие теги)
call :FormatSize Total
echo ^<HR^>^<B^>ИТОГО: %Total%^</B^>^<p align=right^>^<sub align=right^>Эта страничка сгенерирована автоматически скриптом. ^<I^>Nm^</I^>^</sub^>^</p^>^</BODY^>^</HTML^>>>%SL%
echo ^<HR^>^<B^>ИТОГО: %Total%^</B^>^<p align=right^>^<sub align=right^>Эта страничка сгенерирована автоматически скриптом. ^<I^>Nm^</I^>^</sub^>^</p^>^</BODY^>^</HTML^>>>%AL%
popd
goto END
:ParseDir
rem Очередной каталог/раздел?
if "%~dp1"=="%CurDir%" GoTo ParseDir1
if not "%CurDir%"==".\" (
call :ShowSubTotal
set SubTotal=0
)
set CurDir=%~dp1
for /f "tokens=%Deep%,* delims=\" %%N in ("%~dp1") do set DirName=%%O.
if "%DirName:~-2%"=="\." set DirName=%DirName:~0,-2%
set DirName=%DirName:\=/%
set ExistDir=0
if exist %CurDir%%PreView% set ExistDir=1
set PD=%PreView%
if not "%DirName%"=="." (
set PD=%DirName%/%PD%
echo ^<H3 align=center^>[%DirName%]^</H3^>>>%SL%
echo ^<H3 align=center^>[%DirName%]^</H3^>>>%AL%
)
:ParseDir1
rem ========== Отдельный файл ===========
set FN=%~nx1
if "%FN%"=="%SL%" exit /b
if "%FN%"=="%AL%" exit /b
if "%DirName%"=="." (set "FFN=%FN%") else set "FFN=%DirName%/%FN%"
set FS=%~z1
set /a SubTotal+=%FS%
call :FormatSize FS
set PVstat=0
rem Простой список
echo ^<a href="%FFN%"^>%FN%, %FS%^</a^>^<BR^>>>%SL%
rem Список с превью
echo ^<DIV class="F"^>^<a href="%FFN%"^>>>%AL%
if %ExistDir%==1 for /f "tokens=* delims=" %%F in ('dir /b /on /a-d "%CurDir%%PreView%\%~n1*.*" 2^>nul') do (
set PVstat=1
echo ^<img hspace="4" vspace="4" border="0" src="%PD%/%%~nxF"^>>>%AL%
)
if %PVstat%==0 echo ^<I^>* без иконки *^</I^>>>%AL%
echo ^<BR^>%FN%, %FS%^</a^>^</DIV^>>>%AL%
exit /b 0
rem Пересчет размера файла(ов) в краткий вид
:FormatSize
call set "NewSize=%%%1%%"
set N=0
:List1
set /a N+=1
if /i %NewSize% LSS 10000 goto List2
set /a "NewSize=(NewSize+240)>>10"
goto List1
:List2
for /f "tokens=%N%" %%E in ("B KB MB GB TB") do set %1=%NewSize%%%E
exit /b 0
rem Отображение конца блока
:ShowSubTotal
set /a Total+=%SubTotal%
call :FormatSize SubTotal
if "%DirName%"=="." (set DirName=разделу) else (set DirName=[%DirName%])
echo ^<HR^>^<B^>Всего по %DirName%: %SubTotal%^</B^>>>%SL%
echo ^<DIV class="N"^>^ ^</DIV^>^<HR^>^<B^>Всего по %DirName%: %SubTotal%^</B^>>>%AL%
exit /b 0
:END
"Краткое руководство" (составлял для друзей, по чьей просьбе и создавалось):
читать дальше »
Пакетный файл для создания простого HTML-списка
графических изображений и прочих файлов.
(например для публикации в сети иНет)
Файл расположить в любом каталоге,
желательно описанным в переменной %PATH%
(см. Панель Управления / Система / Дополнительно / Переменные среды / Path)
Запуск производить из подготовленного
каталога с файлами для побликации.
Другой вариант - указать путь к каталогу
в качестве параметра, например так:
открыть 2 окна "Проводника Windows",
в одном окне должен быть файл "List2.bat",
(можно вывести ярлык на файл на рабочий стол)
а в другом - название подготовленного каталога,
после чего перетащить мышкой катлог на бат-файл.
Также можно подготавливать каталог в одном
и том же месте, а путь к нему прописать в бат-файле
в переменной "StartUp".
Подготовка каталога:
структура может быть любой, но рекомендуется
в каждой подпапке создавать каталог "Thumbnails"
(см. переменную "PreView" бат-файла), куда помещать
графические файлы (jpg/gif/png) для предварительного
просмотра. Эти файлы должны иметь начало имени файла,
совпадающее с именем (но с расширением графического файла)
публикуемого файла, к которому можно добавить некие
индексные символы, например исходный файл "Video16.rar",
файл преварительного просмотра (отображается в html-списке)
"Thumbnails\Video16.jpg" и/или "Thumbnails\Video16previw.gif"