批处理-批处理基础

第一节 常用批处理内部命令简介
批处理定义:顾名思义,批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD。这些命令统称批处理命令。
小知识:可以在键盘上按下Ctrl+C组合键来强行终止一个批处理的执行过程。

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

@echo off
Setlocal enabledelayedexpansion
::CODER BY dsw POWERD BY iBAT

echo "欢迎来到非常BAT!"

pause

  从上面这个简单的批处理中,我们可以发现其实批处理就是运用一些含有特殊意义的符号和一些完成指定功能的命令组合而成,那么在批处理中有多少这样的特殊符号和功能命令呢?我们现在就来仔细了解一下一些最常用的!

批处理的常见命令(未列举的命令还比较多,请查阅帮助信息)


1、REM 和 ::

注释语句在程序代码当中,充当提示作用,方便代码功能的阅读。但是,注释语句是不会随着功能代码运行的,也就是说,注释语句没有任何功能。

REM为注释命令,一般用来给程序加上注解,该命令后的内容不被执行,但能回显(可以被@echo off关闭)。
 :: 也可以起到rem 的注释作用, 而且更简洁有效; 但有两点需要注意:
  (1)、任何以冒号:开头的字符行, 在批处理中都被视作标号, 而直接忽略其后的所有内容。

    有效标号:冒号后紧跟一个以字母数字开头的字符串,goto语句可以识别。

    无效标号:冒号后紧跟一个非字母数字的一个特殊符号,goto无法识别的标号,可以起到注释作用,所以:: 常被用作注释符号,其实 :+ 也可起注释作用。

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

2、echo 和 @

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

echo命令的作用列举如下:
(1)打开回显或关闭回显功能
    格式:echo [{ on|off }]
    如果想关闭“echo off”命令行自身的显示,则需要在该命令行前加上“@”。

(2)显示当前echo设置状态
    举例:echo      ::输出回显状态

(3)输出提示信息
    格式:echo 信息内容
    上述是echo命令常见的三种用法,也是大家熟悉和会用的,但作为DOS命令淘金者你还应该知道下面的技巧:

(4)关闭DOS命令提示符
    在DOS提示符状态下键入echo off,能够关闭DOS提示符的显示使屏幕只留下光标,直至键入echo ON,提示符才会重新出现。

(5)输出空行,即相当于输入一个回车
    格式:echo.
    值得注意的是命令行中的“.”要紧跟在echo后面中间不能有空格,否则“.”将被当作提示信息输出到屏幕。另外“.”可以用,:;”/[\]+等任一符号替代。
    命令echo.输出的回车,经DOS管道转向可以作为其它命令的输入,比如echo.|time即相当于在TIME命令执行后给出一个回车。所以执行时系统会在显示当前时间后,自动返回到DOS提示符状态

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

(7)建立新文件或增加文件内容
  格式:
        echo 文件内容>文件名      
        echo 文件内容>>文件名     
例如:
  C:>echo @echo off>AUTOEXEC.BAT        ::会创建一个文件,并往里面添加内容
  C:>echo C:\CPAV\BOOTSAFE>>AUTOEXEC.BAT  ::追加内容必须用::,否则会覆盖前面写入的内容
  C:>TYPE AUTOEXEC.BAT               ::显示该批处理文件内容

@echo off
C:\CPAV\BOOTSAFE

(8)向打印机输出打印内容或打印控制码
  格式:
        echo 打印机控制码>PRN
        echo 打印内容>PRN

下面的例子是向M-1724打印机输入打印控制码。<Alt>156是按住Alt键在小键盘键入156,类似情况依此类推:
C:>echo +156+42+116>PRN(输入下划线命令FS*t)
C:>echo +155@>PRN(输入初始化命令ESC@)
C:>echo.>PRN(换行)

3、PAUSE
PAUSE,玩游戏的人都知道,暂停的意思,在这里就是停止系统命令的执行并显示下面的内容
例:
  PAUSE
运行显示:
  请按任意键继续. . .

