您当前位置: 首页 »

脚本

分类目录归档: 脚本

打包修改过的文件的批处理,更新第2版

之前写过《打包修改过的文件的批处理》,现在这个批处理脚本已经过多次修改,增加了很多功能,新脚本代码如下:

@echo off
:: 网站更新文件打包程序
:: 作者: Mr.Lodar http://lodar.net/

:: 版本历史:
::
:: v2.4  2011年01月11日  随机临时目录
::                       防止多个批处理同时运行时产生冲突
:: v2.3  2011年01月11日  自动配置7-Zip安装目录
::                       自动检测7-Zip的安装目录,不需要再手工配置路径
:: v2.2  2010年12月03日  增加PATH环境变量设置
::                       在系统环境变量未加入7-Zip时不用复制程序文件到当前目录
:: v2.1  2010年11月16日  增加批打包支持 - 多个目录同时拖放并分别打包
::                       增加判断有修改的文件时才打包,不再生成空压缩包
:: v2.0  2010年11月16日  新增拖放打包支持 - 将目录拖放到脚本文件上自动打包
::                       (为了支持快速批打包,拖放模式只默认打包当天修改的文件)
:: v1.0  2010年06月某日  初始版本,实现了文件排除及默认值设置

:: 拖放到图标上执行的时候程序启动路径为用户目录
:: 如: "C:\Documents and Settings\User"
:: 这里把当前目录设置回批处理脚本所在目录
cd /d %~dp0

:: 检索7-Zip安装目录
for /f "tokens=2*" %%i in (
	'REG QUERY "HKLM\SOFTWARE\7-Zip" ^| find /i "Path"'
) do set "SevenZipPath=%%j"

:: 设置7-Zzip路径
SET PATH=%PATH%;%SevenZipPath%

:START
:: 设置临时目录:
set TEMP=temp_%random%

if not @%1@==@@ (
	set FROM=%~n1
) else (
	set /P FROM=源文件目录^(默认为www^):
	set /P TO=导出压缩包文件名^(默认为%FROM%-update-%date:~0,4%%date:~5,2%%date:~8,2%^):
	set /P DAY=修改时间^(m-d-y,默认为今天{%date:~5,5%-%date:~0,4%}^):
)

:: 设置变量默认值
if @%FROM%@==@@ set FROM=www
if @%TO%@==@@ set TO=%FROM%-update-%date:~0,4%%date:~5,2%%date:~8,2%
if @%DAY%@==@@ set DAY=%date:~5,5%-%date:~0,4%

:: 将要打包的文件复制到临时文件夹,将排除文件列表(excludelist.txt)中的文件排除在外
xcopy %FROM% %TEMP% /S /Y /I /D:%DAY% /EXCLUDE:excludelist.txt

IF EXIST %TEMP% (
	:: 使用7z命令行程序进行打包
	7z a -t7z %TO%.7z .\%TEMP%\*

	:: 删除临时文件
	rmdir /S /Q %TEMP%

	echo 文件已打包到 %TO%.7z
) else (
	echo %~n1 中没有需要打包的文件
)

:: 重置变量,防止默认值被设置为上次使用的值
set FROM=
set TO=
set DAY=
set TEMP=

:: 如果有更多目录要打包,则继续重新打包其它目录
if not @%2@==@@ shift && goto START

echo.

if @%1@==@@ (
	echo 打完收工! 按任意键退出...
	pause>nul
) else (
	echo 打完收工! 一会就退出...
	ping 127.0.0.1 -n 3 >nul
)

提示: 不要忘了 excludelist.txt 哦,参见之前的那篇文章《打包修改过的文件的批处理》。

打包修改过的文件的批处理

在没有进行版本管理的项目中,常常会因为忘记修改过哪些文件而把整个项目都覆盖一遍,既浪费网络带宽又浪费时间,每次覆盖都要在FTP上传好久,于是我就写了一个批处理脚本,将修改过的需要覆盖的文件打包成一个压缩包,代码如下:

