DOS批处理高级教程(还不错)(转)
阅读原文时间:2021年04月21日阅读:1

前言

目录

   第二节 常用特殊符号
     1、@  命令行回显屏蔽符
     2、%  批处理变量引导符
     3、>   输出重定向符
     4、>>  输出重定向符
     5、<、>&、<& 重定向符
     6、|  命令管道符
     7、^  转义字符
     8、&  组合命令(顺序执行)
     9、&& 组合命令(前面指令成功,才执行后面指令)
     10、||  组合命令(前面指令失败,才执行后面指令)
     11、""  字符串界定符
     12、, 逗号
     13、; 分号
     14、() 括号
     15、! 感叹号
     16、批处理中可能会见到的其它特殊标记符: (略)
         CR(0D) 命令行结束符 
         Escape(1B) ANSI转义字符引导符 
         Space(20) 常用的参数界定符 
         Tab(09) ; = 不常用的参数界定符 
         + COPY命令文件连接符 
         * ? 文件通配符 
         / 参数开关引导符 
         : 批处理标签引导符

第三章 FOR命令中的变量
    一、 ~I          - 删除任何引号("),扩展 %I
    二、 %~fI        - 将 %I 扩展到一个完全合格的路径名
    三、 %~dI        - 仅将 %I 扩展到一个驱动器号
    四、 %~pI        - 仅将 %I 扩展到一个路径
    五、 %~nI        - 仅将 %I 扩展到一个文件名
    六、 %~xI        - 仅将 %I 扩展到一个文件扩展名
    七、 %~sI        - 扩展的路径只含有短名
    八、 %~aI        - 将 %I 扩展到文件的文件属性
    九、 %~tI        - 将 %I 扩展到文件的日期/时间
    十、 %~zI        - 将 %I 扩展到文件的大小
    十一、 %~$PATH:I

第五章 set命令详解
    一、用set命令设置自定义变量
    二、用set命令进行简单计算
    三、用set命令进行字符串处理
        1、字符串替换
        2、字符串截取

第七章 DOS编程高级技巧
    一、交互界面设计
    二、if…else…条件语句
    三、循环语句
    四、子程序
    五、用ftp命令实现自动下载
    六、用7-ZIP实现命令行压缩和解压功能
    七、调用VBScript程序
    八、将批处理转化为可执行文件
    九、时间延迟
       1、利用ping命令延时
       2、利用for命令延时
       3、利用vbs延迟函数,精确度毫秒,误差1000毫秒内
       4、仅用批处理命令实现任意时间延迟,精确度10毫秒,误差50毫秒内
    十、模拟进度条
    十一、特殊字符的输入及应用
    十二、随机数(%random%)的应用技巧
    十三、变量嵌套 与 命令嵌套
    十四、文件内容筛选(type和findstr命令结合使用)

    全文:http://xiangkg.blog.163.com
    1、更正了所有的错别字,适当排版,增加条理性。
    2、运行改善所有例子,并纠正了一些语法错误。
    3、补充了一些不完全的地方。
    4、第一章参考了网上许多教程汇编而成。
    5、20080229补充了变量延迟的问题。
    6、20080305修改了参数usebackq的说明
    7、20080310增加了特殊字符的输入及应用
    8、20080311修改了子程序部分
    9、20080313修改了echo说明,归纳了9个应用方法
    10、20080320增加任意时间延迟方法
    11、20080321增加了set计算中十进制与八进制混淆问题的说明
    12、20080325修正dos数值计算范围:-2147483648至2147483647,即-2^31~2^31-1
    13、20080326增加随机数的应用
    14、20080327修改了“if增强用法”中的defined语句说明
    15、20080402增加变量嵌套与命令嵌套,重要技巧之一。

批处理定义:顾名思义,批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD。这些命令统称批处理命令。

了解了大概意思后,我们正式开始学习.先看一个简单的例子!

把上面的3条命令保存为文件test.bat或者test.cmd然后执行,
他就会在屏幕上显示以下二行话:

这就是一个简单批处理文件了,这个批处理文件一共就用了2条命令 "echo" 和"pause" 还有一个特殊符号"@"

(以下内容来源网络,请各位仔细阅读,好进入下节的实例说明)

介绍命令

REM为注释命令,一般用来给程序加上注解,该命令后的内容不被执行,但能回显。

    ①任何以冒号:开头的字符行, 在批处理中都被视作标号, 而直接忽略其后的所有内容。而标号分为有效和无效两种。
    有效标号:冒号后紧跟一个以字母数字开头的字符串,goto语句可以识别。
    无效标号:冒号后紧跟一个非字母数字的一个特殊符号,goto无法识别的标号。

    ②与rem 不同的是, ::后的字符行在执行时不会回显, 无论是否用echo on打开命令行回显状态, 因为命令解释器不认为他是一个有效的命令行, 就此点来看, rem 在某些场合下将比 :: 更为适用; 另外, rem 可以用于 config.sys 文件中。

2、ECHO 和 @

echo命令的作用列举如下:

    如果想关闭“ECHO OFF”命令行自身的显示,则需要在该命令行前加上“@”。

(3)输出提示信息

    上述是ECHO命令常见的三种用法,也是大家熟悉和会用的,但作为DOS命令淘金者你还应该知道下面的技巧:

(5)输出空行,即相当于输入一个回车

    值得注意的是命令行中的“.”要紧跟在ECHO后面中间不能有空格,否则“.”将被当作提示信息输出到屏幕。另外“.”可以用,:;”/[\]+等任一符号替代。

(6)答复命令中的提问

上述格式可以用于简化一些需要人机对话的命令(如:CHKDSK/F;FORMAT Drive:;del *.*)的操作,它是通过DOS管道命令把ECHO命令输出的预置答复语作为人机对话命令的输入。下面的例子就相当于在调用的命令出现人机对话时输入“Y”回车:

     C:>ECHO Y|DEL A :*.*

格式:ECHO 文件内容>文件名
      ECHO 文件内容>>文件名

(8)向打印机输出打印内容或打印控制码

      ECHO 打印内容>PRN

下面的例子是向M-1724打印机输入打印控制码。<Alt>156是按住Alt键在小键盘键入156,类似情况依此类推:

C:>ECHO PRN">+155@>PRN(输入初始化命令ESC@)

(9)使喇叭鸣响

“^G”是在dos窗口中用Ctrl+G或Alt+007输入,输入多个^G可以产生多声鸣响。使用方法是直接将其加入批处理文件中或做成批处理文件调用。
这里的“^G”属于特殊符号的使用,请看本文后面的章节

   PAUSE,玩游戏的人都知道,暂停的意思
   在这里就是停止系统命令的执行并显示下面的内容。

运行显示:
请按任意键继续. . .

4、errorlevel  程序返回码

5、title 设置cmd窗口的标题
设置cmd窗口的标题,批处理编程常用。
title 新标题        #可以看到cmd窗口的标题栏变了

COLOR [attr]

颜色属性由两个十六进制数字指定 -- 第一个为背景,第二个则为
前景。每个数字可以为以下任何值之一:

如果没有给定任何参数,该命令会将颜色还原到 CMD.EXE 启动时
的颜色。这个值来自当前控制台窗口、/T 开关或
DefaultColor 注册表值。

例如: "COLOR fc" 在亮白色上产生亮红色

配置系统设备。

设备状态:             MODE [device] [/STATUS]

选定代码页:   MODE CON[:] CP SELECT=yyy

显示模式:       MODE CON[:] [COLS=c] [LINES=n]

例:设置dos窗口和颜色
mode con cols=113 lines=15 & color 9f
此命令设置DOS窗口大小:15行,113列

标签的名字可以随便起,但是最好是有意义的字符串啦,前加个冒号用来表示这个字符串是标签,goto命令就是根据这个冒号(:)来寻找下一步跳到到那里。最好有一些说明这样你别人看起来才会理解你的意图啊。

休息一下
----------------------------
遭遇失事的外星人
----------------------------
来无影去无踪的UFO困扰了人类很长时间。可现在人们发现,功能特异的外星人也会有失事的时候。前苏联科学家杜朗诺克博士曾透露,1987年11月,一支前苏联沙漠考察队在沙漠里发现了一个直径22.87米的碟状飞行器。飞碟引擎保持完好,里面有14具已经风干成木乃伊的外星人遗体。1947年7月6日夜,美国新墨西哥州小镇罗兹维尔附近风雨大作,电闪雷鸣。第二天天睛后,人们发现了一个圆形的东西躺在草丛里。驻扎在附近的空军迅速赶来,封锁了现场。负责人马赛尔上尉详细地检查了该物体的状况。它直径足有10米,分为内、外两个舱。令他大吃一惊的是,舱内的座椅上竟然有4具类人生物的尸体。它们身高仅有1米左右,皮肤白而细腻,头很大,鼻子很长,嘴很小。手上只有4个指头,指间有蹼相连。它们身穿黑色有金属光泽的外套,但是质地很柔软。这一发现震惊了军方,五角大楼立即下令封锁消息,但消息灵通的记者已经将此新闻发布了出去。许多当地人都证实确实有飞碟在罗兹维尔附近坠毁。
————选自《世界未解之谜》

FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ …]]

  [drive:][path]filename
            指定要搜索的文件。

