在 Windows 7 上使用批处理脚本同步两个远程服务器间的文件

本文介绍一个批处理脚本在两个远程服务器之间同步文件,并且在操作过程中添加时间戳以便后续管理和审计。

1. 设置环境与变量

首先,定义远程服务器的地址和文件路径,同时还要指定本地的临时存储目录。以下是相关变量的设置:

:: 定义远程服务器和路径
set SRC_SERVER=user@a.b.c.d
set SRC_PATH=/SRC_PATH
set DEST_SERVER=user2@1.2.3.4
set DEST_PATH=/DEST_PATH

:: 定义密码
set SRC_PASSWORD="password1"
set DEST_PASSWORD="password2"

:: 临时存储路径
set TEMP_DIR=C:\Users\Administrator\Desktop\remote_sync

这里的 SRC_SERVERDEST_SERVER 分别是源服务器和目标服务器的地址,SRC_PATHDEST_PATH 是对应的文件路径。TEMP_DIR 是用来存放中间文件的本地目录。

2. 创建本地临时目录

在执行文件传输操作前,确保本地有一个临时目录用于存储从源服务器下载的文件:

:: 创建本地临时目录
mkdir "%TEMP_DIR%" 2>nul

这里使用了 2>nul 来忽略错误输出,避免目录已存在时的提示。

3. 生成带有时间戳的目录名

通过 for 循环来提取所需的年月日、时分( Windows 7 的 %date%%time% 和其他系统有区别,如果是 Windows 10 需要自己验证一下):

for /f "tokens=1-6 delims=/:. " %%a in ("%date% %time%") do (
    set "timestamp=%%b%%c%%d_%%e%%f"
)

此代码通过分隔符 /, :, ., 和空格提取年月日时分,最终生成格式如 20240901_1333 的时间戳。

4. 文件传输与清理

接下来,将从源服务器下载的文件传输到目标服务器,并在传输成功后删除源服务器上的文件:

:: 从第一个远程服务器下载文件到本地临时目录
pscp -pw "%SRC_PASSWORD%" -r %SRC_SERVER%:%SRC_PATH%/* %TEMP_DIR%	

:: 将本地临时目录的文件上传到第二个远程服务器
pscp -pw "%DEST_PASSWORD%" -r "%TEMP_DIR%\*" %DEST_SERVER%:%DEST_PATH%

:: 如果上传成功,删除源服务器上的文件
if %ERRORLEVEL%==0 (
    plink -ssh -pw "%SRC_PASSWORD%" -batch %SRC_SERVER% "rm -rf %SRC_PATH%/*"
    echo 已成功删除源服务器上的文件
) else (
    echo 文件传输失败,未删除源服务器上的文件
)

其中,pscp 是 PuTTY 提供的命令行工具,用于执行安全的文件传输操作。plink 则是一个用于执行远程命令的工具。%ERRORLEVEL% 检查上一步操作是否成功,如果成功则删除源服务器上的文件。

5. 归档与日志管理

最后,将本地的临时目录重命名为带时间戳的目录,以便于管理和备份:

:: 移动临时文件夹到带时间戳的目录
move "%TEMP_DIR%" "%TEMP_DIR%_%timestamp%"

echo 文件传输完成

这一步确保每次文件传输操作都有对应的本地备份,便于日后查看或还原。

最终代码

这是目前最新的版本,做了些微调:

@echo off
chcp 65001 >nul

:: 定义远程服务器和路径
set SRC_SERVER=user@a.b.c.d
set SRC_PATH=/SRC_PATH
set DEST_SERVER=user2@1.2.3.4
set DEST_PATH=/DEST_PATH

:: 定义密码
set SRC_PASSWORD="password1"
set DEST_PASSWORD="password2"

:: 临时存储路径
set TEMP_DIR=C:\Users\Administrator\Desktop\remote_sync
:: 获取源服务器的文件数量
plink -ssh -pw "%SRC_PASSWORD%" -batch %SRC_SERVER% "find %SRC_PATH% -type f | wc -l" > file_count.txt
set /p FILE_COUNT=<file_count.txt
del file_count.txt

:: 判断文件数量是否大于等于2
if %FILE_COUNT% LSS 2 (
    echo 文件数量不足,不执行文件传输
    exit /b
)

for /f "tokens=1-6 delims=/:. " %%a in ("%date% %time%") do (
    set "timestamp=%%b%%c%%d_%%e%%f"
)

:: 创建本地临时目录
mkdir "%TEMP_DIR%" 2>nul

:: 从第一个远程服务器下载文件到本地临时目录
pscp -pw "%SRC_PASSWORD%" -r %SRC_SERVER%:%SRC_PATH%/* %TEMP_DIR%	

:: 将本地临时目录的文件上传到第二个远程服务器
pscp -pw "%DEST_PASSWORD%" -r "%TEMP_DIR%\*" %DEST_SERVER%:%DEST_PATH%

:: 如果上传成功,删除源服务器上的文件
if %ERRORLEVEL%==0 (
    plink -ssh -pw "%SRC_PASSWORD%" -batch %SRC_SERVER% "rm -rf %SRC_PATH%/*"
    echo 已成功删除源服务器上的文件
) else (
    echo 文件传输失败,未删除源服务器上的文件
)

:: 移动临时文件夹到带时间戳的目录
move "%TEMP_DIR%" "%TEMP_DIR%_%timestamp%"

echo 文件传输完成

将远程服务器文件夹同步到本地 Mac 将远程服务器文件同步到本地 Windows