Board logo

标题: [文件操作] 批处理自动复制文件夹下的前一天的所有文件 [打印本页]

作者: 79794133    时间: 2021-9-4 08:12     标题: 批处理自动复制文件夹下的前一天的所有文件

有文件夹A,文件夹B, 要把文件夹A中的创建时间为前一天的文件复制到文件夹B中,比如今天是9月4号,把9月3号创建的文件复制过去,到9月5号把9月4号的文件复制过去。请各位前辈大佬指点一下
作者: Batcher    时间: 2021-9-4 08:22

回复 1# 79794133


文件名里面是否包含日期?
如果包含,请发一个完整的文件名出来。
如果不包含,请打开一个CMD窗口执行命令 dir /tc 把结果发出来看看。

怎样把CMD窗口里的结果复制出来?
http://bbs.bathome.net/thread-3473-1-1.html
作者: 79794133    时间: 2021-9-4 10:09

回复 2# Batcher


    E:\A>dir
驱动器 E 中的卷没有标签。
卷的序列号是 497E-ACE6

E:\A 的目录

2021/09/05  10:07    <DIR>          .
2021/09/05  10:07    <DIR>          ..
2021/09/01  13:04                 0 1.txt
2021/09/02  13:03                 0 2.txt
2021/09/03  11:38                 0 3.txt
2021/08/31  13:04                 0 31.txt
2021/09/04  13:04                 0 4.txt
               5 个文件              0 字节
               2 个目录 183,412,678,656 可用字节
作者: 79794133    时间: 2021-9-4 10:14

本帖最后由 79794133 于 2021-9-4 10:18 编辑

回复 2# Batcher


    文件名是不包含日期的,我的想法是通过每个文件的创建日期与前一天的日期进行比较,如果相同就进行复制操作。
比如:文件4.txt的创建日期为2021/09/04  13:04,我们只截取前面的日期2021/09/04或者20210904,今天是9月5号,昨天就是9月4号,然后把截取的日期与昨天的日期进行比较,如果两个日期相同就进行复制操作
作者: hlzj88    时间: 2021-9-4 13:41

假设是每天都运行的情况,即把不等于今天的文件复制到b文件夹。因为不可能有明天的文件。
  1. @echo off&&setlocal enabledelayedexpansion
  2. for /f %%i in ('dir /b /s /on "a\*.*"') do (
  3.   set mm=%%~ti
  4.   set sj=!mm:~0,10!
  5.   if !sj! == %date:~0,10% (echo 今天的%%i) else (move /y %%i b\)
  6.   )
  7. pause
复制代码

作者: 79794133    时间: 2021-9-4 13:56

回复 5# hlzj88


    那还有前天的,大前天的,大大前天的文件呢,我只想要昨天的文件
作者: hlzj88    时间: 2021-9-4 14:06

本帖最后由 hlzj88 于 2021-9-4 14:15 编辑

回复 6# 79794133
按你顶楼的说法,只有两个文件夹,a里只保留当天的文件,不是当天的文件都是到b,无非是哪一天执行批处理,这样子前天大前天有关系吗。也许你该改顶楼的要求细节。

如果是不定时执行,又只要昨天的文件,我没有能力判断昨天的日期,比如跨月的日子。今天1号,昨天是30号,31号,不能搞定。
作者: 79794133    时间: 2021-9-4 16:41

回复 7# hlzj88


   d = date() - 1
wscript.echo year(d) * 10000 + month(d) * 100 + day(d)
以上是VBS代码,新建记事本保存为.VBS即可。

for /f %%a in ('cscript //nologo yester.vbs') do set yesterday=%%a
这一句保存为.bat文件,yesterday即是昨天的日期

然后用批处理获得文件夹下的文件创建日期,与yesterday进行对比,这样你看行吗?
作者: hlzj88    时间: 2021-9-4 17:22

  1. @echo off&&setlocal enabledelayedexpansion
  2. for /f %%a in ('cscript //nologo yester.vbs') do set yesterday=%%a
  3. for /f %%i in ('dir /b /s /on "a\*.txt"') do (
  4.   echo %%:~ni
  5.   set mm=%%~ti
  6.   set sj=!mm:~0,4!!mm:~5,2!!mm:~8,2!
  7.   if !sj! == %yesterday% move /y %%i b\
  8. )
  9. pause
复制代码
需和你的vbs放一起
作者: newswan    时间: 2021-9-4 19:05

本帖最后由 newswan 于 2021-9-4 19:11 编辑

创建时间 ? 修改时间
dir 一般 得到的时间是修改时间
dir /tc 才是创建时间

2楼已经写明了
作者: hlzj88    时间: 2021-9-4 22:34

感谢newswan提醒,细节决定成败。
回复 8# 79794133

把/on 改/tc。
作者: Batcher    时间: 2021-9-5 21:14

回复 3# 79794133
  1. @echo off
  2. set "SrcFolder=D:\Test\A"
  3. set "DstFolder=D:\Test\B"
  4. set "DaysAgo=1"
  5. for /f %%i in ('powershell -c "Get-Date (Get-Date).AddDays(-%DaysAgo%) -uformat "%%Y/%%m/%%d""') do (
  6.     set "DstDate=%%i"
  7. )
  8. for /f "delims=" %%i in ('dir /b /a-d "%SrcFolder%"') do (
  9.     call :CheckFile "%%i"
  10. )
  11. goto :eof
  12. :CheckFile
  13. for /f "skip=5" %%j in ('dir /tc "%SrcFolder%\%~1"') do (
  14.     if "%%j" equ "%DstDate%" (
  15.         copy /y "%SrcFolder%\%~1" "%DstFolder%\"
  16.     )
  17.     goto :eof
  18. )
复制代码

作者: 79794133    时间: 2021-9-6 08:40

回复 12# Batcher


    大佬V5,小弟膜拜
作者: hztccy    时间: 2021-9-6 09:03

在不考虑其他时间的情况下
其实
robocopy也是可以的

robocopy "C:\123" "C:\234" /maxage:1
作者: 79794133    时间: 2021-9-6 09:32

回复 12# Batcher


@echo off
set "SrcFolder=E:\A"
set "DaysAgo=1"
for /f %%i in ('powershell -c "Get-Date (Get-Date).AddDays(-%DaysAgo%) -uformat "%%Y/%%m/%%d""') do (
    set "DstDate=%%i"
)
set "yesterday=%DstDate:~0,4%%DstDate:~5,2%%DstDate:~8,2%
md  e:\backup\%yesterday%
set   "DstFolder=e:\backup\%yesterday%"

for /f "delims=" %%i in ('dir /b /a-d "%SrcFolder%"') do (
    call :CheckFile "%%i"
)
goto :eof
:CheckFile
for /f "skip=5" %%j in ('dir /tc "%SrcFolder%\%~1"') do (
    if "%%j" equ "%DstDate%" (
        copy /y "%SrcFolder%\%~1" "%DstFolder%\"
    )
    goto :eof
)

这是通过你的方法改良后的代码,完美解决了我的所有问题,你是我偶像爱你哦
作者: 79794133    时间: 2021-9-6 09:36

回复 14# hztccy


    robocopy "C:\123" "C:\234" /maxage:1
这个复制时差1天内的文件,不能完美的只复制昨天的文件
作者: hztccy    时间: 2021-9-6 11:05

回复 16# 79794133


    这个我知道呀,所以我才说在不考虑其他时间的情况下,这个也是可以呀。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2