БлогNot. Как создать в Batch-файле массив и извлечь оттуда случайный элемент

Как создать в 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 просмотр]


теги: textprocessing памятка random bat

К этой статье пока нет комментариев, Ваш будет первым