主要功能

假设有两个目录,A目录和B目录。要A目录整体复制到B目录,同名文件则覆盖。
此脚本会备份同名文件包括完整的路径。同时会记录A目录的所有文件。
可以快捷还原B目录到覆盖之前,同时还会将A目录比原本B目录多的文件删除。

主要程序

脚本是bat脚本

@echo off
setlocal enabledelayedexpansion
chcp 65001 > nul

echo 1:部署程序
echo 2:还原备份程序
echo 3:查看使用说明

set /p "mode=请选择执行操作:"

if /i "!mode!"=="1" (
    goto deploy
)else if /i "!mode!"=="2" (
    goto reduction
)else (
    goto explain
)

:deploy
    echo --------------------------
    echo --------------------------
    set /p "sourceDir=请输入源目录:"
    set /p "targetDir=请输入目标目录(被覆盖目录):"
    set /p "backupDir=请输入备份目录:"

    if not exist "%backupDir%" mkdir "%backupDir%"
    set "scriptDir=%~dp0"
    if not exist ".\!targetDir!" (
        echo !targetDir! >> "!backupDir!\backupChecklist.txt"
    ) else (
        echo !scriptDir!!targetDir! >> "!backupDir!\backupChecklist.txt"
    )

    for /r "%sourceDir%" %%i in (*) do (
        set "sourcePath=%%i"
        set "realDestPath=!sourcePath:%sourceDir%=%targetDir%!"
        for %%i in ("!realDestPath!") do (set "destPath=%%~pi")
        set "backupPath=!sourcePath:%sourceDir%=%backupDir%!"
        for %%i in ("!backupPath!") do (set "backupPath=%%~pi")
        
        echo !realDestPath! >> "!backupDir!\backupChecklist.txt"
        
        if not exist "!realDestPath!" (
            xcopy "%%i" "!destPath!" /s /y /f > nul
        ) else (
            xcopy "!realDestPath!" "!backupPath!" /s /y /f > nul
            del /q "!realDestPath!"
            xcopy "%%i" "!destPath!" /s /y /f > nul
        )
        
    )
    goto end

:reduction
    echo --------------------------
    echo --------------------------
    set /p "backupDir=请输入备份文件目录:"
    
    if not exist "!backupDir!\backupChecklist.txt" (
        echo "找不到文件:!backupDir!\backupChecklist.txt"
        goto end
    )
    
    set isFirstLine=1
    for /F "tokens=*" %%A in (!backupDir!\backupChecklist.txt) do (
        if defined isFirstLine (
            set "targetPrefix=%%A"
            set "isFirstLine="
        )else (
            del /q "%%A" 2> nul
        )
    )
    xcopy "!backupDir!" "!targetPrefix!" /s /y /f
    del /q "!targetPrefix:~0,-1!\backupChecklist.txt"
    goto end

:explain
    echo --------------------------
    echo --------------------------
    echo 会对比源目录和目标目录的文件,若有同名文件,会备份目标目录的文件到备份目录中
    echo 会将源目录的所有文件绝对路径记录在备份目录下的backupChecklist.txt
    echo 还原程序会备份目录的文件替换目标目录文件,同时会删除之前源目录存在目标目录不存的文件
    echo 若存在同名父子目录,输入相对路径程序可能会出错,建议输入目录的绝对路径
    echo --------------------------
    echo --------------------------
    goto end

:end
    echo ...
    echo ...
    echo 已完成

附上脚本的几张截图
2024-04-28T04:14:54.png
2024-04-28T04:15:19.png