有一个文件夹包含一些随机文件:
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"
)
)
)