批处理:仅复制在指定日期更改的文件

3
使用批处理脚本,我想要按照特定日期将文件复制到一个文件夹中。我不想复制指定日期之后的文件,只希望复制修改日期恰好是指定日期的文件。
我使用了XCOPY命令,但/D参数会复制指定日期及之后的文件。 例如:
XCOPY "D:\FOLDER" "V:\FOLDERBIS" /K /R /Y /I /D:05-25-2015 /E

这将复制修改日期大于或等于2015年5月25日的文件,我只想要修改日期等于这个特定日期的文件。另外,我不能使用ROBOCOPY。你有什么想法吗?

2
你能使用 WMIC 吗? - npocmaka
可以,但是怎么做呢? - AymericB
2个回答

3

如果您无法使用robocopy(适用于Windows XP及以上版本),则可以尝试使用forfiles(适用于Windows 7或更高版本):

forfiles /D "2.06.2015" /c "cmd /c if @fdate EQU "02.06.2015" echo @file @fdate"

使用该命令的原因是它已经解析了日期。

我的FORFILES使用MM/DD/YYYY格式。FORFILES是否与区域设置有关? - dbenham

2
@echo off

set "_date=20150525"
set "directory=D:\FOLDER"

for %%# in (%directory%) do (
    set "_path=%%~pn#"
    set "_drive=%%~d#"
)


set "_path=%_path:\=\\%\\"

setlocal enableDelayedExpansion

for /f "tokens=* delims=" %%# in ('wmic datafile where "path='%_path%' and drive='%_drive%' " get LastModified^,Caption /Format:value') do (
    for /f "tokens=1,2 delims==" %%A in ("%%#") do (
        if "%%A" equ "Caption" (
            set _fpath=%%B
        )

        if "%%A" equ "LastModified" (
            set _time=%%B
            if  !time:~0,8! equ %_date% (
                echo file !_fpath! has been created on !_time!
                rem :: remove echo if everything is ok
                echo copy "!_fpath!" "V:\FOLDERBIS"
            )
        )
    )

)

编辑: 文件日期通过wmic查询进行过滤

@echo off

set "_date=20150525"
set "directory=D:\FOLDER"


:: time zone is not used to deal better with - and + signs
for /f %%$ in ('wmic os get LastBootUpTime /format:value') do (
    for /f %%# in ("%%$") do set "%%#"
)
set offset=%LastBootUpTime:~21,4%

set "edate=%_date%235959.999999%offset%"
set "bdate=%_date%000000.000000%offset%"

for %%# in (%directory%) do (
    set "_path=%%~pn#"
    set "_drive=%%~d#"
)


set "_path=%_path:\=\\%\\"

for /f "skip=1 tokens=* delims=" %%# in (' wmic datafile where "path='%_path%' and drive='%_drive%'  and LastModified<='%edate%' and LastModified>='%bdate%'" get Caption /Format:table') do (
    for /f "tokens=* delims=" %%A in ("%%#") do (
        echo %%A
        copy "%%A" "V:\FOLDERBIS"
    )

)

2
你应该使用LastModified而不是CreationDate。此外,如果将LastModified放在WHERE子句中,代码会更简单:where "... and LastModified='20150525'" - dbenham
1
@dbenham 我尝试使用 LastModified='20150525'LastModified like '20150525%' 都失败了。它是一个日期时间对象,通过 wmic 看起来我只能使用字符串。 - npocmaka
1
@dbenham - 看起来要从字符串创建日期时间,你需要整个字符串,就像这个例子中的日期: 20150610150858.712825+180 - npocmaka
1
哎呀,我的错误。您可以使用“'YYYYMMDD'”指定时间戳,但这假定为午夜,并且不太可能与文件时间戳匹配。只需要稍作修改即可 :-) where "... and LastModified>='20150525' and LastModified<'20150526'" - dbenham
2
顺便提一句 - 如果你想要同时指定日期和时间,那么必须使用完整的25个字符的时间戳字符串。 - dbenham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接