批处理脚本:删除目录中每隔一个文件的文件。

3

我有一个包含许多子目录的目录,其中包含数千个jpg文件。 我想做的是创建一个批处理脚本,它将浏览所有子目录并删除每个第二个图像,即每个目录保留第一张,第三张,第五张图像,但删除第二张,第四张和第六张图像等(按文件名排序)。

我尝试使用以下内容,但我的批处理脚本知识很差,并且语法明显不正确。

@echo off
set z = 0
for /f %%a in ('dir/b *.jpg')
do (
  set z = z + 1
  if z == 2 del %%a
)
2个回答

5
  • DO必须与FOR在同一行。

  • 如果要进行数学运算,必须使用SET /A。

  • 你的逻辑错误——目前它只会删除第二个文件,而不是其他每个文件。应该取模2的值(余数除以2),如果结果为0,则删除。

  • 如果想查看当前值(除了在SET /A语句内部),必须使用%z%。但是,在仅设置值的代码块中,这种方法将无效。在这种情况下,需要启用延迟扩展,并使用!z!代替。

  • 当启用延迟扩展时,扩展包含!(文件名中有效)的FOR变量将破坏该值。因此,必须切换开和关延迟扩展。

  • 你说你想遍历子目录,但你的代码只查看一个文件夹。

  • 在SET语句中,空格很重要。你的代码定义了一个带有名称末尾空格的变量z。这不是你想要的。

以下是经过调试的版本:

@echo off
setlocal
for /r %%D in (.) do (
  set "z=0"
  for /f %%F in ('dir /b "%%D\*.jpg"') do (
    set /a "z+=1, r=z%%2"
    setlocal enableDelayedExpansion
    if !r! equ 0 del "%%D\%%F"
    endlocal
  )
)

有解决这个问题的方法而不使用延迟扩展。其中一种方法是简单地在定义和取消定义变量之间交替。
@echo off
setlocal
for /r %%D in (.) do (
  set "del="
  for /f %%F in ('dir /b "%%D\*.jpg"') do if defined del (
    del "%%D\%%F"
    set "del="
  ) else set "del=1"
)

另一种方法是当你想要删除时,有意地将数值除以0,并且只有在发生错误时才执行删除。错误消息被隐藏在2>nul中,而||运算符会有条件地仅在前面的命令失败时才执行后面的命令。

@echo off
setlocal
for /r %%D in (.) do (
  set "z=0"
  for /f %%F in ('dir /b "%%D\*.jpg"') do 2>nul set /a "z+=1, 1/(z%%2)" || del "%%D\%%F"
)

使用dir/b命令,我认为它只会处理当前目录。如果我使用dir/b/s并在根目录下运行,它是否也会删除所有子文件夹中的第二个等图像? - user2832776
@user2832776 - 是的。我允许自己受到你原来代码的影响。现在一切都修复好了。FOR /R遍历目录树,并且删除“标志”会为每个目录重置。 - dbenham
@LS_dev - 不,SET /A 能够在不进行扩展的情况下读取变量的值 - 这是一个非常方便的功能。 - dbenham
@LS_dev - 哎呀,你说得对。已经全部修复了。谢谢。 - dbenham
这对我有用,但是文件名中带有空格的文件不会被删除。我使用此脚本删除空格。它们可以合并吗?https://dev59.com/U2gu5IYBdhLWcg3wgnVh - ICTAddict
第一个脚本运行良好,但我想修改它,使其仅删除当前目录中的文件(否则,如果在根目录意外执行,可能会造成很大的损失!)。必须删除哪些项目才能停止递归删除? - Markm0705

1

如果输出结果良好,请尝试这样做并删除echo

@echo off &setlocal
for /f "tokens=1*delims=:" %%a in ('dir /b /s /a-d *.jpg^|findstr /n $') do (
    echo %%a|findstr "[02468]$" >nul && echo del "%%~b"
)

+1 不错的脚本,但是不会为每个子目录重置计数器。 - LS_ᴅᴇᴠ
@LS_dev 显然不需要。在我看来也没有意义。 :) - Endoro
如果有20个或更多的文件,则会给出错误的结果。顺便说一句,我认为整个任务毫无意义。但是,如果每个文件夹都重置计数,则存在显着差异。如果未重置,则以1个文件开始的文件夹可能最终没有文件,因此它与没有文件开始的文件夹无法区分。如果每个文件夹都重新设置,则每个至少开始具有一个文件的文件夹将以至少具有一个文件结束。缺点是,如果每个文件夹都只有一个文件,则不会删除任何文件 :) - dbenham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接