Пакетный скрипт .exe удаляет выделение - PullRequest
0 голосов
/ 25 марта 2012

Существует папка, которая содержит несколько случайных файлов:

file1.txt
file2.exe
file3.cpp
file4.exe

Как ПРОСТО отображать исполняемые файлы, связанные с номерами, подобными этому:

1. file2.exe
2. file4.exe

И затем я ввожу числофайл, который я хочу удалить .. Если это возможно сделать просто ..

Ответы [ 3 ]

2 голосов
/ 25 марта 2012
@echo off
setlocal EnableDelayedExpansion
set i=0
for %%f in (*.exe) do (
   set /A i+=1
   set file[!i!]=%%f
   echo !i!. %%f
)
set i=0
set /P i=File to delete: 
del !file[%i%]!
2 голосов
/ 25 марта 2012

Самое короткое пуленепробиваемое решение, которое я могу придумать.Как и Андерс, оператор 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, которые можно удалить.
2 голосов
/ 25 марта 2012

Не совсем красиво, но оно выполняет свою работу

@echo off
setlocal ENABLEEXTENSIONS DISABLEDELAYEDEXPANSION
goto main

:addit
set /A end=end + 1
set %end%=%~1
echo %end%. %~1
goto :EOF

:main
set end=0
for %%A in ("*.exe") do (
    call :addit "%%~A"
)
if "%end%"=="0" goto :EOF
echo.&set idx=
set /P idx=Delete (1...%end%)
if not "%idx"=="" if %idx% GEQ 1 if %idx% LEQ %end% (
    for /F "tokens=1,* delims==" %%A in ('set %idx% 2^>nul') do (
        if "%idx%"=="%%~A" (
            echo.Deleting %%~B...
            rem del "%%~B"
        )
    )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...