2015-05-18 74 views
1

我有一個備份程序,它可以將.bak文件保存到每週自動輪換的文件夾中。Windows批處理腳本以部分名稱複製最新文件

的文件被賦予賜名這樣的:

DB_Live_19052015.bak 
DB_Test_19052015.bak 
DB_Live_18052015.bak 
DB_Test_18052015.bak 

備份程序不允許我來編輯這些名字,我其實不想它。

我需要的是能夠複製每一個的最新文件中設置DB_Live_XXXXXXXX.bak & DB_Test_XXXXXXXX.bak並重新命名他們,所以我結束了這樣的文件DR下降日期:

dr/DB_Live.bak 
dr/DB_Test.bak 

這每次腳本運行時都會被覆蓋。

沒有我可以在文件夾中複製的最新文件,並使用腳本將其重命名,但我不能讓我的頭一輪如何

  • A.獲得一組最新的文件(多個)
  • B.根據其原始名稱重命名這些文件,只刪除最後。

什麼我期待要做的是以下幾點:

  1. 拷貝到dr文件夾
  2. 獲取文件名的每個文件
  3. 重命名文件並覆蓋最新的文件任何已經存在的名稱

我打算將此腳本添加到備份程序中,以便在t他的備份已經結束。

這些文件的原因是我可以RSYNC他們離開現場,而不是每次發送整個文件。

回答

1
@echo off 
    setlocal enableextensions disabledelayedexpansion 

    set "source=%cd%\source" 
    set "target=%cd%\target" 

    for %%a in (DB_Live DB_Test) do (
     set "first=1" 
     for /f "delims=" %%b in (' 
      dir /a-d /tw /o-d /b "%source%\%%a_*.bak" 
     ') do if defined first (
      set "first=" 
      copy /b /y "%source%\%%~b" "%target%\%%a%%~xb" 
     ) 
    ) 

對於每組文件,請按反向修改的日期順序執行dir命令。在這個列表中,第一個文件是最後修改的。將此文件複製到覆蓋現有文件(如果存在)的目標。

+0

這個作品完全謝謝你!我已經成功地將此添加到BackupAssist作爲成功運行的備份腳本,並且測試良好。 – bluestreak

0
@echo off 
echo.>%temp%\tempone.txt 
if not exist dr md dr 
if not exist dblive md dblive 
if not exist dbtest md dbtest 
setlocal enabledelayedexpansion 
for %%I in (*) do (
set red=%%I 
set blue=!red:~0,7! 
if "!blue!"=="DB_Live" copy /y !red! dblive>nul 
if "!blue!"=="DB_Test" copy /y !red! dbtest>nul 
) 
pushd %cd% 
cd dblive 
for %%I in (*) do (
set green=%%I 
set green=!green:DB_Live_=! 
set green=!green:.bak=! 
echo !green! >>%temp%\tempone.txt 
) 
set max=0 
for /f %%x in (%temp%\tempone.txt) do (
    set "FN=%%~nx" 
    if !FN! GTR !max! set max=!FN! 
) 
echo the latest dblive file is DB_Live_!max!.bak--copied to dr folder 
set dblatest=DB_Live_!max!.bak 
copy /y !dblatest! %temp%>nul 
popd 
copy /y %temp%\!dblatest! dr>nul 
::same for dbtest 
pushd %cd% 
cd dbtest 
for %%I in (*) do (
set green=%%I 
set green=!green:DB_Test_=! 
set green=!green:.bak=! 
echo !green! >>%temp%\temptwo.txt 
) 
set max=0 
for /f %%x in (%temp%\temptwo.txt) do (
    set "FN=%%~nx" 
    if !FN! GTR !max! set max=!FN! 
) 
echo the latest dbtest file is DB_Test_!max!.bak--copied to dr folder 
set dblatest=DB_Test_!max!.bak 
copy /y !dblatest! %temp%>nul 
popd 
copy /y %temp%\!dblatest! dr>nul 
::rename both files 
pushd %cd% 
cd dr 
ren DB_Live_* DB_Live.bak 
if %errorlevel%==0 echo renamed dblive 
ren DB_Test_* DB_Test.bak 
if %errorlevel%==0 echo renamed dbtest 
pause 

與.bak文件放在相同的文件夾中。希望這可以幫助!

相關問題