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.bak
和 DB_Test_XXXXXXXX.bak
的最新文件并重命名它们以删除日期所以我最终得到这样的文件 DR
:
dr/DB_Live.bak
dr/DB_Test.bak
每次脚本 运行 时都会被覆盖。
不,我可以复制文件夹中的最新文件并使用脚本对其重命名,但我无法理解如何
- 一个。获取一组最新文件(多个)
- 乙。根据文件的原始名称重命名这些文件,只删除末尾的文件。
我需要做的事情如下:
- 将最新文件复制到
dr
文件夹
- 获取每个文件的文件名
- 重命名文件并用该名称覆盖任何已有的文件
我将把这个脚本添加到备份程序中,以便在备份完成后 运行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
命令。在此列表中,第一个文件是最后修改的。将此文件复制到目标覆盖现有文件(如果存在)。
我有一个备份程序,可以将 .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
文件夹 - 获取每个文件的文件名
- 重命名文件并用该名称覆盖任何已有的文件
我将把这个脚本添加到备份程序中,以便在备份完成后 运行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
命令。在此列表中,第一个文件是最后修改的。将此文件复制到目标覆盖现有文件(如果存在)。