批处理脚本删除目录中的每个其他文件

时间:2013-09-30 21:44:47

标签: batch-file file-io

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

我尝试了以下内容,但我对批处理脚本的了解很差,而且语法明显不正确。

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

2 个答案:

答案 0 :(得分:4)

  • DO必须与FOR在同一行。

  • 如果你想做数学,你必须使用SET / A

  • 您的逻辑错误 - 目前它只删除第二个文件,而不是每隔一个文件。你应该取mod 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"
)

答案 1 :(得分: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"
)