批处理脚本.exe删除选择



有一个文件夹包含一些随机文件:

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

如何SIMPLY显示与数字连接的exe文件,如下所示:

1. file2.exe
2. file4.exe

然后我输入要删除的文件的编号。。如果可以简单地做到这一点。。

我能想出的最短的防弹解决方案。与Anders一样,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条件可以被附加到输入验证以处理无效输入。

代码的几个细微之处:

  • FINDTR/N提供递增的文件号。避免了菜单构建器循环中延迟扩展或CALL的需要。扩展包含文件名的FOR变量时不应启用延迟扩展,因为它会损坏包含!的名称
  • :是一个安全的FOR分隔符,因为文件名不能包含:
  • delNum在SET/P之前被清除,因为如果按下<Enter>而不输入任何内容,SET/P将保留现有值
  • 检查变量是否存在是验证输入的最简单方法。这就是为什么在构建菜单之前,任何现有的MENU变量都必须未定义的原因
  • 必须在IF DEFINED验证中使用延迟扩展,否则输入中的空间可能会使脚本崩溃(感谢Anders指出原始代码中的缺陷)
  • DEL目标必须被引用,以防它包含空格,即使在使用延迟扩展时也是如此
  • 添加了测试,以确保在继续之前至少存在一个菜单项。可能没有任何可删除的.exe文件
@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%]!

不太漂亮,但它完成了任务

@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"
        )
    )
)

最新更新