DOS批处理高级教程(一) 批处理基础

前言

批处理主要是用于脚本的编写, 是为了减少重复劳动力而建立的一个工具;。 DOS批处理已经慢慢淡出大家的视线,在windows中我们完全可以写shellpython shell,(xx.sh, xx.py), 同样可以用 C# 结合windows 自带的 power shell ise 编写.ps1脚本。 这都是可以的, 喜欢什么都是各自的自由。

第一章 批处理基础

本章主要介绍批处理的常见命令的常见字段和符号; 在实际的例子中理解和学习, 对于每个出现的单词、字段设计理念、能够解决的问题等进行简单初步的整理。

下面例子每个例子都会经过我自己的在win7 64中运行提供出代码展示; 如果有字段不理解的可以参阅相关这一系列文章; 可以在文章的摘要中查阅字段的主要位置进行跳转。如果确实有问题和不理解的地方可以在评论区留言, 或者发送邮件到 actanble@163.com.

第一节 常用批处理内部命令简介

REM 和 ::

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

:: 也可以起注释作用, 而且更简洁有效; 但有两点需要注意:

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

无效可以起到注释作用,所以 :: 常被用作注释符号,其实 :+ 也可起注释作用。

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

行内注释格式:%注释内容% (不常用,容易引起语法错误,慎用少用)

ECHO 和 @

echo 表示 “out>>” 相当于打印
@字符放在命令前将关闭该命令回显,无论此时echo是否为打开状态。

一般来说理解了就行了, 下面的9种用法场景简单眼熟下, 右面会有很多实例强化练习。

@字符放在命令前将关闭该命令回显,无论此时echo是否为打开状态。

echo命令的作用列举如下:

打开回显或关闭回显功能

格式:echo [{ on|off }]

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

显示当前ECHO设置状态

>格式:echo

输出提示信息

格式:ECHO 信息内容

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

关闭DOS命令提示符

在DOS提示符状态下键入ECHO OFF,能够关闭DOS提示符的显示使屏幕只留下光标,直至键入ECHO ON,提示符才会重新出现。

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

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

命令ECHO.输出的回车,经DOS管道转向可以作为其它命令的输入,比如echo.|time即相当于在TIME命令执行后给出一个回车。所以执行时系统会在显示当前时间后,自动返回到DOS提示符状态

答复命令中的提问

格式:ECHO 答复语|命令文件名

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

    ECHO Y|CHKDSK/F
    ECHO Y|DEL A :*.*

建立新文件或增加文件内容

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

Example

  ECHO @ECHO OFF>AUTOEXEC.BAT 建立自动批处理文件
  ECHO C:CPAVBOOTSAFE>>AUTOEXEC.BAT 向自动批处理文件中追加内容

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

格式:ECHO 打印机控制码>PRN

  ECHO 打印内容>PRN

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

 ECHO +156+42+116>PRN(输入下划线命令FS*t)
 ECHO PRN">+155@>PRN(输入初始化命令ESC@)
 ECHO.>PRN(换行)

使喇叭鸣响

ECHO ^G

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

PAUSE 暂停

暂停

ERRORLEVEL

    echo %errorlevel%
每个命令运行结束,可以用这个命令行格式查看返回码
用于判断刚才的命令是否执行成功
默认值为0,一般命令执行出错会设 errorlevel1
又编程经验的都体检西相当于return; 

TITLE 设置cmd窗口的标题

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

COLOR 设置cmd窗口前景和背景颜色

设置默认的控制台前景和背景颜色。批处理编程常用。

COLOR[attr]

attr 指定控制台输出的颜色属性

颜色属性由两个十六进制数字指定
color xy; 第一个x为背景,第二个y则为前景。
每个数字可以为以下任何值之一:
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 A = 淡绿色
3 = 湖蓝色 B = 淡浅绿色
4 = 红色 C = 淡红色
5 = 紫色 D = 淡紫色
6 = 黄色 E = 淡黄色
7 = 白色 F = 亮白色

  • *如果没有给定任何参数,该命令会将颜色还原到 CMD.EXE 启动时 的颜色。这个值来自当前控制台窗口、/T 开关 或DefaultColor 注册表值。
  • 如果用相同的前景和背景颜色来执行 COLOR 命令,COLOR 命令 会将 ERRORLEVEL 设置为 1。

例如: “colorfc” 在亮白色上产生亮红色

mode 配置系统设备

简单通过命令来学习吧, 深入了解的话 直接mode /?

mode 和 color 的常用例子

mode con cols=113 lines=15 & color 9f

上述代码的意思是设置长宽的行列数 且 设置颜色。不加赘述。

GOTO 和 :

goto 一般和 :连用; goto就是跳转的意思。
example: demo_goto.bat

@echo off
:start
set /a var+=1
echo %var%
if %var% leq 3 GOTO start
pause

FIND 在文件中搜索字符串

find /? 查询用法即可, 这里不加赘述, 用到了再描述; 后面和 findstr 一起说

START 调用外部程序并任其在新窗口自行运行

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

例:start explorer d: 调用图形界面打开D盘

assoc 和 ftype

文件关联, 详情 commend /?

assoc 设置’文件扩展名’关联,关联到’文件类型’
ftype 设置’文件类型’关联,关联到’执行程序和参数’

pushd 和 popd

切换目录与返回, 跟看电视的回看一样的效果

pushd先保存当前目录位置, 进入另外一个目录; popd 会到以前的目录

exanple:

@echo off
c: & cd & md mp3       #在 C: 建立 mp3 文件夹
md d:mp4               #在 D: 建立 mp4 文件夹
cd /d d:mp4            #更改当前目录为 d:mp4,cd命令的/d参数可改变盘符。
pushd c:mp3            #保存当前目录,并切换当前目录为 c:mp3
popd                    #恢复当前目录为刚才保存的 d:mp4

