我有一个包含许多子目录的目录,其中包含数千个jpg文件。 我想做的是创建一个批处理脚本,它将浏览所有子目录并删除每个第二个图像,即每个目录保留第一张,第三张,第五张图像,但删除第二张,第四张和第六张图像等(按文件名排序)。
我尝试使用以下内容,但我的批处理脚本知识很差,并且语法明显不正确。
@echo off
set z = 0
for /f %%a in ('dir/b *.jpg')
do (
set z = z + 1
if z == 2 del %%a
)
我有一个包含许多子目录的目录,其中包含数千个jpg文件。 我想做的是创建一个批处理脚本,它将浏览所有子目录并删除每个第二个图像,即每个目录保留第一张,第三张,第五张图像,但删除第二张,第四张和第六张图像等(按文件名排序)。
我尝试使用以下内容,但我的批处理脚本知识很差,并且语法明显不正确。
@echo off
set z = 0
for /f %%a in ('dir/b *.jpg')
do (
set z = z + 1
if z == 2 del %%a
)
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"
)
如果输出结果良好,请尝试这样做并删除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"
)