最近无聊开始研究一种很古老的在dos下无处不在的好东西——批处理程序。其实也不能算是一种程序,只是将DOS命令写在一个后缀名为.bat(2k/xp中也可以用.cmd)的文件,可以将预先写入的dos命令一起执行,当时是个超级有用的好东东,可以把很多需要一起来执行的命令简化成一条,还有很多意想不到的功能。不过随着windows这种图形界面的东西出现后,批处理就实在没什么优势了,因为使用起来太不方便,每次用的时候都进入dos界面来运行,任何参数得在dos里跟在程序名后输入,所以很不方便,以至于现在几乎没人用,怀着化废为宝的原则,我开始了对于批处理的研究。最近才猛然发觉,在windows下,批处理又有它所发挥的余地,而且它有了很多新的优势是其他编程语言没法比较的。
1.编写工具:无论是写字扳,word,甚至notepad也可以编写,而且不需要编译,改个后缀名直接就能用了
2.编写简单:因为所有的代码都只是windows内带的命令,没有严格的语法要求,适合像我这种电脑初学者使用,一本dos书就够用了。
3.功能强大;注册表,文件,服务几乎windows的各个方面都可以用批处理来操作;没有做不到,只有想不到!
4.在2k/xp中可以将批处理可交互的界面,不需要进入dos界面费力的输入命令参数,在windows中打开直接就能用了
恩,大概以上的种种优势已经够让人心动了,那么今天先来讲点基本的。
首先教大家学批处理的好方法,在cmd中输入 “命令/?”可以显示这条命令的详细使用方法。例如:输入“copy/?”我们可以得知以下内容:
将一份或多份文件复制到另一个位置。
COPY [/D] [/V] [/N] [/Y | /-Y] [/Z] [/A | /B ] source [/A | /B]
[+ source [/A | /B] [+ ...]] [destination [/A | /B]]
source 指定要复制的文件。
/A 表示一个 ASCII 文本文件。
/B 表示一个二进位文件。
/D 允许解密要创建的目标文件
destination 为新文件指定目录和/或文件名。
/V 验证新文件写入是否正确。
/N 复制带有非 8dot3 名称的文件时,
尽可能使用短文件名。
/Y 不使用确认是否要改写现有目标文件
的提示。
/-Y 使用确认是否要改写现有目标文件
的提示。
/Z 用可重新启动模式复制已联网的文件。
命令行开关 /Y 可以在 COPYCMD 环境变量中预先设定。
这可能会被命令行上的 /-Y 替代。除非 COPY
命令是在一个批文件脚本中执行的,默认值应为
在改写时进行提示。
要附加文件,请为目标指定一个文件,为源指定
数个文件(用通配符或 file1+file2+file3 格式)。
呵呵,很详细吧。恩,先介绍点dos下基础的东西。
首先给个原代码先(很基础的,一个可以修改本机网站地址和静态ip地址的绑定):
@echo off
color 0b
setlocal
title HostsHack v1.0
rem Written by Kakashi
rem Feb 16th, 2006
echo ===================================================
echo HostsHack v1.1
echo.
echo.
echo 注:修改hosts文件可以达到屏蔽某些网站的功能
echo 版权没有,欢迎盗版!
echo ===================================================
echo.
:start
echo 现在开始分析%systemroot%\system32\drivers\etc下系统原有hosts文件.......
echo 你现在拥有的ip绑定有:
echo.
echo *********************************************************
more +18 < %systemroot%\system32\drivers\etc\hosts
echo *********************************************************
echo.
echo.
echo ====准备加入新的ip绑定======
:startweb
echo 请输入新的网站地址:
set /p website=
if {%website%}=={} goto startweb
:startip
echo 请输入绑定的ip:
set /p ip=
if {%ip%}=={} goto startip
echo 开始写入hosts文件..............
echo %ip% %website% >>%systemroot%\system32\drivers\etc\hosts
echo 完成!
ping 127.0.0.1 -n 3 >nul
cls
goto start
好了,是不是看得有点头晕呢,不怕,慢慢来,一行一行解释:
@echo off 这句的意思是将echo关闭,也就是让批处理什么都不显示,而前加个"@"符号表示连echo off这句命令也不显示,一开始就关闭批处理的显示有很多好处:一方面可以让程序美观简洁,二来可以控制程序显示数据,把需要的数据用命令显示在桌面上让用户能看到,不至于被满屏幕的东西吓倒。
color 这条命令是用来控制批处理的美观的,格式如下:
color bf (b是背景颜色,f是前台(字体)颜色)
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 a = 淡绿色
3 = 浅绿色 b = 淡浅绿色
4 = 红色 c = 淡红色
5 = 紫色 d = 淡紫色
大家可以根据自己的喜好修改(本人推荐: color 0b)
title:这条命令的作用就是修改标题栏的文字,美观而已。
使用格式 title “任何你喜欢的文字”
rem:表示解释说明,以rem 开头的这一行都算作解释,不会被程序执行。
echo “文字”:负责显示数据,比方说"@echo 你好"这条命令运行后屏幕上就会出现“你好”二字。而"echo."表示输出一个回车,也就是空一行。
开始进入重点了:
:start 这个命令表示建立一个名字为start的跳转点,前面的冒号说明这个start是个跳转点,以后程序只要用个goto start程序就跳回来了。
下面这里大家跳过几行,能看到这样一句代码“echo 现在开始分析 %systemroot%\system32\drivers\etc下系统原有hosts文件.......”
%systemroot%表示的是一个名字为systemroot变量,它所带的值就是windows系统目录的路径,这是个系统变量,大家可以在cmd中输入set查询所有变量。
好接着看了
more +18 < %systemroot%\system32\drivers\etc\hosts :这段代码比较复杂,首先"<"这个符号表示重定向,将最后的那个hosts文件交给more这个命令来处理,然后more+18表示将hosts这个文件从第18行开始显示,就是略过前18行的内容(那些内容大家可以自己去看,是windows的说明内容)
开始进入交互部分了:这段代码当作公式来记忆:
set /p website=
if {%website%}=={} goto startweb
set /p website= :表示将用户的输入来作为website的值,而交互部分必须要检测用户输入的值是不是不存在,否则程序要错误,所以要是错误的话返回程序重新输入
最后个重点是将用户输入两个值,再加入到文件后面">>"表示追加,“>”表示重新写,会删除原来的内容,然后echo 两个变量显示到屏幕上,现在加个重定向到文件,就追加到原来的文件咯,最后那个ping 127.0.0.1 -n 3就是表示要延时3秒,加个>nul,nul表示没有,重定向到没有就是不显示的意思咯。
终于把程序的大致内容讲了一遍,有兴趣的话,大家可以自己来学习一下,看不懂的朋友可以直接将程序代码复制下来,写成bat文件自己先看看。大家也可以发挥想象自己来写点东西分享下,我也乐意将自己的新作品分享个大家。
DIY爱好者--好工具自己做之批处理的极限应用(2)
昨天的那个批处理只是大致介绍了一些批处理的基本运用:@echo off, 重定向等等只是点,可能刚开始看有点累,多看多实践就好了。推荐一个学习方法:将部分关键代码删除,看看程序会出现什么错误,然后就能比较快地理解程序运行的原理。好了今天就先给出一个新的代码(比较头大的,我也整了好久了,才憋出这个程序,做梦的时候都在想,但还是可能会有点问题,所以这只是个测试版本,大家如果发先程序有问题的话请跟贴告诉我,这个测试2版本是我目前为止未发现BUG的版本,但没办法保证有什么我没想到的问题,所以欢迎大家指出^^)
注意:下面的测试版本可能无法在英文版的xp上运行,我的测试环境:简体中文xp+sp2环境下测试通过!不过由于程序的工作原理涉及windows的bug,所以我不能保证能100%能使用,不过我电脑是属于主流配置,而且补丁也打得很勤快,所以我想大多数用户还是能够使用的,如果有不能用的话,请告诉我你的电脑的配置情况。
==========================代码开始=================================
@echo off
rem Written by heroest
rem Feb 17th,2006
setlocal
color 0b
echo ========================================================
echo.
echo Windows文件保护专家 测试版2
echo.
echo.
echo 说明:本程序可以有效的保护重要的文件不被删除或泄露。
echo 版权没有,欢迎盗版!
echo =========================================================
:start
echo.
echo 建立文件保护文件夹 c:\FileLocker
if not exist c:\FileLocker..\nul md c:\FileLocker..\
echo 欢迎使用windwos保护专家 v1.0,请选择选项(1,2,3,q);
echo 1.读取加密的文档
echo 2.存储保密文档
echo 3.建立秘密存储文档
echo q.推出
set /p choice=
if {%choice%}=={} goto start
if /i %choice%==1 goto djm
if /i %choice%==2 goto cjm
if /i %choice%==3 goto jjm
if /i %choice%==q goto quit
goto start
rem========================加入秘密文件夹==========================
:jjm
echo.
echo 请输入密码:
set /p pass2c=
if {%pass2c%}=={} goto jjm
echo 开始根据密码建立保密文件夹......
md "c:\FileLocker..\%pass2c%..\"
echo 成功建立了保护文件夹!
echo.
goto start
rem=======================“加入”部分结束=========================
rem
rem======================存储数据部分==============================
:cjm
echo.
echo 请输入密码:
set /p pass=
if {%pass%}=={} goto cjm
if exist c:\FileLocker..\%pass%..\nul goto noerror
echo 发生错误,未发现已建立加密保护文件夹!
goto start
:noerror
md "%userprofile%\桌面\Ready2Lock"
echo 请将你需要保护的文件复制到桌面上的Ready2Lock文件夹内(被保存的文件不能含有文件夹)
echo 将文件放入Ready2Lock后按任意键开始保护文件.......
pause > nul
echo 开始保护到C:\FileLocker文件夹内.........
copy "%userprofile%\桌面\Ready2Lock\*.*" "c:\FileLocker..\%pass%..\"
echo 保护完成,删除原文件........
del "%userprofile%\桌面\Ready2Lock\*.*"
rd "%userprofile%\桌面\Ready2Lock"
echo 所有保护完成!
ping 127.0.0.1 -n 3 >nul
cls
goto start
rem ==========================存储部分结束=======================
rem
rem===========================读取数据部分=======================
:djm
echo.
echo 请输入密码:
set /p pass2=
if {%pass2%}=={} goto djm
if not exist c:\FileLocker..\%pass2%..\nul echo 发生错误或不存在保护文档 & goto djm
echo 开始读取被保护的数据.......
md "%userprofile%\桌面\Unlocked"
copy "c:\FileLocker..\%pass2%..\*.*" "%userprofile%\桌面\Unlocked"
echo 已经解密到桌面上的Unlocked文件夹内.........
ping 127.0.0.1 -n 3 >nul
goto start
rem ========================结束=============================
rem =========================退出============================
:quit
echo 感谢使用Windows文件保护专家 v1.0!
echo 按任意键退出本程序.
pause > nul
exit
===========================代码结束=============================
好了,现在穿插点小内容,有关这个程序的思路:大家都知道"\"这个符号在windows中是用来表示路径的分隔符,如:"c:\windows"就表示c盘下的windows文件夹。那么大家想过没有,如果一个文件夹的名字里包含这个符号,那会怎么样呢?系统会出错,所以在windows下建立的文件夹是没办法带有"\",但是在CMD里用MD命令建立文件夹是没任何限制的,所以假设我们想在c盘下建立个特殊的文件夹,比方说:md c:\windows..\注意得在"\"前加两个".",回到windows中,会发现c盘里有个显示名字为"windows."的文件夹,但是打开之后却会跳入c:\windows的系统目录里(如果windows不存在的话,电脑就会显示没办法找到文件夹)。所以我们的文件放这里面是最安全的。但是我们该怎么放进去呢?还得回到dos下,使用copy命令复制进去: “copy c:\test.txt c:\windows..\”就完成了。但是随之又有个问题,别人只要用一个"copy c:\windows..\*.* c:\"就可以把这个文件夹内的东西都复制出来了。所以我们的程序为了防止这一点,根据用户输入的密码在这个特殊文件夹内再建立个文件夹,文件夹的名字就是根据用户的密码所生成的,所以偷窃者想偷文件的话除非知道这个根据用户密码所生成的特殊文件夹的名字才能使用copy命令复制出来,否则dir,del,move等命令都是没办法威胁到被保护的文件。唯一能威胁到文件的方法,目前为止我能想到的也只有格式化硬盘了(只是我个人意见,也许还有别的方法我不知道,所以如果大家发现别的方法请务必告诉我,我好改进程序性能)
好了,大家都知道基本原理了,现在开始对程序的代码进行分析。
开头的一些什么title,color等命令昨天已经说过了,今天就不重复了,如果不会的朋友可以查看本系列的第一篇文章。
好了先出现第一句新命令是if 开头的那一句,if exist.......do.....表示一旦存在某个文件(要有详细路径),do表示任意一个命令,if还有很多用法,想了解的朋友大家可以在dos输入"if/?"查询所有用法,这一句是判断是否存在FileLocker..\这个特殊文件夹,但是if exist只判断文件的存在否,不判断文件夹,所以我们在FileLocker..\这个文件夹后加个nul,就能让if exist这个命令来判断是否存在文件夹了。后面接着的代码就是昨天说的能获取用户输入的代码。然后今天又加了点代码是对用户输入的不同数据进行判断来进行不同的动作,就是使用goto命令跳到每个动作的代码。“if /i a===b ”这是if命令的另一个用法:对于数据的判断,当满足2个数据一样时执行一条dos命令。进入动作的代码了,首先是加入文件夹这个动作,原理其实很简单:获取用户输入的密码,将密码的数据当作秘密文件夹的名字,然后为了安全起见,我在FileLocker..\这个文件夹里又根据用户密码建立了个特殊文件夹,就是密码后面加上"..\"再次建立特殊文件夹,彻底保护文件。
“文件夹建立”这个动作完成后来到“存储数据这个部分”,首先得先判断用户的密码对不对,判断的方法就是检测是否存在那个根据密码建立的文件夹,如果不存在也就说明密码不对,得重新输入。而后密码通过验证后就是将数据复制的过程,为了方便起见,我让程序在用户的桌面上建立了个名为Ready2Lock的临时文件夹,方便用户将需要保存的文件放入,但是鄙人天生比较愚笨,就是没办法将一个文件夹整个保护到特殊文件夹内,用户在往Ready2Lock里放文件的时候注意别将文件夹也放进去。然后用户放完之后按任意键后,程序自动开始保护文件,然后会删除桌面上的源文件,做完这一切,整个保护就完成了。最后进入读取数据部分,还是得先判断用户的密码,如果密码正确,程序才能正确地取出文件,否则就会失败。然后为了方便用户,程序在桌面上建立个名为Unlock的文件夹,解密出来的文件就会放在这里。呵呵,整个程序的代码就过了一遍了,大家是不是喜欢上了批处理了,^^
最后说点东西;本系列批处理的教程将分为3部分,分别为初级,中级和综合,所以下次的教程的程序将会十分庞大,可以透露点,下次的程序是自己用批处理写的windows优化大师(不知道是不是涉及版权问题^^),不过工作量相当的大,我现在目前还处于寻找资料和研究windows优化大师的工作原理过程中,所以估计得过一个相当长的时间才能推出最终内容,希望大家能够谅解。不过以后的时间我会时不时地提供些小程序,有可能就是windows优化大师的部分功能测试代码,希望大家能够喜欢,并帮忙测试,我在此先谢过了。
DIY爱好者-Windows文件保护专家 v1.0正式版
在发布正式版之前,先说几句:
首先感谢帮助我最大的朋友“猜猜鸟”,感谢你提供了很有用处的方法,现在终于可以完善这个工具。还有感谢“江山”提供了不少参考意见和信息,没有他们的帮助也就没有这个工具的今天。最后感谢那些一直支持我的朋友们,没有你们的支持,小弟也不敢拿出自己的作品也大家分享,谢谢支持^^
@echo off
rem Written by heroest
rem Feb 17th,2006
setlocal
color 0b
echo ===============================================================
echo.
echo Windows文件保护专家 v1.0
echo.
echo.
echo 说明:本程序可以有效的保护重要的文件不被删除或泄露。
echo 加入了删除文档的代码,可以删除那些被保护的文档
echo 版权没有,欢迎盗版!
echo ===============================================================
:start
echo.
echo 建立文件保护文件夹 c:\FileLocker
if not exist c:\FileLocker..\nul md c:\FileLocker..\
echo 欢迎使用windwos保护专家 v1.0,请选择选项(1,2,3,4,5,q);
echo 1.读取加密的文档
echo 2.存储保密文档
echo 3.建立秘密存储文档
echo 4.删除保密文档
echo 5.删除FileLocker
echo q.推出
echo.
set /p choice=
if {%choice%}=={} goto start
if /i %choice%==1 goto djm
if /i %choice%==2 goto cjm
if /i %choice%==3 goto jjm
if /i %choice%==4 goto sjm
if /i %choice%==5 goto df
if /i %choice%==q goto quit
goto start
rem========================加入秘密文件夹==========================
:jjm
echo.
echo 准备建立秘密文件夹...
echo 请输入密码:
set /p pass2c=
if {%pass2c%}=={} goto jjm
echo 开始根据密码建立保密文件夹......
md "c:\FileLocker..\%pass2c%..\"
echo 建立了保护文件夹!
echo.
goto start
rem ======================“加入”部分结束=========================
rem
rem =====================存储数据部分==============================
:cjm
echo.
echo 准备存储保密档案...
echo 请输入密码:
set /p pass=
if {%pass%}=={} goto cjm
if exist c:\FileLocker..\%pass%..\nul goto noerror
echo 发生错误,未发现建立加密保护文件夹!
goto start
:noerror
md "%userprofile%\桌面\Ready2Lock"
echo 请将你需要保护的文件复制到桌面上的Ready2Lock文件夹内(被保存的文件不能含有文件夹)
echo 注意:开始保护后会删除原文件!
echo 按任意键开始保护文件.......
pause > nul
echo 开始保护到C:\FileLocker文件夹内.........
copy "%userprofile%\桌面\Ready2Lock\*.*" "c:\FileLocker..\%pass%..\"
echo 保护完成,删除原文件........
del "%userprofile%\桌面\Ready2Lock\*.*" /Q
rd "%userprofile%\桌面\Ready2Lock"
echo 所有保护完成!
ping 127.0.0.1 -n 3 >nul
cls
goto start
rem ==========================存储部分结束=======================
rem
rem ===========================读取数据部分======================
:djm
echo.
echo 准备读取保密文件...
echo 请输入密码:
set /p pass2=
if {%pass2%}=={} goto djm
if not exist c:\FileLocker..\%pass2%..\nul echo 发生错误或不存在保护文档 & goto djm
echo 开始读取被保护的数据.......
if not exist "%userprofile%\桌面\Unlocked\nul" md "%userprofile%\桌面\Unlocked"
copy "c:\FileLocker..\%pass2%..\*.*" "%userprofile%\桌面\Unlocked"
echo 已经解密到桌面上的Unlocked文件夹内.........
ping 127.0.0.1 -n 3 >nul
goto start
rem ========================读取数据部分结束=======================
rem
rem ========================删除目录部分===========================
rem 此部分特别感谢"猜猜鸟"教会了我新的知识,谢谢了!
rem 感谢"江山"的提供了宝贵的意见
rem 也感谢支持我的朋友们,没有你们的鼓励,小弟也不敢斗胆发表自己的作品
:sjm
echo.
echo.
echo 准备删除秘密文档.......
echo 请输入密码:
set /p pass2del=
if {%pass2del%}=={} goto sjm
echo 开始删除被保护文件夹
rmdir /s "c:\FileLocker..\%pass2del%..\" /Q
echo 已经删除被保护文件.......
goto start
rem ============================删除部分结束======================
rem
rem ===================Del FileLocker==============================
:df
echo.
echo 请删除之前确认FileLocker里面没有任何秘密文档.(y/n)
set /p yesorno=
if /i %yesorno%==y goto start2del
if /i %yesorno%==n goto sjm
goto df
:start2del
echo 开始删除FileLocker..........
rd "c:\FileLocker..\" >nul
if exist c:\FileLocker..\nul echo **删除失败,可能FileLocker里有别的秘密文档。**& goto fail
echo 成功删除!
:fail
ping 127.0.0.1 -n 3 >nul
goto start
rem ================Del Filelocker End====================
:quit
echo 感谢使用Windows文件保护专家 v1.0!
echo 按任意键退出本程序.
pause > nul
exit