Как создать в Batch-файле массив и извлечь оттуда случайный элемент
Ещё один вопрос по батникам. В принципе, думал сделать всё, как в этой заметке, оказалось, есть нюансы, например, конструкция batch-файла вида
echo.!arr[%rndInt%]!
внутри оператора в круглых скобках не работает - просто не получается раскрыть одну переменную как часть названия другой. Поэтому подсказали, что нужно сделать отдельную процедуру proc
.
Хотя вне круглых скобок всё работает корректно, приведу крайне упрощённую версию извлечения случайной строки из массива в Batch-файле, когда этот псевдо-массив задан статически:
@echo off setlocal enabledelayedexpansion chcp 65001 >nul set "pseudo=Alpha Beta Gamma Delta Epsilon" set cnt=0 & for %%P in (!pseudo!) do ( set /a cnt+=1 set "pseudo[!cnt!]=%%P" ) set /a rndInt=%random% %% %cnt% +1 echo.!pseudo[%rndInt%]! pause >nul exit /b
Вот основной выстраданный листинг, задача формулировалась примерно так:
Создаём bat-файл, который, будучи запущен без аргументов командной строки, выбирает и выводит случайное слово (число) из файлаarray.txt
, а если запустить его с аргументами командной строки, он пишет их в новый файлarray.txt
@echo off setlocal enabledelayedexpansion chcp 65001 >nul if %1@==@ ( :: Запуск без аргументов - выбрать случайный элемент if not exist array.txt ( echo. echo No any data in array.txt. Type array.bat 1 2 3 ... to add it goto :eof ) for %%R in (array.txt) do ( if not %%~zR lss 1 ( ::Файл не пуст for /f "tokens=* delims=" %%a in (array.txt) do ( set "arr=!arr! %%a" ) set cnt=0 & for %%P in (!arr!) do ( set /a cnt+=1 set "arr[!cnt!]=%%P" ) call :proc !cnt! goto :eof ) else ( echo. echo No any data in array.txt. Type array.bat 1 2 3 ... to add it goto :eof ) ) ) :: Запуск с аргументами - инициализация массива новыми данными echo %* >array.txt goto :eof :proc set /a rndInt=%random% %% %1 +1 echo.!arr[%rndInt%]! :: Уберите паузу, если не нужна :eof pause >nul exit /b
"Поймать" этот код можно на файле без не-пустых данных, например, если создать array.txt
, состоящий только из пары переводов строк, батник выдаст сообщение о делении на ноль.
Зато многострочные данные в файле, в принципе, должны работать.
Усложнять батничек ещё более изощрёнными проверками не хотелось, оставим свободу для вашего творчества :)
13.02.2022, 21:56 [851 просмотр]