Find常和type命令结合使用
Type [drive:][path]filename | find "string" [>tmpfile] #挑选包含string的行
Type [drive:][path]filename | find /v "string"   #剔除文件中包含string的行
Type [drive:][path]filename | find /c   #显示文件行数 
以上用法将去除find命令自带的提示语(文件名提示)

例:
@echo off
echo 111 >test.txt
echo 222 >>test.txt
find "111" test.txt
pause
运行显示如下:

pause
运行显示如下:
111
请按任意键继续. . .

学习久了,容易瞌睡,清醒清醒,请看:
----------------------------
月球上有轰炸机吗
----------------------------
1987年3月,前苏联的一颗人造卫星拍摄到的月球照片上,出现了一架第二次世界大战时期的英国轰炸机。这架飞机机身和机翼上有明显的英国空军标志,飞机有些地方已被陨石损坏,但机体完整,机身上布满青苔。它停放在月球的火山口上。照片清晰,令人不容置疑。消息传出后,立即成为轰动世界的头号新闻。但是,正当科学家们紧锣密鼓地展开研究时,1988年7月22日,负责观察的人报告说:这架轰炸机失踪,在原来的地方没有发现它的影子。轰炸机的突然出现,又忽然间消失得无影无踪,引起了科学家们的种种猜测。有人开始怀疑前苏联人造卫星拍到的照片上根本没有什么轰炸机,但是拿来照片重新细看,它明明清清楚楚地呈现在人们面前,到底是不是真事?那么现在它又在哪里?这给本来就很神秘的这架轰炸机又增添了更为神秘的色彩。
————选自《世界未解之谜》

批处理中调用外部程序的命令(该外部程序在新窗口中运行,批处理程序继续往下执行,不理会外部程序的运行状况),如果直接运行外部程序则必须等外部程序完成后才继续执行剩下的指令

11、assoc 和 ftype
文件关联,不常用。
assoc 设置'文件扩展名'关联,关联到'文件类型'
ftype 设置'文件类型'关联,关联到'执行程序和参数'
当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开
而是先判断.txt属于 txtfile '文件类型'
再调用 txtfile 关联的命令行 txtfile=%SystemRoot%\system32\NOTEPAD.EXE %1
可以在"文件夹选项"→"文件类型"里修改这2种关联
assoc           #显示所有'文件扩展名'关联
assoc .txt      #显示.txt代表的'文件类型',结果显示 .txt=txtfile
assoc .doc      #显示.doc代表的'文件类型',结果显示 .doc=Word.Document.8
assoc .exe      #显示.exe代表的'文件类型',结果显示 .exe=exefile
ftype           #显示所有'文件类型'关联
ftype exefile   #显示exefile类型关联的命令行,结果显示 exefile="%1" %* 
assoc .txt=Word.Document.8
设置.txt为word类型的文档,可以看到.txt文件的图标都变了
assoc .txt=txtfile
恢复.txt的正确关联
 
ftype exefile="%1" %*
恢复 exefile 的正确关联
如果该关联已经被破坏,可以运行 command.com ,再输入这条命令

PUSHD [path | ..] 保存当前目录,然后切换到另一个指定的目录path。
popd  将当前目录恢复为pushd命令保存的目录

CALL命令可以在批处理执行过程中调用另一个批处理,当另一个批处理执行完后,再继续执行原来的批处理

CALL [drive:][path]filename [batch-parameters]
调用的其它批处理程序。filename 参数必须具有 .bat 或 .cmd 扩展名。

另外,批脚本文本参数参照(%0、%1、等等)已如下改变:

     批参数(%n)的替代已被增强。您可以使用以下语法:(看不明白的直接运行后面的例子)

         %~f1        - 将 %1 扩充到一个完全合格的路径名
         %~d1        - 仅将 %1 扩充到一个驱动器号
         %~p1        - 仅将 %1 扩充到一个路径
         %~n1        - 仅将 %1 扩充到一个文件名
         %~x1        - 仅将 %1 扩充到一个文件扩展名
         %~s1        - 扩充的路径指含有短名
         %~a1        - 将 %1 扩充到文件属性
         %~t1        - 将 %1 扩充到文件的日期/时间
         %~z1        - 将 %1 扩充到文件的大小
         %~$PATH : 1 - 查找列在 PATH 环境变量的目录,并将 %1
                       扩充到找到的第一个完全合格的名称。如果环境
                       变量名未被定义,或者没有找到文件,此组合键会
                       扩充到空字符串

        %~dp1       - 只将 %1 扩展到驱动器号和路径
        %~nx1       - 只将 %1 扩展到文件名和扩展名
        %~dp$PATH:1 - 在列在 PATH 环境变量中的目录里查找 %1,
                       并扩展到找到的第一个文件的驱动器号和路径。
        %~ftza1     - 将 %1 扩展到类似 DIR 的输出行。

要理解上面的知识,下面的例子很关键。

例:
set aa=123456
set cmdstr=echo %aa%
echo %cmdstr%
call %cmdstr%
pause
本例中如果不用call,而直接运行%cmdstr%,将显示结果%aa%,而不是123456

SHIFT [/n]

    SHIFT /2

————选自《世界未解之谜》

IF 条件判断语句,语法格式如下:

下面逐一介绍,更详细的分析请看后面章节。

例:
@echo off
dir c:
rem退出代码为>=1就跳至标题1处执行,>=0就跳至标题0处执行
IF ERRORLEVEL 1 goto 1
IF ERRORLEVEL 0 goto 0
Rem 上面的两行不可交换位置,否则失败了也显示成功。
:0
echo 命令执行成功!
Rem 程序执行完毕跳至标题exit处退出
goto exit
:1
echo 命令执行失败!
Rem 程序执行完毕跳至标题exit处退出
goto exit
:exit
pause
运行显示:命令执行成功!

检测当前变量的值做出判断,为了防止字符串中含有空格,可用以下格式
if [NOT] {string1}=={string2} command
if [NOT] [string1]==[string2] command
if [NOT] "string1"=="string2" command

echo off
IF EXIST autoexec.bat echo 文件存在!
IF not EXIST autoexec.bat echo 文件不存在!

16、setlocal 与 变量延迟

要想进阶,变量延迟是必过的一关!所以这一部分希望你能认真看。

让我们先了解一下批处理运行命令的机制:

而为了能够及时感知环境变量的动态变化,批处理设计了变量延迟。简单来说,在读取了一条完整的语句之后,不立即对该行的变量赋值,而会在某个单条语句执行之前再进行赋值,也就是说“延迟”了对变量的赋值。

例2:
 @echo off
 setlocal enabledelayedexpansion
 set a=4
 set a=5 & echo !a!
 pause 
结果:5
解说:启动了变量延迟,得到了正确答案。变量延迟的启动语句是“setlocal enabledelayedexpansion”,并且变量要用一对叹号“!!”括起来(注意要用英文的叹号),否则就没有变量延迟的效果。

再举一个例子巩固一下。
例3:
 @echo off
 setlocal enabledelayedexpansion
 for /l %%i in (1,1,5) do (
 set a=%%i
 echo !a!
 )
 pause

提示:在没有开启变量延迟的情况下,某条命令行中的变量改变,必须到下一条命令才能体现。这一点也可以加以利用,看例子。

@echo off
::交换两个变量的值,但是不使用临时变量
set var1=abc
set var2=123
echo 交换前: var1=%var1% var2=%var2%
set var1=%var2%& set var2=%var1%
echo 交换后: var1=%var1% var2=%var2%
pause

