想象我有2个文件夹:
FolderData 会收到文件名,如果日期不是等于,则如下所示:
如果我今天运行.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"
和其他变量一样,但它返回“系统无法返回指定文件”的行,超过文件夹中文件的数量。
请注意,其他涉及的流程应该被忽略,这只是我无法弄清楚如何做上面的步骤。
我的批处理所需的所有步骤都需要:
move /y
)答案 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