Самое короткое пуленепробиваемое решение, которое я могу придумать.Как и Андерс, оператор DEL отключен командой ECHO.Удалите ECHO, чтобы сделать меню функциональным.
@echo off
setlocal disableDelayedExpansion
for /f "delims==" %%A in ('set menu 2^>nul') do set "%%A="
for /f "tokens=1* delims=:" %%A in ('dir /b *.exe 2^>nul ^| findstr /n "^"') do (
set menu%%A=%%B
echo %%A. %%B
)
if not defined menu1 exit /b
set "delNum="
set /p "delNum=Delete which file (enter the number): "
setlocal enableDelayedExpansion
if defined menu!delNum! echo del "!menu%delNum%!"
Единственное, что я могу думать о том, что может пойти не так, это то, что часть меню может прокрутиться с экрана, если будет слишком много записей.
Дополнительные сообщения могут быть легко включены.и условие ELSE может быть добавлено к проверке ввода, чтобы иметь дело с неверным вводом.
Несколько тонких точек кода:
- FINDSTR / N обеспечивает увеличение номера файла.Избегает необходимости отложенного расширения или вызова в цикле построителя меню.Задержка расширения не должна быть включена при развертывании переменной FOR, содержащей имя файла, потому что это повредит имена, содержащие
!
. :
является безопасным разделителем FOR, поскольку имя файла не может содержать :
. - delNum очищается до SET / P, потому что SET / P сохранит существующее значение, если нажата
<Enter>
без ввода чего-либо. - Проверка существования переменной - самый простой способ проверкивход.Вот почему очень важно, чтобы любые существующие переменные МЕНЮ были неопределенными до создания меню.
- При проверке IF DEFINED необходимо использовать отложенное расширение, в противном случае пространство на входе может привести к сбою сценария (спасибо Андерсу за указание на ошибкув исходном коде)
- DEL цель должна быть заключена в кавычки, если она содержит пробелы, даже если используется отложенное расширение.
- Добавлен тест, чтобы убедиться, что хотя бы один пункт меню существует перед продолжением.Не может быть никаких файлов .exe, которые можно удалить.