批量文件从1天前复制文件,不再是

时间:2017-06-14 15:54:59

标签: windows batch-file

想象我有2个文件夹:

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

FolderData 会收到文件名,如果日期不是等于,则如下所示:

  1. SYS_PURCHASES_20170612.xls
  2. SYS_PURCHASES_20170613.xls
  3. SYS_PURCHASES_20170614.xls
  4. 如果我今天运行.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

    它会带来 SYS_PURCHASES_20170612.xls SYS_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. 从folder2前一天复制folder1文件(我需要帮助
    2. 从folder2中的所有文件中删除最后9位数(将删除日期,使用this solution上的循环),以便文件为SYS_PURCHASES.xls
    3. 将文件从folder2移动并替换为folder3(使用简单的move /y

1 个答案:

答案 0 :(得分: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