要显示其他提示语,可以这样用:echo 其他提示语 & pause > nul

4、Set

语法形式:
  SET [variable=[string]]
  SET /P variable=[promptString] 
  SET /A expression    

(1)定义变量

set var=10    ::=号两边不能有空格

set var=    ::给变量赋值是定义变量,不给变量赋值类似于注销变量

(2)SET /A expression

/A 让SET可以支持数学符号进行加减等一些数学运算,该表达式解析很简单并以递减的优先顺序支持下列操作:

  () - 分组 
  ! ~ - - 一元运算符 
  * / % - 算数运算符 
  + - - 算数运算符 
  << >> - 逻辑移位 
  & - 按位“与” 
  ^ - 按位“异” 
  | - 按位“或” 
  = *= /= %= += -= &= ^= |= <<= >>= - 赋值
  , - 表达式分隔符 

@echo off
Setlocal enabledelayedexpansion
::CODER BY dsw POWERD BY iBAT

  set a=100
  set b=1000
  set /a c=a+b
  echo the result is :%c%

  set /a a=1+1,b=2+1,c=3+1
  echo %a% %b% %c%

  set /a var= 1 "&" 1 ::逻辑或区域操作等运算符,需要用双引号引起来

  set /a var= 1 "%" 1
  set /a var= 2 "<<" 2
  set /a var= 4 ">>" 2

pause

(3)SET /P variable=[promptString]  

功能等待用户输入

windows 2000 和windows 是没有choice这个命令,choice的等待用户输入功能就要通过set /p来实现

@echo off
Setlocal enabledelayedexpansion
::CODER BY dsw POWERD BY iBAT

set /p str=请输入你想输入的字符: 
echo 你输入的字符串为:%str% 

pause

(4)结合字符串操作,对变量的内容进行剪切、替换等操作

@echo off
Setlocal enabledelayedexpansion
::CODER BY dsw POWERD BY iBAT

set str=welcome come to bat
set var=%str:~3,4%
echo %var%

pause

(5)显示环境变量

如:

  set 会显示当前所有的系统环境变量

  set c 会显示当前所有的以c开头或C开头的变量(不区分大小写)


5、ERRORLEVEL
程序返回码
echo %errorlevel%
每个命令运行结束,可以用这个命令行格式查看返回码,用于判断刚才的命令是否执行成功.
默认值为0,命令执行成功则返回0,执行出错会设 errorlevel 为1

5、title
设置cmd窗口的标题
title 新标题        #可以看到cmd窗口的标题栏变了

6、COLOR
设置默认的控制台前景和背景颜色。
COLOR [attr]   attr 指定控制台输出的颜色属性

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

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

7、mode 配置系统设备
配置系统设备。
串行口:   MODE COMm[:] [BAUD=b] [PARITY=p] [DATA=d] [STOP=s]
                      [to=on|off] [xon=on|off] [odsr=on|off]
                      [octs=on|off] [dtr=on|off|hs]
                      [rts=on|off|hs|tg] [idsr=on|off]

设备状态:       MODE [device] [/STATUS]
打印重定向:   MODE LPTn[:]=COMm[:]
选定代码页:   MODE CON[:] CP SELECT=yyy
代码页状态:   MODE CON[:] CP [/STATUS]
显示模式:     MODE CON[:] [COLS=c] [LINES=n]
击键率:        MODE CON[:] [RATE=r DELAY=d]

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

8、goto和 :
在批处理中允许以“:XXX”来构建一个标号,然后用goto XXX跳转到标号:XXX处,然后执行标号后的命令。
例:

if {%1}=={} goto noparms

if "%2"=="" goto noparms

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

@echo off
Setlocal enabledelayedexpansion
::CODER BY dsw POWERD BY iBAT

:start
set /p var=请输入一个大于3的数字
echo %var%
if %var% leq 3 goto start

pause

9、find

在文件中搜索字符串。
FIND [/V] [/C] [/N] [/I] [/off[LINE]] "string" [[drive:][path]filename[ ...]]

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