交换前: var1=abc var2=123
交换后: var1=123 var2=abc
请按任意键继续. . .

  优点:

  缺点:

17、ATTRIB  显示或更改文件属性

  +   设置属性。
  -    清除属性。
  R   只读文件属性。
  A   存档文件属性。
  S   系统文件属性。
  H   隐藏文件属性。
  [drive:][path][filename]
      指定要处理的文件属性。
  /S  处理当前文件夹及其子文件夹中的匹配文件。
  /D  也处理文件夹。

find命令不能处理文件中超过1024个字符的数据行,此时可用findstr命令。

  /B        在一行的开始配对模式。
  /E        在一行的结尾配对模式。
  /L        按字使用搜索字符串。
  /R        将搜索字符串作为一般表达式使用。
  /S        在当前目录和所有子目录中搜索
              匹配文件。
  /I         指定搜索不分大小写。
  /X        打印完全匹配的行。
  /V        只打印不包含匹配的行。
  /N        在匹配的每行前打印行数。
  /M        如果文件含有匹配项,只打印其文件名。
  /O        在每个匹配行前打印字符偏移量。
  /P        忽略有不可打印字符的文件。
  /OFF[LINE] 不跳过带有脱机属性集的文件。
  /A:attr   指定有十六进位数字的颜色属性。请见 "color /?"
  /F:file   从指定文件读文件列表 (/ 代表控制台)。
  /C:string 使用指定字符串作为文字搜索字符串。
  /G:file   从指定的文件获得搜索字符串。 (/ 代表控制台)。
  /D:dir    查找以分号为分隔符的目录列表
  strings   要查找的文字。
  [drive:][path]filename
            指定要查找的文件。

"hello there"。

有关 FINDSTR 常见表达法的详细情况,请见联机命令参考。

19、date /t 和 time /t

time /t 直接显示当前时间,可用来提取或显示时间。

    1、@  命令行回显屏蔽符
    2、%  批处理变量引导符
    3、>   输出重定向符
    4、>>  输出重定向符
    5、<、>&、<& 重定向符
    6、|  命令管道符
    7、^  转义字符
    8、&  组合命令(顺序执行)
    9、&& 组合命令(前面指令成功,才执行后面指令)
    10、||  组合命令(前面指令失败,才执行后面指令)
    11、""  字符串界定符
    12、, 逗号
    13、; 分号
    14、() 括号
    15、! 感叹号
    16、批处理中可能会见到的其它特殊标记符: (略)
        CR(0D) 命令行结束符 
        Escape(1B) ANSI转义字符引导符 
        Space(20) 常用的参数界定符 
        Tab(09) ; = 不常用的参数界定符 
        + COPY命令文件连接符 
        * ? 文件通配符 
        / 参数开关引导符 
        : 批处理标签引导符

1、@  命令行回显屏蔽符

这个百分号严格来说是算不上命令的,它只是批处理中的参数而已(多个%一起使用的情况除外,以后还将详细介绍)。
引用变量用%var%,调用程序外部参数用%1至%9等等
%0  %1  %2  %3  %4  %5  %6  %7  %8  %9  %*为命令行传递给批处理的参数
%0 批处理文件本身,包括完整的路径和扩展名
%1 第一个参数
%9 第九个参数
%* 从第一个参数开始的所有参数
参数%0具有特殊的功能,可以调用批处理自身,以达到批处理本身循环的目的,也可以复制和删除文件自身等等。

小技巧:添加行内注释
%注释内容%(可以用作行内注释,不能出现重定向符号和管道符号)
为什么这样呢?此时“注释内容”其实被当作变量,其值是空的,故只起注释作用,不过这种用法容易出现语法错误,一般不用。

比如:
使用命令:echo hello >1.txt将建立文件1.txt,内容为”hello “(注意行尾有一空格)
使用命令:echo hello>1.txt将建立文件1.txt,内容为”hello“(注意行尾没有空格)

4、>>  输出重定向符
输出重定向命令
这个符号的作用和>有点类似,但他们的区别是>>是传递并在文件的末尾追加,而>是覆盖

同样拿1.txt做例子

这时候1.txt 内容如下:
hello
world

5、<、>&、<& 重定向符

<,输入重定向命令,从文件中读入命令输入,而不是从键盘中读入。 @echo off echo 2005-05-01>temp.txt
set /p today=<temp.txt
echo %today%
del temp.txt
pause
运行显示:
2005-05-01
请按任意键继续. . .

常用句柄:0、1、2,未定义句柄:3—9
1>nul 表示禁止输出正确的信息
2>nul 表示禁止输出错误信息。
其中的1与2都是代表某个数据流输入输出的地址(NT CMD 称之为句柄,MSDOS称之为设备)。

我们已经知道读取文本中的内容可以用for命令,但如果只需要读取第一行用for命令就有点麻烦。简单的办法如下:
 @echo off
 set /p str=<%0
 echo %str%
 pause
运行显示批处理文件自身的第一行:@echo off

----------------------------
行踪诡秘的球状闪电
----------------------------
球状闪电是一种非常奇特的现象。一般闪电都是呈枝条状,球状闪电则呈圆球状;一般闪电只能存在百分之几秒,最多不超过几秒,而球状闪电却能存在好几分钟;一般闪电有固定的路径,球状闪电却能像幽灵般的四处飘荡,游移不定。它到底是怎么形成的呢?科学界对此尚无定论。球状闪电的颜色各种各样,有的橘红,有的淡红,有的闪着蓝白色的光,有的冒着紫色的火星。它们的行踪十分诡秘。1984年,一架前苏联运输机与球状闪电在空中相遇,它竟然能穿透金属机身来到机舱内,并分裂成两个半圆形,最后两个半圆又合而为一,消失在空气中。
————选自《世界未解之谜》

6、|  命令管道符

例如:

以上命令是:查找C:\所有,并发现TXT字符串。
FIND的功能请用 FIND /? 自行查看

echo y|format a: /s /q /v:system

从而达到自动输入y的目的

^是对特殊符号<,>,&的前导字符,在命令中他将以上3个符号的特殊功能去掉,仅仅只把他们当成符号而不使用他们的特殊意义。

echo test ^>1.txt

他没有追加在1.txt里,呵呵。只是显示了出来

不用多说,自己试一下就明白了。

语法:第一条命令 & 第二条命令 [& 第三条命令…]
&、&&、||为组合命令,顾名思义,就是可以把多个命令组合起来当一个命令来执行。这在批处理脚本里是允许的,而且用的非常广泛。因为批处理认行不认命令数目。

dir z:\ & dir y:\ & dir c:\

9、&& 组合命令(前面指令成功,才执行后面指令)
语法:第一条命令 && 第二条命令 [&& 第三条命令…]

dir z:\ && dir y:\ && dir c:\

语法:第一条命令 || 第二条命令 [|| 第三条命令…]

提示:组合命令和重定向命令一起使用必须注意优先级
管道命令的优先级高于重定向命令,重定向命令的优先级高于组合命令

这样执行后a.txt里只有D盘的信息!为什么?因为组合命令的优先级没有重定向命令的优先级高!所以这句在执行时将本行分成这两部分:dir c:\和dir d:\ > a.txt,而并不是如你想的这两部分:dir c:\ && dir d:\和> a.txt。要使用组合命令&&达到题目的要求,必须得这么写:

这样,依据优先级高低,DOS将把这句话分成以下两部分:dir c:\ > a.txt和dir d:\ >> a.txt。例十八中的几句的差别比较特殊,值得好好研究体会一下。

dir c:\ > a.txt & dir d:\ >> a.txt

11、""  字符串界定符

cd "program files"
cd progra~1
cd pro*

12、, 逗号

比如
dir,c:\

13、; 分号

比如:
dir c:\;d:\;e:\;z:\

例:dir c:\;d:\;e:\1.txt
以上命令相当于
dir c:\
dir d:\
dir e:\1.txt
其中文件e:\1.txt不存在,但e盘存在,有错误提示,但命令仍会执行。

就说这些了!各位有什么意见请回贴!有什么疑问请到BAT交流区发贴!下一节改进!

14、() 括号

讲FOR之前呢,咋先告诉各位新手朋友,如果你有什么命令不懂,直接在CMD下面输入:
name /? 这样的格式来看系统给出的帮助文件,比如for /? 就会把FOR命令的帮助全部显示出来!当然许多菜鸟都看不懂…. 所以才会有那么多批处理文章! 俺也照顾菜鸟,把FOR命令用我自己的方式说明下!