CALL 调用批处理程序或命令并等待其执行完毕

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

shift

更改批处理文件中可替换参数的位置。

SHIFT [/n]

IF

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

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

后面实例中详解

setlocal 与 变量延迟

 @echo off
 set a=4
 set a=5 & echo %a%
 pause
'''
结果:4
解说:为什么是4而不是5呢?在echo之前明明已经把变量a的值改成5了?
修改 a 为!%a%! 即可、 正在 & 后面延迟一下再打印到控制台中而不是并行处理直接echo a了;
'''

ATTRIB 显示或更改文件属性

ATTRIB [+R|-R] [+A|-A] [+S|-S] [+H|-H] [[drive:] [path] filename] [/S [/D]]

例子: 实现建立文件夹autorun,然后将其设为存档、系统、隐藏属性。

md autorun
attrib +a +s +h autorun

findstr 在文件中搜索字符串(find增强版)

后面再说、 联机命令会讲到, 也可以自己 findstr /? 查阅文档进行试验

date /t 和 time /t

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

第二节 常用特殊符号

符号是表达的基本形式; 一般在后面会用得特别多, 多写几个实例就差不多理解各自的简单用法。 动起手来即可, 下面就简单熟悉下了。

@ 命令行回显屏蔽符

@echo off ; 可以达到所有命令均不回显的要求

% 批处理变量引导符

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

例:最简单的复制文件自身的方法

copy %0 d:wind.bat

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

> 输出重定向符

输出重定向命令
这个字符的意思是传递并且覆盖,他所起的作用是将运行的结果传递到后面的范围(后边可以是文件,也可以是默认的系统控制台)
在NT系列命令行中,重定向的作用范围由整个命令行转变为单个命令语句,受到了命令分隔符&,&&,||和语句块的制约限制。

比如:

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

>> 输出重定向符

一般用作文本追加; 例如
name.bat 帮助你迅速找到速度最快的QQ服务器,从而远离”从服务器中转”那一痛苦的过程

ping sz.tencent.com > a.txt
ping sz1.tencent.com >> a.txt
ping sz2.tencent.com >> a.txt
ping sz3.tencent.com >> a.txt
ping sz4.tencent.com >> a.txt
ping sz5.tencent.com >> a.txt
ping sz6.tencent.com >> a.txt
ping sz7.tencent.com >> a.txt
exit

<、>&、<& 重定向符

这三个命令也是管道命令,但>&、<&一般不常用,你只需要知道一下就ok了,当然如果想仔细研究的话,可以自己查一下资料。

&,将一个句柄的输出写入到另一个句柄的输入中。
<&,刚好和>&相反,从一个句柄读取输入并将其写入到另一个句柄输出中。

<,输入重定向命令,从文件中读入命令输入,而不是从键盘中读入。
exanple demo_resd.bat

@echo off
echo 2005-05-01>temp.txt
set /p today=<temp.txt
echo %today%
del temp.txt
pause

| 命令管道符

格式:第一条命令 | 第二条命令 | 第三条命令…

与 Linux 的 | 用法一样。

例子: 格式化 a 盘。

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

^ 转义字符

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

& 组合命令(顺序执行)

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

&& 组合命令(前面指令成功,才执行后面指令)

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

用这种方法可以同时执行多条命令,当碰到执行出错的命令后将不执行后面的命令,如果一直没有出错则一直执行完所有命令
这个命令和上边的类似,但区别是,第一个命令失败时,后边的命令也不会执行.

dir c: && dir d: && dir e:

|| 组合命令(前面指令失败,才执行后面指令)

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

用这种方法可以同时执行多条命令,当一条命令失败后才执行第二条命令,当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令;

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

问题:把C盘和D盘的文件和文件夹列出到a.txt文件中。看例:

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

“” 字符串界定符

双引号允许在字符串中包含空格,进入一个特殊目录可以用如下方法

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

以上三种方法都可以进入program files这个目录

, 逗号

逗号相当于空格,在某些情况下“,”可以用来当做空格使用, 比如
dir,c:

; 分号

分号,当命令相同时,可以将不同目标用;来隔离,但执行效果不变,如执行过程中发生错误,则只返回错误报告,但程序仍会执行。试试就知道了。

() 括号

小括号在批处理编程中有特殊的作用,左右括号必须成对使用,括号中可以包括多行命令,这些命令将被看成一个整体,视为一条命令行。
括号在for语句和if语句中常见,用来嵌套使用循环或条件语句,其实括号()也可以单独使用,请看例子。
例:
命令:echo 1 & echo 2 & echo 3
可以写成:
(
echo 1
echo 2
echo 3
)
上面两种写法效果一样,这两种写法都被视为是一条命令行。
注意:这种多条命令被视为一条命令行时,如果其中有变量,就涉及到变量延迟的问题。

! 感叹号

前面!val!已经描述过

批处理中可能会见到的其它特殊标记符:

碰到了, 查询, 解决, 记载。

  • CR(0D) 命令行结束符

  • Escape(1B)

  • ANSI转义字符引导符

  • Tab(09) ; = 不常用的参数界定符

    • COPY命令文件连接符

      • ? 文件通配符
  • / 参数开关引导符

  • : 批处理标签引导符

后记

参考文章:
http://blog.csdn.net/lanbing510/article/details/7461073
本文地址:
http://blog.csdn.net/actanble/article/details/59127745

第一部分 基础内容到这里就结束了。关于更深层的学习和熟悉 DOS 批处理可以继续关注。

原文地址:https://www.cnblogs.com/actanble/p/6713423.html