如果没有指定路径,FIND 将搜索键入的或者由另一命令产生的文字。

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
Setlocal enabledelayedexpansion
::CODER BY dsw POWERD BY iBAT

echo 111 >test.txt
echo 222 >>test.txt

type test.txt|find "111"
del test.txt

pause


10、start 命令
Start会开启新窗口来运行程序,如果新窗口不正常退出,你的批处理就不能正常执行下去 

语法:start ["title"] [/dPath] [/i] [/min] [/max] [{/separate | /shared}] [{/low | /normal | /high | /realtime | /abovenormal | belownormal}] [/wait] [/b] [FileName] [parameters] 

"title" 指定在“命令提示符”窗口标题栏中显示的标题。
/dpatch 指定启动目录。
/i 将 Cmd.exe 启动环境传送到新的“命令提示符”窗口。
/min 启动新的最小化窗口。
/max 启动新的最大化窗口。
/separate 在单独的内存空间启动 16 位程序。
/shared 在共享的内存空间启动 16 位程序。
/low 以空闲优先级启动应用程序。
/normal 以一般优先级启动应用程序。
/high 以高优先级启动应用程序。
/realtime 以实时优先级启动应用程序。
/abovenormal 以超出常规优先级的方式启动应用程序。
/belownormal 以低出常规优先级的方式启动应用程序。
/wait 启动应用程序,并等待其结束。 

@echo off
Setlocal enabledelayedexpansion
::CODER BY dsw POWERD BY iBAT

start /w /max "" "D:\Program Files\KuGou2012\KuGou.exe"
echo start come from bat

pause

13、CALL

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

  调用一条批处理命令,和直接执行命令效果一样,特殊情况下很有用,比如变量的多级嵌套,见教程后面。在批处理编程中,可以根据一定条件生成命令字符串,用call可以执行该字符串,见例子。

(1)调用的其它批处理程序。filename 参数必须具有 .bat 或 .cmd 扩展名,也可执行其它格式的可执行文件

语法:CALL [drive:][path]filename [batch-parameters]

(2)call具有goto的功能,在程序中实现灵活跳转,被调用的命令段以标签:label开头以命令goto :eof结尾

语法:CALL :label arguments