FOR %%variable IN (set) DO command [command-parameters]

如果 Set (也就是我上面写的 "相关文件或命令") 包含通配符(* 和 ?),将对与 Set 相匹配的每个目录(而不是指定目录中的文件组)执行指定的 Command。

@echo off
for /d %%i in (c:\*) do echo %%i
pause

在来一个,比如我们要把当前路径下文件夹的名字只有1-3个字母的打出来
@echo off
for /d %%i in (???) do echo %%i
pause
这样的话如果你当前目录下有目录名字只有1-3个字母的,就会显示出来,没有就不显示了

知道作用了,给大家个思考题目!

FOR /R [[drive:]path] %%variable IN (set) DO command [command-parameters]

递归

*****************************请注意2点:

@echo off
for /r c:\ %%i in (*.exe) do echo %%i
pause

例:
@echo off
for /r %%i in (*.exe) do echo %%i
pause
参数不一样了吧!这个命令前面没加那个C:\也就是搜索路径,这样他就会以当前目录为搜索路径,比如你这个BAT你把他放在d:\test目录下执行,那么他就会把D:\test目录和他下面的子目录的全部EXE文件列出来!!!

为了只列举boot.ini存在的目录,可改成下面这样:
@echo off
for /r c:\ %%i in (boot.ini) do if exist %%i echo %%i
pause
用这条命令搜索文件真不错。。。。。。

FOR /L %%variable IN (start,step,end) DO command [command-parameters]

使用迭代变量设置起始值 (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)。语法是:

@echo off
for /l %%i in (1,1,5) do @echo %%i
pause
保存执行看效果,他会打印从1 2 3 4 5  这样5个数字
(1,1,5)这个参数也就是表示从1开始每次加1直到5终止!

看完这个被我赋予破坏性质的参数后,我们来看最后一个参数

----------------------------
三叶虫化石
----------------------------
1968年,一个三叶虫化石的收藏家在犹他州旅行时,发现了让他惊喜不已的三叶虫化石。我们知道,三叶虫是一种生存在5亿年前的小生物。可他回家后,竟在这个化石上看见了人类的脚印,那是一个穿着凉鞋的脚印,不偏不倚正好踩在三叶虫上。它不会是人为的恶作剧吧?开始也有人是这么想的,但是如果要制作这些脚印并把它们刻在石头上,再埋在深深的土层里,还要做到不留痕迹,这似乎完全没有可能。而且就在这之后,又先后有人在同一地区发现了类似的多处脚印,要伪造这么多脚印且都做到人不知鬼不觉是不可能的,可惜的是人们依然无法确定这些鞋印是怎么回事。按照达尔文进化论,在遥远的5亿年前,连人类的近亲猩猩、猴子都没有,谁会穿着凉鞋在这一带溜达呢?
————选自《世界未解之谜》

