2012-03-24 41 views
0

有其中包含了一些隨機文件的文件夾:批處理腳本刪除的.exe選擇

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

如何只顯示與數字連這樣的exe文件:

1. file2.exe 
2. file4.exe 

然後我進入該文件的編號,我想刪除..如果它甚至可以做到這一點..

+1

它會成爲第一個作爲Windows批處理腳本編寫的文件管理器嗎? :) – 2012-03-25 02:25:16

回答

2

我可以想出最短的防彈解決方案。與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條件附加到輸入驗證以處理無效輸入。

代碼的幾個微妙點:

  • FINDSTR/N提供遞增的文件號。避免在菜單生成器循環中需要延遲擴展或調用。擴展包含文件名的FOR變量時,不應啓用延遲擴展,因爲它會破壞包含!的名稱。
  • :是一個安全的分隔符,因爲文件名不能包含:
  • delNum在SET/P之前被清除,因爲如果按下<Enter>而沒有輸入任何東西,則SET/P將保留現有值。
  • 檢查變量的存在是驗證輸入的最簡單方法。這就是爲什麼在構建菜單之前任何現有的MENU變量都是未定義的關鍵。
  • 必須使用延遲擴張IF定義的驗證,否則在輸入空間可能崩潰的腳本(感謝安德斯您指出在原來代碼中的漏洞)
  • DEL目標時,必須注意加引號包含空格,即使延遲時擴展被使用。
  • 添加測試以確保在繼續之前至少存在一個菜單條目。可能沒有任何.exe文件需要刪除。
+1

如果你給它一個無效的輸入,比如「1 2」(1個空格2),它會顯示條碼。除此之外,這很漂亮。另外,findstr是XP + IIRC。 – Anders 2012-03-25 16:26:00

+0

@Anders - 關於輸入空間的好處 - 我沒有想到這一點。通過使用延遲擴展輕鬆修復上面的問題。 – dbenham 2012-03-25 17:23:31

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" 
     ) 
    ) 
) 
+0

'idx'應在SET/P之前清除。您的輸入驗證不會進行字符串比較,而是進行數字比較,因此具有5個條目的菜單會錯誤地接受條目11.刪除引號會使比較爲數字,但您不受字母字符保護 - 將接受1a的條目。 – dbenham 2012-03-25 14:34:30

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%]! 
+1

如果一個文件被命名爲「危險!!」,你可以看到它在你的臉上炸開,我們只希望它不會刪除錯誤的文件! (延遲擴展不應該用於文件名恕我直言) – Anders 2012-03-25 08:00:31

+0

現有的文件[]變量應該可以在建立菜單之前清除。也可以使用一些輸入驗證。 – dbenham 2012-03-25 14:36:33

+0

即使沒有exe文件,腳本也會繼續,並且應該引用DEL的目標。我的原始答案有同樣的問題:) – dbenham 2012-03-25 17:50:20