在 Windows 7 上使用批处理脚本同步两个远程服务器间的文件
2024-09-02 tech windows 7 mins 2582 字
本文介绍一个批处理脚本在两个远程服务器之间同步文件,并且在操作过程中添加时间戳以便后续管理和审计。
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_SERVER
和 DEST_SERVER
分别是源服务器和目标服务器的地址,SRC_PATH
和 DEST_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 文件传输完成