如何根据使用批处理文件修改的日期复制多个文件?

时间:2017-07-26 03:53:46

标签: batch-file

我想根据从其他文件夹修改的日期制作文件复制命令。

我有这样的批处理文件,但这只能复制一个文件

@echo off
set folder1=D:\FTP-NSQM\2G_VOLUME\2017
set folder2=D:\FTP-NSQM\newday\2gvolume
for /f "tokens=*" %%a in ('dir /b /a-d /o-d "%folder1%\*.csv"') do copy "%folder1%\%%~a" "%folder2%" & goto next
:next
echo Carrying on with rest of batch
pause

如何在最后修改时复制多个文件?

例如,我有这样的文件。我想从文件夹1到文件夹2复制文件a.csv,b.csv和c.csv 如果可能的话,我想删除文件夹2上的先前数据(d.csv,e.csv和f.csv)

+--------------------------+  +--------------------------+
|       folder 1           |  |     folder 2 (before)    |
+----------+---------------+  +----------+---------------+
|   name   | date modified |  |   name   | date modified |
+----------+---------------+  +----------+---------------+
| a.csv    | 2017-07-26    |  | d.csv    | 2017-07-25    |
| b.csv    | 2017-07-26    |  | e.csv    | 2017-07-25    |
| c.csv    | 2017-07-26    |  | f.csv    | 2017-07-25    |
| d.csv    | 2017-07-25    |  +----------+---------------+
| e.csv    | 2017-07-25    |      I hope :) be like this
| f.csv    | 2017-07-25    |  +--------------------------+
| g.csv    | 2017-07-24    |  |     folder 2 (after)     |
| h.csv    | 2017-07-24    |  +----------+---------------+
| i.csv    | 2017-07-24    |  |   name   | date modified |
| .....    | ....-..-..    |  +----------+---------------+
+----------+---------------+  | a.csv    | 2017-07-26    |
                              | b.csv    | 2017-07-26    |
                              | c.csv    | 2017-07-26    |
                              +----------+---------------+

2 个答案:

答案 0 :(得分:3)

:: remove all .csv files from destination
del "%folder2%\*.csv"
pushd "%folder1%"
:: date lastdate to the latest date/time of a file in folder1
for /f "tokens=*" %%a in ('dir /b /a-d /o-d "*.csv"') do set "lastdate=%%~ta"& goto next
:next
:: grab first 8 characters (may need to be 10, depending on your date/time format)
:: - get the date part only
set "lastdate=%lastdate:~0,8%"
for /f "tokens=*" %%a in ('dir /b /a-d /o-d "*.csv"') do echo "%%~ta" | find "%lastdate%" >nul & if errorlevel 1 (
 goto done
 ) else (copy "%%~a" "%folder2%")
)
:done
popd

所以 - 首先清除 folder2 ,然后将当前目录切换到 folder1

lastdate设置为以倒数日期顺序找到的第一个.csv中的日期/时间字符串,并删除时间部分。

再次浏览目录,查看lastdate中找到的日期是否与文件的日期相符。如果是,则errorlevel将设置为0,否则设置为非零。

if errorlevel测试解释errorlevel的当前值,如果true的值是指定值或更高,则评估为errorlevel,否则为false,因此如果errorlevel0(日期与lastdate匹配),我们需要复制文件,并且因为文件是按日期顺序列出的,所以找到第一个不匹配将意味着其余文件在日期也不匹配,因此我们可以从for循环退出到donepop返回原始目录。

答案 1 :(得分:0)

这应该有效 - >

@echo off
set folder1=D:\FTP-NSQM\2G_VOLUME\2017
set folder2=D:\FTP-NSQM\newday\2gvolume
set dateFlag=""
cd %folder2%
for /f %%a in ('dir /b /od') do @set dateFlag=%%~ta
set dateFlag=%dateFlag:~0,10%
cd ..
del %folder2%
mkdir %folder2%
echo latest date= %dateFlag%
cd %folder1%
FORFILES /D +%dateFlag% /C "cmd /c copy @file %folder2/"