【问题标题】:Batch file to copy files from 1 day before and no more批处理文件从 1 天前复制文件,不再复制
【发布时间】:2017-11-16 21:11:04
【问题描述】:

假设我有 2 个文件夹:

  • C:\FolderData(将随着新文件每天递增)
  • C:\FolderTemp(只需要包含执行前一天的文件,不包括小时/时间戳)

FolderData 将接收如果不是 date 则等于的文件名,如:

  1. SYS_PURCHASES_20170612.xls
  2. SYS_PURCHASES_20170613.xls
  3. SYS_PURCHASES_20170614.xls

如果我今天运行 .bat 文件,我需要SYS_PURCHASES_20170613.xls 复制到 FolderTemp强>.

我尝试使用 robocopy,但显然 它无法接收相同的 minage 和 maxage 值

robocopy "C:\FolderData" "C:\FolderTemp" /minage:1 /maxage:1

另外,如果我尝试:

robocopy "C:\FolderData" "C:\FolderTemp" /minage:1 /maxage:2

它会带来 both SYS_PURCHASES_20170612.xlsSYS_PURCHASES_20170613.xls,这不是我需要的

除此之外,我尝试使用forfiles,但也无济于事。

forfiles /p C:\FolderData /D -1 /C "/C /copy /y @file C:\FolderTemp"

甚至

forfiles /p C:\FolderData /D -1 /C "/C /copy /y C:\FolderData\@file C:\FolderTemp"

还有其他变量,但它返回的内容是“系统无法返回指定的文件”乘以文件夹中的文件数。

请注意,下面涉及的其他过程应该忽略,只是我不知道如何执行上面的步骤

我的批处理文件需要执行的所有步骤:

  1. 从文件夹 2 前 1 天的文件夹 1 文件复制(我需要帮助
  2. 从文件夹 2 中的所有文件中删除最后 9 位数字(将删除日期,在 this solution 上使用循环),因此文件将是 SYS_PURCHASES.xls
  3. 将文件从文件夹 2 移动和替换到文件夹 3(使用简单的 move /y

【问题讨论】:

  • 这是/maxage:1,而不是/maxage1;但我猜你需要/maxage:2forfiles 不能工作,因为 /D -1 说要获取一天或更早的文件(或者正确地说,昨天或更早的最后一次修改)。
  • 实际上有一个使用forfiles的变通方法——见这篇文章:FORFILES date -after- (date calc in cmd file)
  • 好的。 robocopy 也考虑时间,所以当一个文件在昨天同时创建/修改时,它被认为是一天前的。 forfiles 但是不关心时间,所以昨天创建/修改的文件被认为是一天前的文件。
  • 这对我来说太先进了,我明白我应该在 forfiles 的内部循环中在哪里添加复制命令,你能详细说明副本和文件夹需要在哪里吗?

标签: windows batch-file


【解决方案1】:

由于您只想触摸昨天的文件,我会使用forfiles,因为在指定/D 选项时,此命令只考虑日期而不考虑时间。 robocopy 也考虑时间,这可能不是你想要的。

这是一种可能的方式:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_SOURCE=C:\FolderData"
set "_TARGET=C:\FolderTemp"
set "_MASK=?*_????????.*"
set /A "_DAYS_AGO=1"

rem // Check given age and calculate interim value `PREV` needed for `forfiles`:
(if %_DAYS_AGO% LSS 0 set "_DAYS_AGO=0") & set /A "PREV=_DAYS_AGO+1"
rem // Let `forfiles` output the filtered files and capture them by `for /F`:
for /F "delims= eol=|" %%F in ('
    rem/ Use two nested `forfiles` loops to filter for files of specified day: ^
        ^& forfiles /P "%_SOURCE%" /M "%_MASK%" /D -%_DAYS_AGO% ^
        /C "cmd /C if @isdir==FALSE > nul 2>&1 forfiles /M @file /D -%PREV% || echo @file"
') do (
    rem // Store current file name and extension:
    set "FILE=%%~nF" & set "FEXT=%%~xF"
    setlocal EnableDelayedExpansion
    rem // Copy the file and remove the last 9 characters from its name:
    > nul copy /Y "!_SOURCE!\!FILE!!FEXT!" "!_TARGET!\!FILE:~,-9!!FEXT!"
    endlocal
)

endlocal
exit /B

【讨论】:

  • 感谢您的回复,我还在检查脚本。有没有办法忽略文件​​扩展名?因为文件夹里会有.xls、.xlsx和.txt文件。
  • 当然;变量(常量)_MASK 定义要匹配的模式,因此只需更改相应的行:set "_MASK=?*_????????.*"
  • 它不起作用:/它使用创建或修改的日期吗?还尝试将前几天从 0 更改为 10(这是我修改文件夹中文件的日期),但什么也没有……知道为什么吗?
  • 抱歉,我在重定向方面犯了一个错误——请参阅我的编辑。 forfiles(以及robocopy)认为最后修改日期...
  • 嘿,成功了!你做了所有的步骤,即使你只需要一个移动,谢谢一堆,我会把它标记为答案。现在我需要检查是否可以将源文件夹和目标文件夹作为参数传递!
猜你喜欢
  • 2013-10-18
  • 1970-01-01
  • 2012-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多