备份BAT脚本
2010年07月05日 11:50
有个需求:Windows服务器上有一堆的LOG文件,需要定期清理掉一些之前的文件,将他们归档到指定目录(归档时保持原先的目录结构)。
用Shell其实挺简单的,不过Windows服务器上不能用,而且服务器原则上也不能安装第三方的软件。所以只能通过BAT实现了。
本来认为这是一个不可能的任务,但是后来一查资料,原来Windows还提供了一个不错的工具:forfiles,可以查找指定日期之前之后的文件,并针对这些文件执行一个命令。这个命令可以满足我的需求。
这个命令是Windows 2003以上的服务器版本自带的,XP没有。如果需要的话,可以去下载一份2003的版本,直接可用。
但是forfiles执行命令的时候有个问题,就是他会将当前目录设定为扫描到的文件所在的目录,这一点在实现我的需求的时候,造成了一些麻烦。不过最后我还是写出了这个批处理,现在贴出来希望给需要的人一些帮助。
archive.bat
@echo off
rem 注意,以下所有涉及路径的变量,均必须为绝对路径,不能为相对路径。
rem 在这个批处理的同目录下必须存在do.bat,用于实际的文件处理
rem ====================================
rem 配置设定
rem ====================================
rem 扫描的源文件夹。此程序对目标文件夹是递归扫描的。
set SRC_PATH=f:\temp\test\src
rem 目标文件夹。需要归档的文件将存放在这个文件夹里。
rem 注意该文件夹必须为绝对路径
set DEST_PATH=f:\temp\test\dest
rem -- 归档几天前的文件
set DAYS=5
rem ==============================================
rem 实际程序开始
rem ==============================================
rem 实际处理文件的批处理程序
set DO_BATCH=%~p0\do.bat
forfiles /P %SRC_PATH% /S /D -%DAYS% /C "cmd /c %DO_BATCH% @isdir @relpath @path %DEST_PATH%"
do.bat
@echo off
rem 参数:%1=isdir %2=relpath %3=fullpath %4=dest_path
rem 注意:%2是相对路径
set ISDIR=%1
set RELPATH=%~2
set FULLPATH=%~3
set DEST_ROOT=%~4
set DEST_PATH="%DEST_ROOT%%~p2"
set DEST_FILE="%DEST_ROOT%%RELPATH%"
rem 创建必需的目标目录
if %ISDIR%==TRUE mkdir "%DEST_FILE%"
if not EXIST "%DEST_PATH%" mkdir "%DEST_PATH%"
rem 复制文件到目标目录
if %ISDIR%==FALSE copy "%FULLPATH%" "%DEST_FILE%"
rem 删除源文件(如果源文件是目录则不删除)
if %ISDIR%==FALSE del "%FULLPATH%"
其中 %~2中~的意思是消除对应字符串的分号("),比如原先%2的值是"c:\program files",%~2的值就是 c:\program files
%~p2的~p的意思是获取文件所在的目录。
其他似乎没什么好解释的了。
没有评论