另外,批脚本文本参数参照(%0、%1、等等)已如下改变:
批脚本里的 %* 指出所有的参数(如 %1 %2 %3 %4 %5 ...)。批参数(%n)的替代已被增强。您可以使用以下语法:(看不明白的直接运行后面的例子)
         %~1         - 删除引号("),扩充 %1
         %~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 的输出行。

    在上面的例子中,%1 和 PATH 可以被其他有效数值替换。
%~ 语法被一个有效参数号码终止。%~ 修定符不能跟 %*使用
注意:参数扩充时不理会参数所代表的文件是否真实存在,均以当前目录进行扩展

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

@echo off
Setlocal enabledelayedexpansion
::CODER BY dsw POWERD BY iBAT

echo 产生一个临时文件 > tmp.txt

Rem 下行先保存当前目录,再将c:\windows设为当前目录
pushd c:\windows

Call :sub tmp.txt

Rem 下行恢复前次的当前目录
Popd

Call :sub tmp.txt
pause

Del tmp.txt

exit

:sub
echo 删除引号: %~1
echo 扩充到路径: %~f1
echo 扩充到一个驱动器号: %~d1
echo 扩充到一个路径: %~p1
echo 扩充到一个文件名: %~n1
echo 扩充到一个文件扩展名: %~x1
echo 扩充的路径指含有短名: %~s1
echo 扩充到文件属性: %~a1
echo 扩充到文件的日期/时间: %~t1
echo 扩充到文件的大小: %~z1
echo 扩展到驱动器号和路径:%~dp1
echo 扩展到文件名和扩展名:%~nx1
echo 扩展到类似 DIR 的输出行:%~ftza1
Goto :eof

 

程序1:father.bat
@echo off Setlocal enabledelayedexpansion ::CODER BY dsw POWERD BY iBAT
set a=1 pause echo call child.bat call child.bat echo end call pause echo %b% pause

程序2:
child.bat

 @echo off
 Setlocal enabledelayedexpansion
 ::CODER BY dsw POWERD BY iBAT

 echo %a%

 set b=20
 echo b=%b%

 pause

输出:

请按任意键继续. . .
call xe.bat
1
b=20
请按任意键继续. . .
end call

注意,这个实验中,main.bat定义了变量a为1,在child.bat中定义了变量b为1
main.bat首先将call child.bat,然后child.bat将echo %a%,现在能正常显示1。call完之后,main.bat将echo %b%,也能正常显示20

如果将call改为start,待child.bat执行完再关闭之后,main.bat继续echo %b%,将无法显示变量b的值

call的时候,他们拥有同一个壳cmd.exe,在同一个进程当中,所以他们的变量是互通的

Call和Start的区别

1、call用来调用执行另一个bat或者cmd文件(当然也可执行其它格式的可执行文件),start用来调用执行其他格式的可执行文件(exe,com,vbs...)。

2、call具有goto的功能,在程序中实现灵活跳转,而start则不具有这种功能

对于start,概况二句话:“不同进程不能传值”,“相同进程单向传值,老子传儿子,非儿子传老子“
对于call,“同一进程,变量互通”
  start的时候,他们拥有两个壳cmd.exe,但在不同的进程当中,而由于这是他们的壳都是cmd.exe,所以child.bat可以看成是main.bat的子进程,子进程可以读取父进程中的变量,但不能赋予父进程变量的值。而当start的程序不同的壳的时候,他们就不是父子进程关系。


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 ,再输入这条命令

12、pushd 和 popd

pushd 先保存当前目录,在将指定目录设置为当前目录

popd  将上次调用pushd时的目录作为当前目录

@echo off
Setlocal enabledelayedexpansion
::CODER BY dsw POWERD BY iBAT

echo 产生一个临时文件 > tmp.txt

Rem 下行先保存当前目录,再将c:\windows设为当前目录
pushd c:\windows

Call :sub tmp.txt

Rem 下行恢复前次的当前目录
Popd

Call :sub tmp.txt
pause

Del tmp.txt

exit

:sub
echo 删除引号: %~1
echo 扩充到路径: %~f1
echo 扩充到一个驱动器号: %~d1
echo 扩充到一个路径: %~p1
echo 扩充到一个文件名: %~n1
echo 扩充到一个文件扩展名: %~x1
echo 扩充的路径指含有短名: %~s1
echo 扩充到文件属性: %~a1
echo 扩充到文件的日期/时间: %~t1
echo 扩充到文件的大小: %~z1
echo 扩展到驱动器号和路径:%~dp1
echo 扩展到文件名和扩展名:%~nx1
echo 扩展到类似 DIR 的输出行:%~ftza1
Goto :eof

 

14、shift
更改批处理文件中可替换参数的位置。
SHIFT [/n]
如果命令扩展名被启用,SHIFT 命令支持/n 命令行开关;该命令行开关告诉
命令从第 n 个参数开始移位;n 介于零和八之间。

例如:

SHIFT /2
会将 %3 移位到 %2,将 %4 移位到 %3,等等;并且不影响 %0 和 %1。

 

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

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

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

例:

attrib C:\dsw.bat +R +S
上面的命令将把dsw.bat设置为只读、系统属性


16、多选择功能

@echo off
Setlocal enabledelayedexpansion
::CODER BY dsw POWERD BY iBAT

echo.
echo.

:cho
set /p choice=请选择:

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

 

17、tskill

tskillTSKILL processid | processname [/SERVER:servername] [/ID:sessionid | /A] [/V]

   processid            要结束的进程的 Process ID。
   processname              要结束的进程名称。
   /SERVER:servername    含有 processID 的服务器(默认值是当前值)。使用进程名和 /SERVER 时,必须指定/ID 或 /A
   /ID:sessionid            结束在指定会话下运行的进程。
   /A                         结束在所有会话下运行的进程。
   /V                           显示正在执行的操作的信息。

     

18、TASKKILL [/S system [/U username [/P [password]]]]

         { [/FI filter] [/PID processid | /IM imagename] } [/F] [/T]

taskkill命令主要的好处是带很多筛选器,可以批量结束进程

描述:

这个命令行工具可用来结束至少一个进程。可以根据进程 id 或图像名来结束进程。

参数列表:

    /S    system 指定要连接到的远程系统。

    /U    [domain\]user 指定应该在哪个用户上下文执行这个命令。

    /P    [password] 为提供的用户上下文指定密码。如果忽略,提示输入。

    /F 指定要强行终止进程。

    /FI   filter 指定筛选进或筛选出查询的的任务。

    /PID  process id 指定要终止的进程的PID。

    /IM   image name 指定要终止的进程的图像名。通配符 '*'可用来指定所有图像名。

    /T                      Tree kill: 终止指定的进程和任何由此启动的子进程。

筛选器:
     筛选器名       有效运算符             有效值
     -----------     ---------------            --------------
     STATUS          eq, ne              运行 | 没有响应
     IMAGENAME       eq, ne              图像名
     PID             eq, ne, gt, lt, ge, le   PID 值
     SESSION         eq, ne, gt, lt, ge, le 会话编号
     CPUTIME         eq, ne, gt, lt, ge, le    CPU 时间,格式为
                                             hh:mm:ss。
                                             hh - 时,
                                             mm - 钟,ss - 秒
     MEMUSAGE        eq, ne, gt, lt, ge, le   内存使用,单位为 KB
     USERNAME        eq, ne             用户名,格式为[domain]user
     MODULES         eq, ne            DLL 名
     SERVICES         eq, ne           服务名
     WINDOWTITLE     eq, ne              窗口标题 

注意: 只有带有筛选器的情况下,才能跟 /IM 切换使用通配符 '*'。

注意: 远程进程总是要强行终止,不管是否指定了 /F 选项。

例如:

    TASKKILL /S system /F /IM notepad.exe /T

    TASKKILL /PID 1230 /PID 1241 /PID 1253 /T

    TASKKILL /F /IM notepad.exe /IM mspaint.exe

    TASKKILL /F /FI "PID ge 1000" /FI "WINDOWTITLE ne untitle*"

    TASKKILL /F /FI "USERNAME eq NT AUTHORITY\SYSTEM" /IM notepad.exe

    TASKKILL /S system /U domain\username /FI "USERNAME ne NT*" /IM *

TASKKILL /S system /U username /P password /FI "IMAGENAME eq note*"

 

19、shutdown

shutdown [-i | -l | -s | -r | -a] [-f] [-m \\\\computername] [-t xx] [-c \"mment\"] [-d up:xx:yy]

        没有参数                   显示此消息(与 ? 相同)

        -i                            显示 GUI 界面,必须是第一个选项

        -l                            注销(不能与选项 -m 一起使用)

        -s                           关闭此计算机

        -r                           关闭并重启动此计算机

        -a                           放弃系统关机

        -m \\\\computername      远程计算机关机/重启动/放弃

        -t xx                        设置关闭的超时为 xx 秒

        -c \"comment\"               关闭注释(最大 127 个字符)

        -f                           强制运行的应用程序关闭而没有警告

        -d [u][p]:xx:yy               关闭原因代码

                                     u 是用户代码

                                     p 是一个计划的关闭代码

                                     xx 是一个主要原因代码(小于 256 的正整数)

                                     yy 是一个次要原因代码(小于 65536 的正整数)

列:

shutdown /f /s /t 0     //强制立即关机

 

20、At

AT [\\computername] [ [id] [/DELETE] | /DELETE [/YES]]

AT [\\computername] time [/INTERACTIVE]

    [ /EVERY:date[,...] | /NEXT:date[,...]] "command"

 

\\computername 指定远程计算机。 如果省略这个参数,会计划在本地计算机上运行命令。

id                      指定给已计划命令的识别号。

/delete                删除某个已计划的命令。如果省略 id,计算机上所有已计划的命令都会被删除。

/yes                      不需要进一步确认时,跟删除所有作业的命令一起使用。

time                      指定运行命令的时间。

/interactive            允许作业在运行时,与当时登录的用户桌面进行交互。

/every:date[,...]     每个月或每个星期在指定的日期运行命令。如果省略日期,则默认为在每月的本日运行。

/next:date[,...]      指定在下一个指定日期(如,下周四)运行命令。如果省略日期,则默认为在每月的本日运行。

"command"           准备运行的 Windows NT 命令或批处理程序。

例1、每月的1、5号的0点自动关机
at 00:00 /every:1,5shutdown /f /s /t 0

例2:每周一的12:00自动关机
at 12:00 /every:Monday shutdown /f /s /t 0

例3:每天12:00自动关机
at 12:00 /every:Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday shutdown /f /s /t 0

即使用every参数,例3中的每天自动关机可以简写为:
at 12:00 /every:Su,M,T,W,Th,F,Sa shutdown /f /s /t 0

要取消这个定时关机的话,有两种方法

方法一、命令行
不带任何参数执行at,将会列出已经设定的内容,记下状态ID号,比如本例为1,然后输入:
at 1 /delete
也可以简写为:
at 1 /d
不加序列号使用/d参数将会删除所有设定的内容,如果想不经确认删除所有设定的内容,可用:at /d /y

21、chkdsk

chkdsk [drive:][path] filename] [/f] [/v] [/r] [/l[:size] [/x]

说明:

如果在没有参数的情况下使用,则 chkdsk 显示当前驱动器中的磁盘状态。

drive: :指定要 chkdsk 检查的磁盘所在的驱动器。

[path] filename :指定需要 chkdsk 检查碎片整理的文件或文件集的位置和名称。使用通配字符(* 和 ?)可以指定多个文件。

/f :修复磁盘错误必须锁定磁盘。如果 chkdsk 不能锁定驱动器,则它将在下一次重新启动计算机时检查该驱动器。

/v :当检查磁盘时,显示所有目录中每个文件的名称。

/r :定位坏扇区并恢复可读取的信息。必须锁定磁盘。

/l[:size] :仅限于 NTFS。将日志文件的大小更改为输入的大小。如果不输入新内容,则显示当前大小。

/x :仅限于 NTFS。如果必要,首先强制卸载卷。然后所有对卷打开的句柄将变为无效。该开关也包含 /f 开关的功能。

/i :仅限于 NTFS。对索引项执行充分检查,降低运行 chkdsk 的所用时间量。

/c :仅限于 NTFS。跳过文件夹结构中的周期检查,减少运行 chkdsk 所需的时间量。

 

第二节 常用特殊符号
    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、@  命令行回显屏蔽符

  这个字符在批处理中的意思是关闭当前行的回显。我们从前几课知道echo off可以关闭掉整个批处理命令的回显,但不能关掉echo off这个命令,现在我们在echo off这个命令前加个@,就可以达到所有命令均不回显的要求

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

例:最简单的复制文件自身的方法
  copy %0 d:\wind.bat

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

@echo off
Setlocal enabledelayedexpansion
::CODER BY dsw POWERD BY iBAT

set a=10
echo %a     ::是在CMD命令行执行用的
echo %%a    ::是在For循环中用的
echo %a%    ::调用普通变量

pause


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

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

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

echo hello > 1.txt
echo world >>1.txt

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

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

这三个命令也是管道命令,但它们一般不常用,你只需要知道一下就ok了,当然如果想仔细研究的话,可以自己查一下资料。(本人已查过,网上也查不到相关资料)
< 输入重定向命令,从文件中读入命令输入,而不是从键盘中读入。

@echo off
Setlocal enabledelayedexpansion
::CODER BY dsw POWERD BY iBAT

echo 2005-05-01>temp.txt
date <temp.txt
del  temp.txt
echo date

pause
exit

 

这样就可以不等待输入直接修改当前日期

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

常用句柄:0、1、2,3—9未定义句柄:

  >nul 意思是屏蔽命令输出内容。

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

句柄0:标准输入stdin,键盘输入
句柄1:标准输出stdout,输出到命令提示符窗口(console,代码为CON)
句柄2:标准错误stderr,输出到命令提示符窗口(console,代码为CON)
其中的stdin可被<重定向,stdout可被>、>>重定向。

我们已经知道读取文本中的内容可以用for命令,但如果只需要读取第一行用for命令就有点麻烦。简单的办法如下:

@echo off
Setlocal enabledelayedexpansion
::CODER BY dsw POWERD BY iBAT

set /p str=<%0
echo %str%

pause
exit

运行显示批处理文件自身的第一行:@echo off

6、|  命令管道符

格式:第一条命令 | 第二条命令 [| 第三条命令...]
将第一条命令的结果作为第二条命令的参数来使用,记得在unix中这种方式很常见。

例如:

dir c:\|find "txt"

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

在不使format的自动格式化参数时,我是这样来自动格式化A盘的

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

用过format的都知道,再格盘时要输入y来确认是否格盘,这个命令前加上echo y并用|字符来将echo y的结果传给format命令

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

(这条命令有危害性,测试时请慎重)

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

比如:
echo test ^>1.txt

结果则是:test > 1.txt。他没有追加在1.txt里,只是显示了出来

另外,此转义字符还可以用作续行符号。
举个简单的例子:

@echo off
Setlocal enabledelayedexpansion
::CODER BY dsw POWERD BY iBAT

echo 英雄^
是^
好^
男人

pause
exit

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

为什么转义字符放在行尾可以起到续行符的作用呢?原因很简单,因为每行末尾还有一个看不见的符号,即回车符,转义字符位于行尾时就让回车符失效了,从而起到了续行的作用。

8、&  组合命令

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

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

这个符号允许在一行中使用2个以上不同的命令,当第一个命令执行失败了,也不影响后边的命令执行。
这里&两边的命令是顺序执行的,从前往后执行。
比如:

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

以上命令会连续显示z,y,c盘的内容,不理会该盘是否存在

9、&& 组合命令

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

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

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

10、||  组合命令

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

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

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

问题:把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

11、""  字符串界定符

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

cd "program files"

cd progra~1

cd pro*

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

13、; 分号

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

比如:

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

以上命令相当于
dir c:\
dir d:\
dir e:\
dir f:\

如果其中z盘不存在,运行显示:系统找不到指定的路径。然后终止命令的执行。

例:dir c:\;d:\;e:\1.txt
以上命令相当于
dir c:\
dir d:\
dir e:\1.txt
其中文件e:\1.txt不存在,但e盘存在,有错误提示,但命令仍会执行。
如果目标路径不存在,则终止执行;如果路径存在,仅文件不存在,则继续执行

14、() 括号
小括号在批处理编程中有特殊的作用,左右括号必须成对使用,括号中可以包括多行命令,这些命令将被看成一个整体,视为一条命令行。
括号在for语句和if语句中常见,用来嵌套使用循环或条件语句,其实括号()也可以单独使用,请看例子:
命令:echo 1 & echo 2 & echo 3
可以写成:

(

echo 1

echo 2

echo 3

)

上面两种写法效果一样,这两种写法都被视为是一条命令行。
注意:这种多条命令被视为一条命令行时,如果其中有变量,就涉及到变量延迟的问题。

15、! 感叹号
没啥说的,在变量延迟问题中,用来表示变量,即%var%应该表示为!var!,请看前面的setlocal命令介绍。

posted @ 2016-04-26 18:55  滴水瓦  阅读(9569)  评论(0)    收藏  举报