备份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的意思是获取文件所在的目录。

其他似乎没什么好解释的了。

没有评论




Remember personal info?
Notify
Hide email
Small print: All html tags except <b> and <i> will be removed from your comment. You can make links by just typing the url or mail-address.
Design downloaded from free website templates.