我有一个包含许多子目录的目录,其中包含数千个jpgs。我想要做的是创建一个批处理脚本,它将遍历所有子目录并删除每个第二个图像,即保留第一个,第三个,第五个图像,但删除每个目录的第二个,第四个和第六个图像等(按顺序排列)文件名)。
我尝试了以下内容,但我对批处理脚本的了解很差,而且语法明显不正确。
@echo off
set z = 0
for /f %%a in ('dir/b *.jpg')
do (
set z = z + 1
if z == 2 del %%a
)
答案 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"
)