Windows批处理脚本用于复制具有部分名称的最新文件

时间:2015-05-18 21:05:20

标签: batch-file backup batch-rename

我有一个备份程序,可以将.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

每次运行脚本时都会被覆盖。

不,我可以复制文件夹中的最新文件,并使用脚本重命名,但我无法理解如何

  • 甲。获取最新文件集(多个)
  • B中。根据原始名称重命名这些文件,只删除最后的文件。

我期待的是以下内容:

  1. 将最新文件复制到dr文件夹
  2. 获取每个文件的文件名
  3. 重命名文件并用该名称覆盖任何已存在的文件
  4. 我将把这个脚本添加到备份程序中,以便在备份完成时运行。

    这些文件的原因是我可以在{} 1}场外{而不是每次都发送整个文件。

2 个答案:

答案 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文件相同的文件夹。希望这有帮助!

相关问题