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

Windows batch script to copy newest files with partial names

我有一个备份程序,可以将 .bak 文件保存到一个每周自动轮换的文件夹中。

文件的命名如下:

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

备份程序不允许我编辑这些名称,实际上我不想这样做。

我需要的是能够复制每组 DB_Live_XXXXXXXX.bakDB_Test_XXXXXXXX.bak 的最新文件并重命名它们以删除日期所以我最终得到这样的文件 DR:

dr/DB_Live.bak
dr/DB_Test.bak

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

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

我需要做的事情如下:

  1. 将最新文件复制到 dr 文件夹
  2. 获取每个文件的文件名
  3. 重命名文件并用该名称覆盖任何已有的文件

我将把这个脚本添加到备份程序中,以便在备份完成后 运行s。

之所以要这些文件,是因为我可以 RSYNC 将它们从网站上移开,而不必每次都发送整个文件。

@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 文件相同的文件夹中。希望这对您有所帮助!

@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命令。在此列表中,第一个文件是最后修改的。将此文件复制到目标覆盖现有文件(如果存在)。