标题: 这个备份和升级的批处理如何编写?
[打印本页]
作者: stonelei
时间: 2004-8-25 00:00
标题: 这个备份和升级的批处理如何编写?
首先感谢 Climbing 介绍我认识了这么一个好地方,以前都不知道还有DOS联盟的,老大们可别介意哦.现在关于DOS的知识越来越少啦,这地方可让我们温故知新哦.
闲话不说了,我想提个问题,这个问题我一直没能解决.
> --------------------------------------
> 1. 在C盘上创建一个目录叫TBLBAK,如果有就不创建.再在TBLBAK里面创建一个以日期
命名的目录(或者其他方式命名都可以)
> 2.复制 c:\faspic\tbl*.* 到 C:\tblbak\之前创建的目录\.
> 3.覆盖复制 a:\tbl*.* 到 c:\faspic\.
> 4.检测 c:\tblbak 目录下由本批处理创建的目录是否超过10个,如果超过,就把最早
期建立的删除,即保持最多并且是最后的10个目录.
> 5.一个批处理能否执行完以上的操作?当然临时创建的批处理可以忽略.
>
> ---------------------------------------------
1.难点有几点,一是如何创建一个以日期命令但能让DOS识别的目录名?即年份只能取后面几位,超过了,DOS就不认啦?
2.如果检测自己创建的那些目录中已经超过10个?或自定义的个数?
3.如何智能化地删除早期建立的那个目录,而始终保留10个?
4.除了临时创建的批处理外,如果让一个批处理来执行,可行性有多高?
5.小弟不才,还望各位老大们伸出你们的援手,帮帮我啦.
作者: Climbing
时间: 2004-8-25 00:00
首先告诉我们你这个批处理运行在什么操作系统下,是纯DOS环境还是9x/nt的dos提示符下?求教问题前,先写清楚你的环境。
作者: stonelei
时间: 2004-8-25 00:00
哦,谢谢啦,是纯DOS环境的.是DOS6.22版本.
作者: Climbing
时间: 2004-8-25 00:00
我没有DOS 6.22的环境了,不太好试验,建议你自己先把能写的写出来,然后我们再帮你解决你不能解决的问题。基本上都可以用批处理实现,当然要用到第三方的工具,尤其是Horst的PBAT批处理实用工具。
作者: stonelei
时间: 2004-8-25 00:00
但是根本编不到如果根据日期创建相应目录和检测目录下有多少目录和删除以前的目录呀?
作者: stonelei
时间: 2004-8-25 00:00
有高手知道吗?帮忙编一下吧,尤其是我说的几个难点,就是弄不懂。弄懂几个难点,我的问题早就解决了。
作者: Climbing
时间: 2004-8-26 00:00
你自己一点儿也不努力,让我感觉很失望。
Climbing为StoneLei所写的批处理文件(包括所有用到的工具程序,14KB,点击下载)下面是批处理的内容:
@echo off
:: StoneLei.BAT 为网友StoneLei下述目的所创建的批处理文件
:: 1. 在C盘上创建一个目录叫TBLBAK,如果有就不创建.再在TBLBAK里面创建一个以日期命名的目录(或者其他方式命名都可以)
:: 2. 复制 c:\faspic\tbl*.* 到 C:\tblbak\之前创建的目录
:: 3. 覆盖复制 a:\tbl*.* 到 c:\faspic
:: 4. 检测 c:\tblbak 目录下由本批处理创建的目录是否超过10个,如果超过,就把最早期建立的删除,即保持最多并且是最后的10个目录
::
:: 作者:Climbing(xclimbing@msn.com)
:: 版本:1.0
:: 创建日期:2004.08.26 12:15
:: 最后修改日期:2004.08.26 12:54
:: 本批处理是为MS-DOS 6.22环境设计的,程序运行中将用到Horst的nset, dready, lmod实用程序
:: 本批处理与天汇汉字系统并不兼容,建议你用ucdos汉字系统。cls:: 检测C:\tblbak目录是否存在,如果不存在则创建之
if not exist c:\tblbak\nul md c:\tblbak:: 使用Horst的nset命令取得以当前日期为名的环境变量curdir
set curdir=
echo. | date | nset /S- curdir=$5$6$7:: 检测要创建的以当前日期为名的目录是否存在,如果存在,则错误
if exist c:\tblbak\%curdir%\nul goto _error1:: 不存在则创建
md c:\tblbak\%curdir%:: 进行第一步的文件备份操作
if not exist c:\faspic\nul goto _error2
xcopy /e /y c:\faspic\tbl*.* c:\tblbak\%curdir% > nul:: 检测软驱是否准备好,如果准备好,进行文件的复制操作
:_chkflp
cls
echo 请将软盘放入软驱,准备好后按任意键继续...
pause > nul
dready a:
if errorlevel 2 goto _noflp
goto _cpflp
:_noflp
echo 错误:软驱没有准备好!
echo 请检查软盘是否正确,按任意键重试...
pause > nul
goto _chkflp:_cpflp
xcopy /e /y a:\tbl*.* c:\faspic > nul:: 开始检查以日期为目录名的目录是否超过10个,如果超过,则删除多余的
:: 注意,为了方便检测以日期为目录名的目录,默认所有以20打头的目录为以日期命名的目录
dir /ad/b/o-d c:\tblbak\20*.* | lmod /L11* @deltree /y c:\tblbak\[] ["> nul"] > temp.bat
call temp.bat
del temp.bat
goto _runok:_error1
echo 错误:c:\tblbak\%curdir% 目录已经存在!
goto _runerr:_error2
echo 错误:c:\faspic 目录不存在!
goto _runerr:_runerr
echo.
echo 抱歉,程序运行中发生错误。
echo 程序将退出。
goto _quit:_runok
echo 恭喜:程序运行成功完成!
goto _quit:_quit
set curdir=
作者: stonelei
时间: 2004-8-26 00:00
Climbing 大哥,你的热心帮助真的让我热泪盈眶.小弟在此向你说声"谢谢啦",并会听大哥的教诲,以后更加努力的工作与学习.谢谢啦.
作者: autoit
时间: 2004-8-27 00:00
石头兄待人可真让人钦佩啊!!!向Climbing致敬!
作者: willsort
时间: 2004-9-20 00:00
Re Climbing:
Climbing兄的程序已很完善,除了两个细节:
1,检验目录存在时使用if exist c:\directory\nul 的方法无法检测具有隐藏或系统属性的目录是否存在,导致在以后目录创建进程中出错。解决的办法,或者dir c:\directory /a | find "c:\directory" /i,或者attrib c:\directory | find "direcory" /i,然后再用if errorlevel 检测find返回的errorlevel即可。
2,我并不清楚nset如何解析以“-“分隔的日期串,但既然它用到了date命令的输出,就应该考虑到DOS6下date日期格式并非年月日的东方风格,而是月日年的美式风格,除非在config.sys中设置了country属性。所以,在检测目录数目的模块中应该存在问题,请酌情调整。
[此贴子已经被作者于2004-9-20 20:45:02编辑过]
作者: Climbing
时间: 2004-9-20 00:00
Re
Willsort:
Willsort兄真的是精益求精,说实在的,我可真的没有考虑这么细致。
1、如果真的有隐藏或者系统目录,我建议使用者先手工去掉这些属性(不去掉其实也不影响程序运行的)。一般情况下应该不会遇到这种问题。不过谢谢你告诉我这种方法不能用于隐藏或者系统属性的目录(我真的不太清楚)。另外,DOS 6.22下恐怕是没有find这个命令的,这也是一件麻烦事。
2、我上面写的批处理真的是找了一套DOS 6.22系统,然后在虚拟机中安装并调试的,在那个DOS 6.22系统中,Date命令真的显示成yyyy-mm-dd的形式(没有加什么country属性)。不过就算是显示成mm-dd-yyyy也没有关系,只要调整一个nset /S- curdir=$7$5$6就行了。
再次感谢Willsort兄的不吝赐教,其实,写这个程序只是应付差事,我这人一向是比较马虎的,能蒙混过关就行,嘿嘿。[em07]
[此贴子已经被作者于2004-9-20 21:17:19编辑过]
作者: willsort
时间: 2004-9-20 00:00
Re stonelei:
1,关于日期的获取,我在另一篇帖子里已做陈述,但是考虑到DOS6.22的DATE使用了四位数的年份值,再加上你不想丢失后两位数的要求,再补充一个方法,那就是可以截获DOS下文件的创建和修改日期,大体的代码如下:
echo if not [%%date%%]==[] goto end>getdate.bat
echo set date=%%3>>getdate.bat
dir getdate.bat | find "getdate bat" /i >>getdate.bat
echo :end>>getdate.bat
for %%c in (call del) do %%c getdate.bat
2,至于目录数目的判定,可以使用文件列表的变形来操作,主要是使用dir和find,大体代码如下:
dir c:\\directory /ad /od /b | find "-0" > datedir.lst
fc datedir.lst nul /n | find "11: ">delcall.bat
echo deltree %%1 /y >11.bat
for %%c in (call del) do %%c delcall.bat
for %%f in (11.bat datedir.lst) do del %%f
3,关于软盘测试,其实可以使用简单的debug脚本来调用dos int21功能实现,这样就可以避免引入第三方程序来解决问题,适合只具有标准DOS配置的环境的。但如果你的条件允许,且对第三方程序并不反感,则可以忽略此一细节。
4,自以上叙述,你应该可以明白这个批处理完全可以用一个文件来实现。事实上,任何多个批处理能够实现的问题都可以通过单个批处理来实现,但是有时出于设计原则的考虑,需要分化出几个模块。
另外,以上的代码部分只是一种基于经验上的脱机设计,并未在DOS6环境中实际测试,你可以根据自己的需要和出现的问题,随时进行调整,并不具有任何形式的版权。
Re Climbing:
刚刚见到你的回复,故在编辑此贴时顺便回复。
find.exe 是从DOS5就被打包一同安装的管道专用外部命令,同样的命令还有fc.exe和more.exe,你的DOS6.22也许不太完整。另外,edlin和debug也属于比较常用的管道命令,可惜edlin在dos6以后被取消,导致批处理对文本串的控制能力大为削弱,但是它在nt系列中却始终存在。
日期格式问题,曾经是我在使用DOS6时很头疼的一个问题,因为不同的country设置,日期格式相差很大,对我的某些批处理程序的通用性带来很大的挑战。你机器上的表现,可能是虚拟机虚拟不彻底的原因,也可能是dos6从不同版本的bios中取日期得到结果不同,或者你的dos6.22并未使用原始配置。
[
Last edited by willsort on 2005-10-13 at 10:29 ]
作者: Climbing
时间: 2004-9-20 00:00
再次感慨学海无涯。
作者: jlb007
时间: 2004-9-23 00:00
我对批处理一点也不明白 那里的汉字用写在里面吗?
作者: superking
时间: 2010-3-16 23:38
很好,受教了,但为什么会和天汇汉字不兼容?