标题: [文件操作] 批处理自动复制文件夹下的前一天的所有文件 [打印本页]
作者: 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文件夹。因为不可能有明天的文件。- @echo off&&setlocal enabledelayedexpansion
- for /f %%i in ('dir /b /s /on "a\*.*"') do (
- set mm=%%~ti
- set sj=!mm:~0,10!
- if !sj! == %date:~0,10% (echo 今天的%%i) else (move /y %%i b\)
- )
- 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
- @echo off&&setlocal enabledelayedexpansion
- for /f %%a in ('cscript //nologo yester.vbs') do set yesterday=%%a
- for /f %%i in ('dir /b /s /on "a\*.txt"') do (
- echo %%:~ni
- set mm=%%~ti
- set sj=!mm:~0,4!!mm:~5,2!!mm:~8,2!
- if !sj! == %yesterday% move /y %%i b\
- )
- 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 - @echo off
- set "SrcFolder=D:\Test\A"
- set "DstFolder=D:\Test\B"
- set "DaysAgo=1"
- for /f %%i in ('powershell -c "Get-Date (Get-Date).AddDays(-%DaysAgo%) -uformat "%%Y/%%m/%%d""') do (
- set "DstDate=%%i"
- )
- 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 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://www.bathome.net/) |
Powered by Discuz! 7.2 |