如何仅删除文本文件(少数文件除外)

时间:2019-05-21 10:25:24

标签: batch-file

在某些路径下,我有一些不同类型的文件类型。例如.txt,.bas,.cls等。 除了少数文件,我只需要删除该路径中的文本文件。 例如,如果路径具有a.txtb.txtc.txtaa.basbb.cls,则该路径应仅删除a.txt。它不应删除b.txtc.txt(也不应删除其他扩展名文件)。

2 个答案:

答案 0 :(得分:1)

要删除根文件夹中的所有?.txt个文件,但不包括b.txtc.txt

@echo off
for %%i in (?.txt) do (
     if not "%%~nxi"=="c.txt" if not "%%~nxi"=="b.txt" echo del "%%i"
)

要在根目录和子目录中执行此操作:

@echo off
for /R %%i in (?.txt) do (
     if not "%%~nxi"=="c.txt" if not "%%~nxi"=="b.txt" echo del "%%i"
)

如果文件全部是*.txt个文件,而不仅仅是按照您的示例的一位数字(请添加/R以递归:

@echo off
for %%i in (*.txt) do (
     if not "%%~nxi"=="c.txt" if not "%%~nxi"=="b.txt" echo del "%%i"
)

类似,但使用findstr仅排除:

@echo off
for /f %%i in ('dir /b /a-d ^|findstr /vi "b.txt" ^|findstr /vi "c.txt"') do (
  echo del "%%i"
)

并且要搜索的仅包括:

@echo off
for /f %%i in ('dir /b /a-d ^|findstr /i "a.txt"') do (
  echo del "%%i"
)

并包括和搜索子目录:

@echo off
for /f %%i in ('dir /b /s /a-d ^|findstr /i "a.txt"') do (
  echo del "%%i"
)

在上述所有示例中,删除echo才能实际执行删除操作,echo用作安全措施,只会在控制台上显示del结果。

修改

看到您明确有一个要排除的文件列表(根据您的评论),您可以使用类似的内容。您必须创建一个名为exclusion.txt的文件,并以列表形式添加要排除的文件:

b.txt
c.txt
file with space.txt
d.txt

然后创建批处理文件并添加以下代码。运行后,它将提示您对文件扩展名进行过滤,您可以在其中键入扩展名。即txt或直接按 enter 对所有文件执行删除操作,但排除的文件除外。为安全起见,我添加了一个附加的for循环以仅回显文件并提示您是否确定要删除文件。

@echo off
set cnt=0 & set excl= & set ext=
echo(
if not exist exclusion.txt echo You have not created an "exclusion.txt" file. & echo( & echo You need to create it first, then rerun the script & echo( & pause & goto :eof
echo Ensure you have listed all files to be excluded in "exclusion.txt"  file
echo(
set /p "ext=Add File extention to search on (txt, pdf, etc), or press enter for all files: "
if not defined ext goto cont
if not "%ext:~0,1%"=="." set "ext=.%ext%"
set "ext=*%ext%"
:cont
setlocal enabledelayedexpansion
for /f "delims=" %%a in (exclusion.txt) do (
    set /a cnt+=1   
    set "nlr!cnt!=%%a"
)
for /l %%i in (1,1,%cnt%) do (
    if not defined excl (
         set "excl=!nlr%%i!"
    ) else (
         set "excl=!excl! !nlr%%i!"
   )
)
echo(
echo WARNING: You are about to delete the following files!!
echo(
for /f "delims=" %%i in ('dir /b /a-d %ext% ^|findstr /VIE "%excl%"') do (
     if /i not "%%i"=="exclusion.txt" if not "%%i"=="%~0" echo %%i
)
echo(
Choice /c YN /m "Are you sure you want to delete these files?"
if %errorlevel% equ 2 goto :eof
for /f "delims=" %%i in ('dir /b /a-d %ext% ^|findstr /VIE "%excl%"') do (
    if /i not "%%i"=="exclusion.txt" if not "%%i"=="%~0" del %%i
)

答案 1 :(得分:0)

“ ...它应该只删除a.txt。不应删除b.txt和c.txt ...”

要重新表达您的想法,您只需从任何地方删除a.txt。并且不要触摸其他任何东西。 这可以通过递归del使用开关/ s(子目录)来完成

del /s a.txt