我有一个包含许多子目录的目录,其中包含数千个 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
您的逻辑是错误的 - 目前它只会删除第二个文件,而不是其他所有文件。您应该取 mod 2 值(余数除以 2)并在结果为 0 时删除。
%z%
如果要查看当前值,则必须使用(SET /A 语句中除外)。但这在只设置值的代码块中不起作用。在这种情况下,您需要启用延迟扩展并!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"
)