use*_*776 3 file-io batch-file
我有一个包含许多包含数千个 jpg 的子目录的目录。我想要做的是创建一个批处理脚本,该脚本将遍历所有子目录并删除每第二张图像,即保留第一、第三、第五张图像,但删除每个目录的第二、第四和第六张图像等(按以下顺序排序)文档名称)。
我尝试了以下操作,但我对批处理脚本的了解很差,而且语法显然不正确。
@echo off
set z = 0
for /f %%a in ('dir/b *.jpg')
do (
set z = z + 1
if z == 2 del %%a
)
Run Code Online (Sandbox Code Playgroud)
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
)
)
Run Code Online (Sandbox Code Playgroud)
有一些方法可以在不延迟扩展的情况下解决这个问题。一种是简单地在定义和取消定义变量之间交替。
@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"
)
Run Code Online (Sandbox Code Playgroud)
还有一种就是想删除的时候故意除以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"
)
Run Code Online (Sandbox Code Playgroud)