就像问题所说,我有一个装满照片的文件夹,但很多照片都是重复的。图片在同一分钟内分为10-15组,然后下一组的时间戳为几分钟。我想将每组中的1张照片复制到新文件夹中。我发现了一些我认为可能最常用的代码,但命令根据文件名而不是时间戳复制和排除。任何帮助将不胜感激。
For %%F In ("G:\Bad\*.*") Do If Not Exist "G:\Good\%%~nxF" Copy "%%F" "C:\Good\%%~nxF"
答案 0 :(得分:0)
此文件复制任务可以使用以下批处理文件完成:
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "LastFileTime="
for %%I in ("C:\Path To\Source Folder\*") do (
if "%%~tI" NEQ "!LastFileTime!" (
set "LastFileTime=%%~tI"
copy /B /Y "%%I" "C:\Path To\Destination Folder\" >nul
)
)
endlocal
命令 FOR 为指定源文件夹中的每个非隐藏文件运行 IF 比较,该比较将当前文件的区分大小写的最后修改时间与上次分配给的文件时间进行比较环境变量LastFileTime
使用延迟扩展,因为环境变量值在同一命令块中被更改和引用。
根据差异,将当前文件的最后修改文件时间分配给环境变量,并将文件复制到目标文件夹,该目标文件夹在运行此批处理文件时必须已存在。
注意:在NTFS驱动器上, FOR 处理的文件名列表按文件名排序,而不是按文件时间排序。在FAT16,FAT32和ExFAT驱动器上,文件名列表根本没有排序。这意味着这种简单的方法仅在NTFS驱动器上可靠,所有具有相同最后修改日期的文件具有几乎相同的文件名。
因此,最好按照上次修改时间处理排序的文件列表,例如使用以下代码:
@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "LastFileTime="
cd /D "C:\Path To\Source Folder"
for /F %%I in ('dir * /A-D /B /OD /TW 2^>nul') do (
if "%%~tI" NEQ "!LastFileTime!" (
set "LastFileTime=%%~tI"
copy /B /Y "%%I" "C:\Path To\Destination Folder\"
)
)
endlocal
DIR 输出所有目录条目
*
(*.*
被Windows解释为*
,/A-D
没有设置属性目录,这意味着只包含隐藏文件和系统文件的文件名称,/B
只是文件名而没有任何其他信息,/OD
具有最早的第一个和最新的最后一个/TW
不需要,因为最后修改日期是默认日期。在命令提示符窗口中运行dir /?
的帮助输出也解释了所有这些选项。并且在包含文件的目录中的命令提示符窗口中仅运行dir *
和下一个dir * /A-D /B /OD /TW
,并比较两个输出列表,这使得差异非常明显。
要了解使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完全阅读为每个命令显示的所有帮助页面。
cd /?
copy /?
dir /?
echo /?
endlocal /?
for /?
if /?
set /?
setlocal /?
另请阅读微软有关Using Command Redirection Operators的文章,了解此处使用的>nul
通过将复制文件重定向到设备 NUL 来禁止复制文件数量的消息。
如果源目录中没有文件,2>nul
通过重定向错误消息输出以处理 STDERR 到设备 NUL <,则>
会抑制 DIR 输出的错误消息/ strong>其中重定向运算符^
需要使用插入符WHERE id=$id
进行转义,以便在Windows命令解释器解析 FOR 命令行时将其解析为文字字符稍后在单独的命令进程中执行 DIR 命令行时重定向操作符。