\迭代及文件解析
使用文件解析来处理命令输出、字符串及文件内容。使用迭代变量定义要检查的内容或字符串,并使用各种options选项进一步修改解析方式。使用options令牌选项指定哪些令牌应该作为迭代变量传递。请注意:在没有使用令牌选项时,/F 将只检查第一个令牌。
文件解析过程包括读取输出、字符串或文件内容,将其分成独立的文本行以及再将每行解析成零个或更多个令牌。然后通过设置为令牌的迭代变量值,调用 for 循环。默认情况下,/F 传递每个文件每一行的第一个空白分隔符号。跳过空行。

    带引号的字符串"options"包括一个或多个
    指定不同解析选项的关键字。这些关键字为:

        usebackq        - 使用后引号(键盘上数字1左面的那个键`)。

                            单引号表示执行命令,即'command'

                          当文件路径或名称中有空格时,就可以用双引号括起来
                            单引号表示字符串,即'string'
                            后引号表示命令执行,即`command`

以上是用for /?命令获得的帮助信息,直接复制过来的。
晕惨了!我这就举个例子帮助大家来理解这些参数!

Pause
Del test.txt

11段 13段 14段 15段 16段
21段 23段 24段,25段,26段
31段 33段 34段-35段-36段
请按任意键继续. . .

For命令例2:****************************************
@echo off
FOR /F "eol= delims=" %%i in (test.txt) do echo %%i
Pause

For命令例3:****************************************

@echo off
FOR /F "delims=" %%i in ('net user') do @echo %%i
pause

基本上讲完了FOR的基本用法了…如果你看过FOR的系统帮助,你会发现他下面还有一些特定义的变量,这些我先不讲.大家因该都累了吧!你不累我累啊….

FOR命令中有一些变量,他们的用法许多新手朋友还不太了解,今天给大家讲解他们的用法!

     %~fI        - 将 %I 扩展到一个完全合格的路径名
     %~dI        - 仅将 %I 扩展到一个驱动器号
     %~pI        - 仅将 %I 扩展到一个路径
     %~nI        - 仅将 %I 扩展到一个文件名
     %~xI        - 仅将 %I 扩展到一个文件扩展名
     %~sI        - 扩展的路径只含有短名
     %~aI        - 将 %I 扩展到文件的文件属性
     %~tI        - 将 %I 扩展到文件的日期/时间
     %~zI        - 将 %I 扩展到文件的大小
     %~$PATH:I   - 查找列在路径环境变量的目录,并将 %I 扩展
                   到找到的第一个完全合格的名称。如果环境变量名
                   未被定义,或者没有找到文件,此组合键会扩展到
                   空字符串

好开始讲解:

一、 ~I          - 删除任何引号("),扩展 %I

可建立个BAT文件代码如下:

echo 3333^">>temp.txt
echo "4444"44>>temp.txt
echo ^"55"55"55>>temp.txt
rem 上面建立临时文件,注意不成对的引号要加转义字符^,重定向符号前不要留空格
FOR /F "delims=" %%i IN (temp.txt) DO echo  %%~i
pause
del temp.txt
执行后,我们看CMD的回显如下:
1111           #字符串前的引号被删除了
2222           #字符串首尾的引号都被删除了
3333"          #字符串前无引号,后面的引号保留
4444"44        #字符串前面的引号删除了,而中间的引号保留
55"55"55       #字符串前面的引号删除了,而中间的引号保留
请按任意键继续. . .

龙卷风补充:无头不删,有头连尾删。

二、 %~fI        - 将 %I 扩展到一个完全合格的路径名

执行后显示内容如下
C:\Documents and Settings\Administrator\桌面\test.bat
C:\Documents and Settings\Administrator\桌面\test.vbs
当我把代码中的 %%~fi直接改成%%i
FOR /F "delims==" %%i IN ('dir /b') DO @echo  %%i
pause

通过对比,我们很容易就看出没有路径了,这就是"将 %I 扩展到一个完全合格的路径名"的作用
也就是如果%i变量的内容是一个文件名的话,他就会把这个文件所在的绝对路径打印出来,而不只单单打印一个文件名,自己动手动实验下就知道了!

三、 %~dI        - 仅将 %I 扩展到一个驱动器号

这个用法和上面一样,他只打印路径不打印文件名字
FOR /F "delims==" %%i IN ('dir /b') DO @echo  %%~pi
pause

pause

六、 %~xI        - 仅将 %I 扩展到一个文件扩展名
只打印文件的扩展名
FOR /F "delims==" %%i IN ('dir /b') DO @echo  %%~xi
pause

七、 %~sI        - 扩展的路径只含有短名
打印绝对短文件名
FOR /F "delims==" %%i IN ('dir /b') DO @echo  %%~si
pause

八、 %~aI        - 将 %I 扩展到文件的文件属性
打印文件的属性
FOR /F "delims==" %%i IN ('dir /b') DO @echo  %%~ai
pause

九、 %~tI        - 将 %I 扩展到文件的日期/时间
打印文件建立的日期
FOR /F "delims==" %%i IN ('dir /b') DO @echo  %%~ti
pause

pause
上面例子中的"delims=="可以改为"delims=",即不要分隔符

十一、 %~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩展
                   到找到的第一个完全合格的名称。如果环境变量名
                   未被定义,或者没有找到文件,此组合键会扩展到
                   空字符串
这是最后一个,和上面那些都不一样,我单独说说!

龙卷风补充:上面代码显示结果为C:\WINDOWS\system32\notepad.exe

好了,FOR的的变量就介绍到这了!
                                  BY  伤脑筋

【原文】

  宇(yǔ) 宙(zhòu) 洪(hóng) 荒(huāng) 。

  辰(chén) 宿(xiù) 列(liè) 张(zhāng) 。

  (2)宇宙:时空的总合。宇,上下四方无限广大的空间。宙,古往今来无限久远的时间。出自于《淮南子》:上下四方叫作宇,古往今来叫作宙。

  (4)盈:充满,此指月圆。月亮盈亏的变化,阴历每月十五日是满月,又称望月、盈月;三十日月尽,没有月光。

  (6)辰宿:星辰。辰:星体的总称。宿:星群、星座。单颗星体称星,一颗以上称宿。

  【译文参考】

  经过很长的一段时间后,天地之间慢慢澄清了,这时可以看到太阳、月亮很有规律的在天空中运行着,日出日落,月圆月缺。在无边无际的天空中布满了大大小小的星星。

第四章 批处理中的变量

我们现在来详解这两个变量!

他们的值由系统将其根据事先定义的条件自动赋值,也就是这些变量系统已经给他们定义了值,
不需要我们来给他赋值,我们只需要调用而以!  我把他们全部列出来!

date 命令的详细信息,请参阅 Date。
%ERRORLEVEL%  系统 返回上一条命令的错误代码。通常用非零值表示错误。
%HOMEDRIVE%  系统 返回连接到用户主目录的本地工作站驱动器号。基于主目录值而设置。用

%HOMESHARE%  系统 返回用户的共享主目录的网络路径。基于主目录值而设置。用户主目录是

Itanium
%PROCESSOR_IDENTFIER% 系统 返回处理器说明。
%PROCESSOR_LEVEL%  系统 返回计算机上安装的处理器的型号。
%PROCESSOR_REVISION% 系统 返回处理器的版本号。
%PROMPT% 本地 返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。
%RANDOM% 系统 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。
%SYSTEMDRIVE% 系统 返回包含 Windows server operating system 根目录(即系统根目录)

有些应用程序需要 TEMP,而其他应用程序则需要 TMP。
%TIME% 系统 返回当前时间。使用与 time /t 命令相同的格式。由 Cmd.exe 生成。有关

这么多系统变量,我们如何知道他的值是什么呢?
在CMD里输入  echo %WINDIR%
这样就能显示一个变量的值了!

copy d:\1.bat "%USERPROFILE%\「开始」菜单\程序\启动\"

另外还有一些系统变量,他们是代表一个意思,或者一个操作!

%0 这个有点特殊,有几层意思,先讲%1-%9的意思.

反回批处理参数?到底怎么个返回法?

@echo off
echo %1 %2 %3 %4
echo %1
echo %2
echo %3
echo %4

注意中间的空格,我们会看到这样的结果:

对比下代码,%1就是”我是第一个参数”  %2就是”我是第二个参数”
怎么样理解了吧!

例子
@echo off
echo %*

可以看到他一次把全部参数都显示出来了

%0  这个不是返回参数的值了,他有两层意思!

例子:
@echo off
echo %0
pause

他把当前批处理执行的所在路经打印出来了,这就是返回批处理所在绝对路径的意思

例子:
@echo off
net user
%0

以上就是批处理中的一些系统变量,另外还有一些变量,他们也表示一些功能,
FOR命令中的那些就是,FOR变量已经说过,就不讲了.

故名思意,自定义变量就是由我们来给他赋予值的变量

@echo off
set var=我是值
echo %var%
pause

如果我们想让用户手工输入变量的值,而不是在代码里指定,可以用用set命令的/p参数

@echo off
set /p var=请输入变量的值
echo %var%
pause

好了批处理的变量先介绍到这,关于set命令,下次再写个专门的文章吧.
                                                   by 伤脑筋

----------------------------
临死时人会见到什么?
----------------------------
由于医学的日渐发达,越来越多的病人有了“起死复生”的经历。他们从生命的虚无尽头走出来,重新投向洒满阳光的人世间,再次见到熟悉的亲人朋友,感慨自然很多。但在这些感慨中,有一些是他们临死时的亲见亲闻。我们尚且不要怀疑其真实性有多大,先来听听又何妨呢?毕竟他们对这些见闻有着深切的体验和真实的回忆。科学家对这个命题也极感兴趣,他们访问了很多有过“死亡经历”的人,将其见闻总结起来,进行归纳与分析,试图破解人类死亡之谜。统计数字中,大多数人都提到临死时有一种分外安详和放松的感觉。他们的意识好像飘离了身体,在一片虚无缥缈中升腾,然后会通过一个完全的暗夜,直到看见黎明的曙光,在黑与白之间他们会做一些选择与挣扎,只有最后留恋光明的人才会重新回到人间。有些人还会在临死时看见自己所有的亲朋好友,包括那些已经过世的。他们个个都像天使一样形象光辉高大;有人在这时候还能把自己生前的事迹再经历一遍,就像在看一场电影……
————选自《世界未解之谜》

第五章 set命令详解

在上一贴中我简单的介绍了一下SET设置自定义变量的作用,现在我来具体讲一下set的其他功能.

一、用set命令设置自定义变量

注意:以下用法将清除变量variable的值,使其变成未定义状态。
SET variable=
上面等号后面无任何符号,如果写成SET variable="",此时变量值并不为空,而是等于两个引号,即""

请看 set var=我是值 ,这就是BAT直接在批处理中设置变量的方法!
set 是命令   var是变量名  =号右边的"我是值"是变量的值
在批处理中我们要引用这个变就把var变量名用两个%(百分号)扩起来,如%var%

例子:
@echo off
set /p var=请输入变量的值:
echo 您输入了 %var%  ~_~
pause

运行后,我们在提示语后面直接输入1,就会显示一行您输入了 1 ~_~

使用set /?查看SET的帮助我们发现SET除了我上面讲的
SET [variable=[string]]
SET /P variable=[promptString]
这两种语法外,还有如下几种语法:
SET /A expression
环境变量替换已如下增强:
%PATH:str1=str2%
%PATH:~10,5%
%PATH:~-10%
%PATH:~0,-2%

二、用set命令进行简单计算

如果 SET /A 在命令脚本外的命令行执行的,那么它显示该表达式的最后值。
除十六进制有 0x 前缀, 八进制有 0 前缀的,数字值为十进位数字。
因此, 0x12 与 18 和 022相同。请注意八进制公式可能很容易搞混:
 08 和 09 是无效的数字,因为 8 和 9 不是有效的八进制位数。

注意:一般的运算常为十进制运算,如果数字字符串最左边为0,将被认为是八进制,从而出错。比如,0812之类的数字不能参与十进制运算,转换方法为:10812-10000

例:
  @echo off
  set /p input=请输入计算表达式:
  set /a var=%input%
  echo 计算结果:%input%=%var%
  pause

请输入计算表达式:1+9+20+30-10
计算结果:1+9+20+30-10=50
请按任意键继续. . .

请输入计算表达式:-100+62  #负数
计算结果:-100+62=-38
请按任意键继续. . .

请输入计算表达式:(25+75)*2/(15+5)   #括号
计算结果:(25+75)*2/(15+5)=10
请按任意键继续. . .

注意:上面的计算过程显示,DOS计算只能精确到32位,这个32位是指二进制32位,其中最高位为符号位(0为正,1为负),低位31位为数值。31个1换成十进制为2147483647,所以DOS计算的有效值范围是-2147483648至2147483647,超出该数值范围时计算出错,请看下面的计算过程:

请输入计算表达式:2147483647+1    #最大值加1,出错,结果为最小值
计算结果:2147483647+1=-2147483648
请按任意键继续. . .

运行set /a a=1+1,b=2+1,c=3+1后会显示一个4,但我们用
echo %a% %b% %c%后看结果,会发现其他数学运算也有效果!,这就是表达式分隔符"逗"号的
作用!

有时候我们需要直接在原变量进行加减操作就可以用这种语法
set /a var+=1  这样的语法对应原始语法就是set /a var = %var% + 1
都是一样的结果,在原变量的值上在进行数学运算,不过这样写简单一点
再来一个:
set /a var*=2
其他都这么用,只要帮助里有这个语法!

另外还有一些用逻辑或取余操作符,这些符号,按照上面的使用方法会报错的

为什么?对于这样的"逻辑或取余操作符",我们需要把他们用双引号引起来,也可以用转义字符^,看例子

set /a var= 1 "+" 1 异运算
set /a var= 1 "%" 1  取模运算
set /a var= 3 "<<" 2 左移位运算, 3的二进制为11,左移2位为1100,换成十进制就是12,自行验证 set /a var= 4 ">>" 2右移位运算,4的二进制为100,右移动2位为1,结果为1

思考题:求2的n次方
参考答案:
@echo off
set /p n=请输入2的几次方: 
set /a num=1^<^<n
echo %num%
pause

请输入2的几次方: 10
1024
请按任意键继续. . .

休息一下!

1、字符串替换

运行显示:(龙卷风添加)
替换前的值: " bbs. verybat. cn"
替换后的值: "bbs.verybat.cn"

比如我们把上面的例子改成这样
@echo off
set a=bbs.verybat.cn
echo 替换前的值: "%a%"
set var=%a:.=伤脑筋%
echo 替换后的值: "%var%"
pause

替换后的值: "bbs伤脑筋verybat伤脑筋cn"

"伤脑筋"为替换后的值!
执行后就会把变量%a%里面的"."全部替换为"伤脑筋"
这就是set的替换字符的很好的功能! 替换功能先讲到这,下面将字符串截取功能

2、字符串截取

%PATH:~10,5%  这个什么意思,看例子:

执行后,我们会发现只显示了"bs"两个字母,我们的变量%a%的值不是为bbs.verybat.cn吗?
怎么只显示了第2个字母和第3个字母"bs",分析一结果我们就可以很容易看出
%a:~10,5%就是显示变量a里从11位(偏移量10)开始的5个字符!
分析set var=%a:~1,2%
  set是命令,var是变量值,a要进行字符操作的变量,"1"从变量"a"第几位开始显示,"2"表示显示几位。
合起来就是把变量a的值从第2位(偏移量1)开始,把2个字符赋予给变量var
这样应该明白了吧~

%PATH:~-10% 看例子

当然我们也可以改成这样
截取功能例子3:
@echo off
set a=bbs.verybat.cn
set var=%a:~3%
echo %var%
pause
运行显示:.verybat.cn
这个就是把变量a的从第3位开始后面全部的值给变量VAR

截取功能例子4:
@echo off
set a=bbs.verybat.cn
set var=%a:~0,-3%
echo %var%
pause
执行后,我们发现显示的是"bbs.verybat",少了".cn"
从结果分析,很容易分析出,这是把变量a的值从0位开始,
到倒数第三位之间的值全部赋予给var

截取功能例子5:
@echo off
set a=bbs.verybat.cn
set var=%a:~2,-3%
echo %var%
pause
运行显示:s.verybat
那么他就是显示从第3位(偏移量2)开始减去倒数三位字符的值,并赋予给变量var

**********************************************
所以,截取功能统一语法格式为:%a:~[m[,n]]%
**********************************************
方括号表示可选,%a%为变量名,不可少,冒号用于分隔变量名和说明部分,符号~可以简单理解为“偏移”即可,m为偏移量(缺省为0),n为截取长度(缺省为全部)
上面所述用法其实相当于vbs函数mid、left、right
%a:~0,n%  相当于函数left(a,n)  取左边n位
%a:~-m%  相当于函数right(a,m) 取右边m位
%a:~m,n% 相当于函数mid(a,m+1,n) 从m+1位开始取n位
%a:~m,-n% 相当于函数mid(a,m+1,len(a)-m-n),从m+1位开始,至倒数n+1位
%a:~m %  相当于函数mid(a,m+1,len(a)-m) 或者right(a,len(a)-m),从m+1位开始取右边全部。

@echo off
set /p str=请输入任意长度的字符串:
echo 你输入了字符串:"%str%"
call :stringlenth "%str%" num
echo 字符串长度为:%num%
pause
exit

好了set的一些用法,就介绍到这了,希望对各位有所帮助,时间不早睡觉Zz….

休息休息!

  混沌未分天地乱,茫茫渺渺无人见。  
  自从盘古破鸿蒙,开辟从兹清浊辨。  
  覆载群生仰至仁,发明万物皆成善。  
  欲知造化会元功,须看西游释厄传。  

第六章 if命令讲解

现在开始:

IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command

  ERRORLEVEL number 如果最后运行的程序返回一个等于或大于
                    指定数字的退出编码,指定条件为 true。

  EXIST filename    如果指定的文件名存在,指定条件为 true。

ELSE 子句必须在 IF 之后出现在同一行上。例如:

这个用法的基本做用是判断上一条命令执行结果的代码,以决定下一个步骤.
一般上一条命令的执行结果代码只有两结果,"成功"用0表示  "失败"用1表示.

这是个简单判断上条命令是否执行成功.
细心的朋友可能会发现,这个用法和帮助里的用法不太一样,按照帮助里的写法"IF %ERRORLEVEL% == 0 echo net user 执行成功了!  "这一句代码应该写成:IF ERRORLEVEL 0 echo net user 执行成功了!
那为什么我要写成这样呢?各位自己把代码改掉执行后,就会发现错误了!用这种语法,不管你的上面的命令是否执行成功,他都会认为命令成功了,不知道是BUG还是本人理解错误…

%ERRORLEVEL% 这是个系统变量,返回上条命令的执行结果代码! "成功"用0表示  "失败"用1表示. 当然还有其他参数,用的时候基本就这两数字.
一般上一条命令的执行结果代码只有两结果,"成功"用0表示  "失败"用1表示
  这只是一般的情况,实际上,errorlevel返回值可以在0~255之间,比如,xcopy默认的errorlevel值就有5个,分别表示5种执行状态:

要判断上面xcopy命令的5种退出情况,应写成:
if errorlevel 5 echo出现了磁盘写入错误
if errorlevel 4 echo出现了初始化错误
if errorlevel 2 echo用户按 CTRL+C 终止了 xcopy
if errorlevel 1 echo if errorlevel 2 echo
if errorlevel 0 echo文件复制没有错误。
才能正确执行。

这个是判断上一条命令是否执行失败的

这个是根据你输入的命令,自动判断是成功还是失败了!

else后面写上执行失败后的操作!

这里介绍的两种简写对IF的三种语法都可以套用,不单单是在IF [NOT] ERRORLEVEL number command
这种法上才能用

这个呢就是用来比较变量或者字符的值是不是相等的.

上面这个例子可以判断你输入的值是不是相等,但是你如果输入相同的字符,但是如果其中一个后面打了一个空格,
这个例子还是会认为相等,如何让有空格的输入不相等呢?我们在比较字符上加个双引号就可以了.
@echo off
set /p var=请输入第一个比较字符:
set /p var2=请输入第二个比较字符(多输入个空格试试):
if "%var%" == "%var2%" (echo 我们相等) ELSE echo 我们不相等
pause

这个就是判断某个文件或者文件夹是否存在的语法

判断的文件路径加引号是为了防止路径有空格,如果路径有空格加个双引号就不会出现判断出错了!

另外我们看到每条IF用法后都有个[NOT]语句,这啥意思?其他加上他的话,就表示先判断我们的条件不成立时,
没加他默认是先判断条件成立时,比如上面这个例子
@echo off
if not exist "c:\test" (echo 存在文件) ELSE echo 不存在文件
pause

加个NOT,执行后有什么结果,如果你的C盘下根本就没c:\test,他还是会显示"存在文件",这就表示了加了NOT就
会先判断条件失败

!懂了吧,上面例子改成这样就正确了!
@echo off
if not exist "c:\test" (echo 不存在文件) ELSE echo 存在文件
pause

  IF [/I] string1 compare-op string2 command  #参数/I表示不区分大小写
  IF CMDEXTVERSION number command
  IF DEFINED variable command  #判断变量是否存在,很有用

如果已定义环境变量,DEFINED 条件的作用跟 EXISTS 的一样
IF DEFINED variable command
IF NOT "variable"=="" command
上面两条命令效果一样。

一句话,变量值为空,则为未定义;变量值不为空,则为已定义。
用语句IF DEFINED variable command判断变量是否存在时,请注意variable为不使用引导符号%的变量名,不能用写为%variable%,否则出错。

例:
set aa=123
set aa=
if defined aa (echo 变量aa存在) else (echo 变量aa不存在)
运行显示:变量aa不存在

执行后会显示:我们不相等

加上/I不区分大小写就相等了!

    EQU - 等于
    NEQ - 不等于
    LSS - 小于
    LEQ - 小于或等于
    GTR - 大于
    GEQ - 大于或等于

                                         BY 伤脑筋

本章节乃龙卷风根据自己平时学用批处理的经验而总结的,不断补充中……。

一、交互界面设计

if /i "%choice%"=="1" goto ip
if /i "%choice%"=="2" goto setsave
if /i "%choice%"=="3" goto kaiji
if /i "%choice%"=="4" goto clean
if /i "%choice%"=="Q" goto endd
echo 选择无效,请重新输入
echo.
goto cho
只要学完本教程前面的章节,上面的程序应该能看懂了。

前面已经谈到,DOS条件语句主要有以下形式
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
增强用法:IF [/I] string1 compare-op string2 command
增强用法中加上/I就不区分大小写了!
增强用法中还有一些用来判断数字的符号:

上面的command命令都可以用小括号来使用多条命令的组合,包括else子句,组合命令中可以嵌套使用条件或循环命令。

    IF EXIST filename (
        del filename
    ) ELSE (
        echo filename missing
    )

----------------------------
水晶人头之谜
----------------------------
你可曾见到这样一颗水晶雕成的人头?它和真人头骨同等大小,用一整块水晶雕琢而成,牙齿十分整齐地排列在牙床上,鼻骨由3颗水晶石拼接起来,两只眼睛各为一块圆形水晶。人头的底部还藏着棱镜。它的模样估计是一个女人的头颅。整个水晶头骨上没有任何人工打磨的痕迹,看上去精美绝伦、熠熠生辉,即使用现代科技雕琢它也会十分耗时费工,可科学家却推断它早在3600年前就已诞生,你相信有这样的事情吗?
这颗水晶头骨发现于中美洲的洪都拉斯,难道是印第安人的祖先制作出来的吗?可20世纪的印第安人还在美洲的丛林里过着衣不蔽体、食不果腹的原始生活,谁能相信他们的祖先早在几千年前就拥有了如此高超的雕刻技艺呢?我们知道,水晶的硬度非常之高,用一般的器具是很难对其加工的,那么古人是用什么工具雕刻它的呢?而且要找到这么大的水晶实在是不容易的事情啊。他们又如何能凭借原始的手工工具把它雕刻得如此成功?现在研究者还一致认为,当时的加工者并不了解水晶晶体的结构,他们也不具备现代的光学和人体骨骼构造的知识,在这样一种模糊的认识上能雕刻出这样的杰作,实在让人称奇!在古代玛雅的传说里,这颗水晶人头具有某种神奇的力量,他们通过它与神灵相通。
————选自《世界未解之谜》

1、指定次数循环
FOR /L %variable IN (start,step,end) DO command [command-parameters]

2、对某集合执行循环语句。
FOR %%variable IN (set) DO command [command-parameters]

FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]

同前面一样,command可以用括号来组合:
FOR /R [[drive:]path] %variable IN (set) DO (
Command1
Command2
……
commandn
)

例:
@echo off
set var=0
rem ************循环开始了
:continue
set /a var+=1
echo 第%var%次循环
if %var% lss 100 goto continue
rem ************循环结束了
echo 循环执行完毕
pause

四、子程序

子程序调用格式:
  CALL :label arguments

在子程序段中,参数%0指标签:label

子程序和主程序中的变量都是全局变量,其作用范围都是整个批处理程序。

子程序例1:
@echo off
call :sub return 你好
echo 子程序返回值:%return%
pause

:sub
rem 参数1为返回变量名称
set /a %1=%1+%2
shift /2
if not "%2"=="" goto sub
goto :eof

在win98系统中,不支持上面这种标号调用,须将子程序单独保存为一个批处理程序,然后调用。

ftp是常用的下载工具,ftp界面中有40多个常用命令,自己学习了,不介绍了。这里介绍如何用dos命令行调用ftp命令,实现ftp自动登录,并上传下载,并自动退出ftp程序。
其实可以将ftp命令组合保存为一个文本文件,然后用以下命令调用即可。

上面的filename为ftp命令文件,包括登录IP地址,用户名、密码、操作命令等
例:
open 90.52.8.3   #打开ip
user iware       #用户为iware
password8848    #密码
bin             #二进制传输模式
prompt
cd tmp1         #切换至iware用户下的tmp1目录
pwd
lcd d:\download   #本地目录
mget *          #下载tmp1目录下的所有文件
bye             #退出ftp

六、用7-ZIP实现命令行压缩和解压功能

7z.exe的每个命令都有不同的参数,请看帮助文件
为压缩包名称
为文件名称,支持通配符或文件列表

a: Adds files to archive. 添加至压缩包
a命令可用参数:
  -i (Include)
  -m (Method)
  -p (Set Password)
  -r (Recurse)
  -sfx (create SFX)
  -si (use StdIn)
  -so (use StdOut)
  -ssw (Compress shared files)
  -t (Type of archive)
  -u (Update)
  -v (Volumes)
  -w (Working Dir)
  -x (Exclude)

d: Deletes files from archive. 从压缩包中删除文件
d命令可用参数:
  -i (Include)
  -m (Method)
  -p (Set Password)
  -r (Recurse)
  -u (Update)
  -w (Working Dir)
  -x (Exclude)

l: Lists contents of archive.
t: Test 
u: Update

使用 Windows 脚本宿主,可以在命令提示符下运行脚本。CScript.exe 提供了用于设置脚本属性的命令行开关。

选项:
 //B         批模式:不显示脚本错误及提示信息
 //D         启用 Active Debugging
 //E:engine  使用执行脚本的引擎
 //H:CScript 将默认的脚本宿主改为 CScript.exe
 //H:WScript 将默认的脚本宿主改为 WScript.exe (默认)
 //I         交互模式(默认,与 //B 相对)
 //Job:xxxx  执行一个 WSF 工作
 //Logo      显示徽标(默认)
 //Nologo    不显示徽标:执行时不显示标志
 //S         为该用户保存当前命令行选项
 //T:nn      超时设定秒:允许脚本运行的最长时间
 //X         在调试器中执行脚本
 //U         用 Unicode 表示来自控制台的重定向 I/O

由于批处理文件是一种文本文件,任何人都可以对其进行随便编辑,不小心就会把里面的命令破坏掉,所以如果将其转换成.com格式的可执行文件,不仅执行效率会大大提高,而且不会破坏原来的功能,更能将优先级提到最高。Bat2Com就可以完成这个转换工作。
小知识:在DOS环境下,可执行文件的优先级由高到低依次为.com>.exe>.bat>.cmd,即如果在同一目录下存在文件名相同的这四类文件,当只键入文件名时,DOS执行的是name.com,如果需要执行其他三个文件,则必须指定文件的全名,如name.bat。

----------------------------
人体辉光之谜
----------------------------
现代科技发现了很多让人吃惊的现象,它能使人们相信很多在传说或者梦境里才有的事情。宗教油画上的小天使总是头顶光圈飞来飞去。可你相信吗?在我们每个人的身体表面其实都有一层肉眼所见不到的彩色光!天使拥有的还只是头顶的光圈,可我们拥有的是全身的辉光,这多神奇。只要通过特殊的手段,譬如凭借某种涂了特殊颜料的玻璃,我们就能亲眼见到自己身体周围的辉光。而科学家发明了一种特殊的高频电场照相技术,能把人体辉光的状况显示在彩色照片上,不仅能让我们一睹为快,还能永久收藏。这实在是一件有意思的事情。科学家的实验还发现人体辉光是处于变动之中的,人体不同部位辉光的颜色不一样,而且在人体的精神和身体状况有变动时,辉光的明暗、强弱和大小都会随之发生变化。
————选自《世界未解之谜》

本条参考引用[英雄]教程
什么是时间延迟?顾名思义,就是执行一条命令后延迟一段时间再进行下一条命令。
延迟的应用见下节:“模拟进度条”。
1、利用ping命令延时
 例:
  @echo off
  echo 延时前:%time%
  ping /n 3 127.0.0.1 >nul
  echo 延时后:%time%
  pause 
解说:用到了ping命令的“/n”参数,表示要发送多少次请求到指定的ip。本例中要发送3次请求到本机的ip(127.0.0.1)。127.0.0.1可简写为127.1。“>nul”就是屏蔽掉ping命令所显示的内容。

3、利用vbs延迟函数,精确度毫秒,误差1000毫秒内

    :delay
    echo WScript.Sleep %1>delay.vbs
    CScript //B delay.vbs
    del delay.vbs
    goto :eof

上面的运行结果显示实际延时了5500毫秒,多出来的500毫秒时建立和删除临时文件所耗费的时间。误差在一秒之内。

仅用批处理命令就可以实现延迟操作。

@echo off
set /p delay=请输入需延迟的毫秒数:
set TotalTime=0
set NowTime=%time%
::读取起始时间,时间格式为:13:01:05.95
echo 程序开始时间:%NowTime%
:delay_continue
set /a minute1=1%NowTime:~3,2%-100
::读取起始时间的分钟数
set /a second1=1%NowTime:~-5,2%%NowTime:~-2%0-100000
::将起始时间的秒数转为毫秒
set NowTime=%time%
set /a minute2=1%NowTime:~3,2%-100
:: 读取现在时间的分钟数
set /a second2=1%NowTime:~-5,2%%NowTime:~-2%0-100000
::将现在时间的秒数转为毫秒
set /a TotalTime+=(%minute2%-%minute1%+60)%%60*60000+%second2%-%second1%
if %TotalTime% lss %delay% goto delay_continue
echo 程序结束时间:%time%
echo 设定延迟时间:%delay%毫秒
echo 实际延迟时间:%TotalTime%毫秒
pause

   请输入需延迟的毫秒数:6000
   程序开始时间:15:32:16.37
   程序结束时间:15:32:22.37
   设定延迟时间:6000毫秒
   实际延迟时间:6000毫秒
   请按任意键继续. . .

误差:windows系统时间只能精确到10毫秒,所以理论上有可能存在10毫秒误差。
      经测试,当延迟时间大于500毫秒时,上面的延迟程序一般不存在误差。当延迟时间小于500毫秒时,可能有几十毫秒误差,为什么?因为延迟程序本身也是有运行时间的,同时系统时间只能精确到10毫秒。

@echo off
echo 程序开始时间:%Time%
call :delay 10
echo 实际延迟时间:%totaltime%毫秒
echo 程序结束时间:%time%
pause
exit

十、模拟进度条

@echo off
mode con cols=113 lines=15 &color 9f
cls
echo.
echo  程序正在初始化. . . 
echo.
echo  ┌──────────────────────────────────────┐
set/p=  ■nul
echo   100%%
echo  └──────────────────────────────────────┘
pause

十一、特殊字符的输入及应用

(如果要继续输入特殊字符请再次按ctrl+p,然后ctrl+某个字母)

一些简单的特殊符号可以在dos命令窗口直接输入,并用重定向保存为文本文件。
例:
C:>ECHO ^G>temp.txt
“^G”是用Ctrl+G或Alt+007输入,输入多个^G可以产生多声鸣响。

退格键表示删除左边的字符,此键不能在文档中正常输入,但可以通过edit编辑程序录入并复制出来。即“”。

例:输出唐诗一首,每行闪动多次
@echo off
setlocal enabledelayedexpansion

:hero
for /l %%k in (1,1,10) do (
 ping /n 0 127.0.0.1>nul
 set /p a=nul
 set /p a=%1<nul
)
::文字闪动
goto :eof

%RANDOM% 系统变量 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。

那么,如何获取100以内的随机数呢?很简单,将%RANDOM%按100进行求余运算即可,见例子。

求余数运算set /a randomNum=!random!%%100中的100可以是1~32768之间的任意整数。

思考题目:生成给定位数的随机密码
解答思路:将26个英文字母或10数字以及其它特殊字符组成一个字符串,随机抽取其中的若干字符。

:randomPassword
::---------生成随机密码
::---------%1为密码长度,%2及以后为返回变量名称
::---------for命令最多只能区分31个字段
@echo off
set password_len=%1
if not defined password_len goto :eof
if %password_len% lss 1 goto :eof
set wordset=a b c d e f g h i j k l m n o p q r s t u v w x y z
set return=
set num=0
:randomPassword1
set /a num+=1
set /a numof=%random%%%26+1
for /f "tokens=%numof% delims= " %%i in ("%wordset%") do set return=%return%%%i
if %num% lss %password_len% goto randomPassword1
if not "%2"=="" set %2=%return%
shift /2
if not "%2"=="" goto randomPassword
goto :eof

:randomPassword
::---------生成随机密码
::---------%1为密码长度,%2及以后为返回变量名称
::---------goto循环、变量嵌套、命令嵌套
@echo off
if "%1"=="" goto :eof
if %1 lss 1 goto :eof
set password_len=%1
set return=
set wordset=abcdefghijklmnopqrstuvwxyz023456789_
::---------------------------循环
:randomPassword1
set /a numof=%random%%%36
call set return=%return%%%wordset:~%numof%,1%%
set /a password_len-=1
if %password_len% gtr 0 goto randomPassword1
::---------------------------循环
if not "%2"=="" set %2=%return%
shift /2
if not "%2"=="" goto randomPassword
goto :eof

说明:本例涉及到变量嵌套和命令嵌套的应用,见后。

    和其它编程语言相比,dos功能显得相对简单,要实现比较复杂的功能,需要充分运用各种技巧,变量嵌套与命令嵌套就是此类技巧之一。

**********************************************
截取功能统一语法格式为:%a:~[m[,n]]%
**********************************************
方括号表示可选,%为变量标识符,a为变量名,不可少,冒号用于分隔变量名和说明部分,符号~可以简单理解为“偏移”即可,m为偏移量(缺省为0),n为截取长度(缺省为全部)。

以上是dos变量处理的通用格式,如果其中的m、n为变量,那么这种情况就是变量嵌套了。

什么是命令嵌套呢?简单的说,首先用一条dos命令生成一个字符串,而这个字符串是另一条dos命令,用call语句调用字符串将其执行,从而得到最终结果。

运行显示:

set num=Redtek 2006 bbs.cn-dos.net
set a=123245
set b=87754321

call set result=%%%%%%%%num:~%%%%b:~%a:~3,1%,1%%%%,4%%%%%%%%
echo 一层命令嵌套,可解析两层变量,其余的当作字符串:%result%

call call call set result=%%%%%%%%num:~%%%%b:~%a:~3,1%,1%%%%,4%%%%%%%%
echo 三层命令嵌套,运行变量解析完后的字符串:%result%

Find常和type命令结合使用
Type [drive:][path]filename | find "string" [>tmpfile] #挑选包含string的行
Type [drive:][path]filename | find /v "string"   #剔除文件中包含string的行
Type [drive:][path]filename | find /c   #显示文件行数 
以上用法将去除find命令自带的提示语(文件名提示)

  /V        显示所有未包含指定字符串的行。
  /C        仅显示包含字符串的行数。
  /N        显示行号。
  /I        搜索字符串时忽略大小写。
  /OFF[LINE] 不要跳过具有脱机属性集的文件。
  "string"  指定要搜索的文字串,
  [drive:][path]filename
            指定要搜索的文件。

find命令不能处理文件中超过1024个字符的数据行,此时可用findstr命令。(见前面介绍)

  /B        在一行的开始配对模式。
  /E        在一行的结尾配对模式。
  /L        按字使用搜索字符串。
  /R        将搜索字符串作为一般表达式使用。
  /S        在当前目录和所有子目录中搜索
              匹配文件。
  /I         指定搜索不分大小写。
  /X        打印完全匹配的行。
  /V        只打印不包含匹配的行。
  /N        在匹配的每行前打印行数。
  /M        如果文件含有匹配项,只打印其文件名。
  /O        在每个匹配行前打印字符偏移量。
  /P        忽略有不可打印字符的文件。
  /OFF[LINE] 不跳过带有脱机属性集的文件。
  /A:attr   指定有十六进位数字的颜色属性。请见 "color /?"
  /F:file   从指定文件读文件列表 (/ 代表控制台)。
  /C:string 使用指定字符串作为文字搜索字符串。
  /G:file   从指定的文件获得搜索字符串。 (/ 代表控制台)。
  /D:dir    查找以分号为分隔符的目录列表
  strings   要查找的文字。
  [drive:][path]filename
            指定要查找的文件。

"hello there"。

有关 FINDSTR 常见表达法的详细情况,请见联机命令参考。

转载于:https://www.cnblogs.com/accumulater/p/10647818.html