Тема: CMD/BAT: Вывод размера файла с приставками и разделителями тысяч
В соседнем для меня форуме один товарищ спросил о возможности реализовать следующий функционал:
[1] Вывод размера в килобайтах
[2] Использовать разделитель тысячфункционал требовалось реализовать исключительно на батниках.
Я решил размяться и попробовать свои силы. Кое-что получилось, но решение не полноценное, так как решение:
1. несколько громоздко
2. ограничено размером файлов не более 2 гигабайта
3. попытки улучшить, чтобы вычислять размеры любых файлов, скорее всего приведет к существенному усложнению скрипта
Публикую здесь скорее как курьез.
Вот сам скрипт. Он вычисляет размер cmd.exe и выводит его в байтах, кибибайтах и килобайтах.
@echo off
setlocal
set "DIGIT_GROUPING=,"
call :fsize "%COMSPEC%"
call :fsize "%COMSPEC%" KiB
call :fsize "%COMSPEC%" KB
endlocal
goto :EOF
:: SYNOPSIS
::
:: call :fsize [/v VARNAME] FILENAME [UNIT]
::
:: DESCRIPTION
::
:: Estimate the file size and scale it by UNIT.
:: If the option /v VARNAME is specified the result will be stored to
:: the variable VARNAME instead of printing.
::
:: UNIT is an optional unit prefix to represent big numbers in the
:: human-friendly format.
:: Units are of power 1000: KB, MB, GB
:: Units are of power 1024: KiB, MiB, GiB
::
:: ENVIRONMENT
::
:: DIGIT_GROUPING a character to be used as a delimiter of thousands.
:fsize
setlocal
set "fs_var="
if /i "%~1" == "/v" (
set "fs_var=%~2"
shift /1
shift /1
)
set /a "fs_KiB=1024"
set /a "fs_MiB=fs_KiB * 1024"
set /a "fs_GiB=fs_MiB * 1024"
set /a "fs_KB=1000"
set /a "fs_MB=fs_KB * 1000"
set /a "fs_GB=fs_MB * 1000"
if not "%~2" == "" (
if not defined fs_%~2 (
echo:Unknown unit: "%~2">&2
exit /b 1
)
rem The whitespace after "=" is mandatory
set "fs_name= %~2"
set /a "fs_unit=fs_%~2"
)
set /a "fs_size=%~z1"
if defined fs_unit set /a "fs_size /= fs_unit"
if not defined DIGIT_GROUPING goto :fsize_2
if %fs_size% lss 1000 goto :fsize_2
set "fs_result="
set /a "fs_dividend=fs_size"
:fsize_1
set /a "fs_remainder=fs_dividend %% 1000"
set /a "fs_dividend=fs_dividend / 1000"
set "fs_remainder=000%fs_remainder%"
set "fs_result=%fs_remainder:~-3%%DIGIT_GROUPING:~0,1%%fs_result%"
if %fs_dividend% gtr 1000 goto :fsize_1
if %fs_dividend% gtr 0 (
set "fs_result=%fs_dividend%%DIGIT_GROUPING:~0,1%%fs_result%"
)
set "fs_size=%fs_result:~0,-1%"
:fsize_2
if not defined fs_var (
echo:%fs_size%%fs_name%
goto :EOF
)
endlocal && set "%fs_var%=%fs_size%%fs_name%"
goto :EOF
Ниже в сообщениие #9 приведен улучшенный вариант.