批处理脚本.exe删除选择

时间:2012-03-24 23:37:57

标签: batch-file

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

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

如何SIMPLY显示与这样的数字连接的exe文件:

1. file2.exe
2. file4.exe

然后我输入要删除的文件编号..如果甚至可以这样做......

3 个答案:

答案 0 :(得分:2)

不完全漂亮,但它完成了工作

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

答案 1 :(得分:2)

@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 :(得分:2)

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