В Linux создать файл нужного размера не просто, а чрезвычайно просто. Есть утилита dd
и устройство /dev/zero
, которое отгрузит вам нужное количество символов с кодом 0
.
Например, создадим файл размером 20 Мб:dd if=/dev/zero of=file.zero bs=20M count=1
В винде (7 и выше) появилась утилита fsutil
, способная сделать аналогичную операцию:fsutil file createnew <filepath> <size>
где:<filepath>
- путь к файлу<size>
- размер файла в байтах
Правда, у этой утилиты есть 2 неудобных момента:
1. Она хочет права администратора, и с этим ничего не поделать штатными средствами, но можно, например поделать моей утилитой wsudo (копия)
2. Надо указывать размер файла в байтах, что не очень удобно. А вот с этим вполне можно бороться, написав батник-обертку, который будет обрабатывать еще один параметр - модификатор единиц измерения (килобайты или мегабайты), вычислять нужное значение в байтах и вызывать fsutil
.
1. Проверяем параметры CMD-файла:@echo off
if "%~1" EQU "" (
echo No arguments. Use "%~n0%~x0 <filename> <size> [K|M]"
exit /b 1
)
символ ~
удаляет кавычки из переменной %1
(первый аргумент командной строки CMD/BAT файла), if
сравнивает значение переменной в кавычках с пустыми кавычками. Если первого аргумента нет, выводится соответствующее сообщение и скрипт завершает работу с кодом возврата 1 (exit /b 1
)
2. Выводим справку по использованию CMD-файла:if "%~1" EQU "/?" (
echo Use "%~n0%~x0 <filename> <size> [K|M]"
exit /b 1
)
В переменной %0
хранится путь к самому CMD-файлу, конструкция %~n0
обрезает полный путь до имени файла (без расширения), а %~x0
- оставляет одно расширение (с начальной точкой). Конструкции %~n<номер>
и %~x<номер>
можно использовать только с аргументами командной строки.
Запуск CMD-файла без параметров:zerofile.cmd
No arguments. Use "zerofile.cmd <filename> <size> [K|M]"
и с параметром вывода справки:zerofile.cmd /?
Use "zerofile.cmd <filename> <size> [K|M]"
3. Теперь проверим, указан ли в имени файла путь к нему, если не указан - добавим к имени файла текущий каталог:if "%~1" EQU "%~n1%~x1" (
set FILENAME=%CD%\%~1
) else (
set FILENAME=%~1
)
Если имя файла (первый параметр) равно этому же имени и расширению, значит, путь не указан, в качестве пути добавляем текущий каталог, и записываем его в переменную FILENAME
.
4. Установим удобные имена переменных для остальных параметров - размера файла и единицы измерения:set FILESIZE=%~2
set ED=%~3
5. Теперь надо проверить, является ли размер файла целым положительным числом.
Штатных проверок в языке CMD/BAT файлов не предусмотрено, но можно пойти на хитрость. Известно, что команда set
способна делать арифметические действия над числами и переменными (надо установить ключ /a
и написать выражение в кавычках). Если в переменной встретится не число, то set
автоматически будет считать значение переменной равным 0
. Соответственно, в результате получится значение с учетом этого. Значит достаточно сделать с переменной какое-то действие, которое не приведет к изменению значения (например, отнять и прибавить единицу), а потом проверить, получился ли положительный результат.set /a "RES=FILESIZE+1-1"
if %RES% LEQ 0 (
echo Can't create file with size %RES%
exit /b 2
)
6. Проверяем, какая единица измерения установлена в 3 параметре CMD-файла. Если в качестве параметра установлена K(k)
- килобайты, M(m)
- мегабайты. Что-то еще или ничего - размер файла задается в байтах.if "%ED%" EQU "K" goto :kb
if "%ED%" EQU "M" goto :mb
if "%ED%" EQU "k" goto :kb
if "%ED%" EQU "m" goto :mb
goto :create
7. Вычисляем размер файла в байтах::kb
set /a "RES=FILESIZE*1024"
set ST=%FILESIZE% Kb
goto :create
:mb
set /a "RES=FILESIZE*1024*1024"
set ST=%FILESIZE% Mb
8. Выводим summary и создаем файл нужного размера::create
echo Creating file: %FILENAME%
if "%ST%" EQU "" (
echo Size: %RES% bytes
) else (
echo Size: %ST% [%RES% bytes]
)
wsudo fsutil file createnew "%FILENAME%" %RES%
CMD-файл целиком (на GitHub)
CMD-файл целиком (на PasteBin)
wsudo
(с GitHub)1. Фишки батников (Копия в PDF)
2. CMD/BAT - Проверка наличия параметров (Копия в PDF)
Это репост с сайта http://tolik-punkoff.com
Оригинал: http://tolik-punkoff.com/2019/02/20/sozd