我有一个备份程序,可以将.bak
个文件保存到一个文件夹中,该文件夹会自动每周轮换一次。
这些文件的名称如下:
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
每次运行脚本时都会被覆盖。
不,我可以复制文件夹中的最新文件,并使用脚本重命名,但我无法理解如何
我期待的是以下内容:
dr
文件夹我将把这个脚本添加到备份程序中,以便在备份完成时运行。
这些文件的原因是我可以在{} 1}场外{而不是每次都发送整个文件。
答案 0 :(得分: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
命令。在此列表中,第一个文件是最后修改的文件。将此文件复制到目标,覆盖现有文件(如果存在)。
答案 1 :(得分: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文件相同的文件夹。希望这有帮助!