2017-06-14 93 views
0

想象,我有2個文件夾:批處理文件,以1天之前複製文件並沒有更多的

  • C:\ FolderData(會每天更新新的遞增文件)
  • C:\ FolderTemp(需要從一天只有文件執行,不包括小時/時間戳之前)

FolderData將收到的文件名,如果不日期將是平等的,如:

  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

它將帶均爲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. 從文件夾1文件複製從1天到文件夾2之前(我需要什麼幫助
  2. 所有文件從文件夾2刪除過去的9個數字(將刪除的日期,使用上this solution循環),因此文件將SYS_PURCHASES.xls
  3. 移動和從文件夾2替換文件folder3(使用簡單的move /y
+0

這是'/最大生存週期:1',不'/ maxage1';但我想你需要'/ maxage:2'。 'forfiles'不能工作,因爲'/ D -1'表示要取得一天或更長時間的文件(或者,正確地說,昨天修改或eralier)。 – aschipfl

+0

實際上有一個使用'forfiles'的解決方法 - 看到這篇文章:[FORFILES date -after-(cmd文件中的日期計算)](https://stackoverflow.com/a/36585535) – aschipfl

+0

@aschipfl the' maxage1'和'maxage1'是我的問題上的拼寫錯誤,將修復它,然後閱讀您發送的帖子,ty。 – mrbTT

回答

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 
+0

感謝您的回覆,我仍在檢查腳本。有沒有辦法忽略文件​​擴展名?因爲文件夾中會有.xls,.xlsx和.txt文件。 – mrbTT

+1

當然;變量(常量)'_MASK'定義了要匹配的模式,所以只需更改相應的行:'set「_MASK =?* _ ????????。*」' – aschipfl

+0

它沒有工作:/它使用創建或修改的日期?也嘗試改變前幾天從0到10(這是我修改文件夾中的文件的日期),什麼都沒有......任何想法爲什麼? – mrbTT

相關問題