@echo off
:: 网站更新文件打包程序

:: 设置临时目录:
set TEMP=temp

set /P FROM=源文件目录^(默认为www^):
if @%FROM%@==@@ set FROM=www

set /P TO=导出压缩包文件名^(默认为update-%date:~0,4%%date:~5,2%%date:~8,2%^):
if @%TO%@==@@ set TO=update-%date:~0,4%%date:~5,2%%date:~8,2%

set /P DAY=修改时间^(m-d-y,默认为今天{%date:~5,5%-%date:~0,4%}^):
if @%DAY%@==@@ set DAY=%date:~5,5%-%date:~0,4%

:: 将要打包的文件复制到临时文件夹,将排除文件列表(excludelist.txt)中的文件排除在外
xcopy %FROM% %temp% /S /Y /I /D:%DAY% /EXCLUDE:excludelist.txt

:: 使用7z命令行程序进行打包
7z a -t7z %TO%.7z .\%temp%\*

:: 删除临时文件
rmdir /S /Q %temp%

echo 文件已打包到 %TO%.7z
pause>nul

该批处理使用了7-zip的命令行压缩工具来打包,将7z.exe复制到当前目录即可
excludelist.txt 中包含了需要排除的文件列表,xcopy的帮助中是这样说明的:

指定含有字符串的文件列表。每一个字符串必须在文件的单独行中。如果有任何字符串与要被复制的文件的绝对路径相符,那个文件将不会得到复制。
例如,指定如 \obj\ 或 .obj 的字符串会排除目录 obj 下面的所有文件或带有 .obj 扩展名的文件。

清理冗余文件的批处理脚本

 在一个网站项目在本地做好经过测试准备上传到服务器时经常需要删除一些模版缓存文件和DW生成的_notes文件夹等,于是写了如下脚本进行批量处理,tpl_c为Smarty模版缓存目录,保存为clear.bat即可

@echo off
echo 正在清理 Smarty 缓存,请稍候...
for /D /R %%F in (tpl_c) do if exist %%F del /f /s /q %%F\*.*
echo Smarty 缓存清理完毕!
echo.
echo 正在清理 Dreamweaver 设计备注,请稍候...
for /D /R %%F in (_notes) do if exist %%F rmdir /s /q %%F
echo Dreamweaver 设计备注清理完毕!
echo.
echo 正在清理 Windows 图片缩略图缓存,请稍候...
rem 缩略图缓存一般具有隐藏和系统属性,先去除这些属性后再删除
for /R %%F in (Thumbs.db) do if exist %%F attrib -S -H %%F && del /f /q %%F
echo Windows 图片缩略图缓存清理完毕!

清除 tpl_c 目录下的所有文件,删除整个 _notes 目录以及删除所有 Windows 自动生成的图片缩略图缓存,请根据需要进行修改。

The damn “for” in batch file!

本来想在单个批处理文件里面实现类似下面的操作:

@echo off
SET num=0
FOR /D %%i IN (*) DO (
SET /a num=%num%+1
echo %num%.%%i
)
echo %num%
pause>nul

结果发现这个该死FOR里面居然不能改变%num%的值,查了下 FOR /? 说是要用CMD /v启动命令行,然后把%num%改成!num!,我本来的目的是直接双击这一个批处理就完成操作的,看来不能用批处理实现了,去除这个部分,结果就有些不完美了,转向研究VBS中,看看VBS脚本能不能比较完美地实现我想要完成的功能,没找到好点的脚本对象手册,MSDN网上查又太慢,比较郁闷的

Update(2010-06-01): 原来通过设置延迟环境变量扩展,把%num%改为!num!后可实现:

@echo off & setlocal enabledelayedexpansion
SET num=0
FOR /D %%i IN (*) DO (
SET /a num=!num!+1
echo !num!.%%i
)
echo %num%
pause>nul

参见:

  1. http://www.java3z.com/cwbwebhome/article/article9/973.html