我想根据从其他文件夹修改的日期制作文件复制命令。
我有这样的批处理文件,但这只能复制一个文件
@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 |
+----------+---------------+
答案 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,因此如果errorlevel
为0
(日期与lastdate
匹配),我们需要复制文件,并且因为文件是按日期顺序列出的,所以找到第一个不匹配将意味着其余文件在日期也不匹配,因此我们可以从for
循环退出到done
和pop
返回原始目录。
答案 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/"