【问题标题】:How to copy multiple files based on date modified using batch file?如何根据使用批处理文件修改的日期复制多个文件?
【发布时间】:2017-07-26 03:53:45
【问题描述】:

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

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

@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

如何复制多个上次修改的文件?

例如,我有这样的文件。我想将文件 a.csv、b.csv 和 c.csv 从文件夹 1 复制到文件夹 2 如果可能,我想删除文件夹 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    |
                              +----------+---------------+

【问题讨论】:

  • 标准是什么。我可以找出修改的日期。但是我是否必须复制修改日期超过特定日期的文件?
  • 我想复制上次修改日期:)
  • 在以'do'开头的行中你需要一个冒号(:next)
  • 您发布的代码无法运行,因为存在语法错误。当您要复制第二个目录中当前不存在的那些文件时,是否可以重述问题?如果第一个目录中的文件日期与第二个目录中的文件日期不同,您是否还想复制第一个目录中确实存在于第二个目录中的文件?
  • @Marichyasana :不,在goto :eof 的特定情况下,goto except 中不需要冒号。事实上,我建议从不goto 中使用冒号,goto :eof 除外

标签: batch-file


【解决方案1】:
:: 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 的当前值,如果errorlevel 的值大于或等于指定值,则评估为true,否则为false,因此我们需要复制文件如果@ 987654329@ 是 0 (日期与 lastdate 匹配)并且由于文件是按日期顺序列出的,因此找到第一个不匹配的文件意味着剩余的文件也将是日期不匹配的,所以我们可以退出for循环到donepop回到原来的目录。

【讨论】:

  • 非常感谢你,它的工作:),但你忘了('dir /b /a-d /o-d *.csv"')上的双引号是('dir /b /a-d /o-d "*.csv"')
  • 海@Magoo,如何将lastdate设置为文件夹2的最后日期?
  • 我试过('dir /b /a-d /o-d "%folder2%\*.csv"') do set "lastdate=%%~ta",这个不行(没有人复制)
  • 我不明白您为什么需要folder2 的最后日期,因为它与您的问题无关。但是,您需要pushd "%folder2%" 然后执行dir 命令,设置lastdate2,然后退出到:next2 并从lastdate2 获取日期,就像lastdatefolder1 设置一样.然后ppd 将返回您的原始目录。可悲的是,使用 %%~t? 将分配来自 current 目录(如果存在)的%%? 中文件名的时间戳(如果存在)
【解决方案2】:

这应该可以 ->

@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/"

【讨论】:

  • 谢谢@Trishant Pahwa,但这对我不起作用:) 我在/Q is not recorgnized as an internal or external command, operable program or btch file.Invalid switch - "*". 上有错误
  • 现在试试??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-31
  • 2023-01-10
  • 1970-01-01
相关资源
最近更新 更多