批处理文件的使用

在Linux系统下,批处理通过shell脚本完成,而在windows平台下,批处理的文件后缀为.bat。bat文件其实就是dos命令的集合
bat文件是dos下的批处理文件。批处理文件是无格式的文本文件,它包含一条或多条命令。它的文件扩展名为 .bat 或 .cmd。在命令提示下输入批处理文件的名称,或者双击该批处理文件,系统就会调用cmd.exe按照该文件中各个命令出现的顺序来逐个运行它们。使用批处理文件(也被称为批处理程序或脚本),可以简化日常或重复性任务。入侵者常常通过批处理文件的编写来实现多工具的组合入侵、自动入侵及结果提取等功能。
注意编辑bat文件请使用ANSI编码(不然会出现中文乱码)

bat脚本常用命令

1.echo命令

echo命令用于打开回显(语句会在命令行中显示)或关闭请求回显功能(语句不会在命令行中显示),也可用于显示消息。如果没有任何参数,echo命令将显示当前回显设置

echo的命令格式为“echo [on/off]/[message]”。其中“/”代表选择,“[]”表示类。这条命令的含义代表有3种输出方式:echo on;echo off;echo [message]

echo on 打开回显;直到出现echo off后才会关闭回显

echo off 关闭回显;直到出现echo on后才会打开回显

echo message显示消息

往往和@一起使用

[echo.命令]

换行命令,即echo后加一个点

[@命令]

@用于隐藏(@后面)当前命令行的文件路径和命令。批处理文件执行时,在命令行窗口中会显示当前正在运行的命令,为了达到更好的隐蔽性,入侵者可以使用@命令隐藏

如何使用bat脚本运行python bat脚本命令_重定向


echo %CD% #代表当前目录的字符串

echo %DATE% #当前日期

echo %TIME% #当前时间

@echo off //表示在此语句后,所有运行的命令都不显示命令行本身,只显示每一条命令的运行结果

2.goto命令
goto命令用于跳转到标签指定的位置并从标签的下一行命令开始执行。命令格式为“goto label”,其中label为标签。标签的名字任意,但是最好是有意义的字母。在字母前需要加“:”号来表示这个字母是标签。goto命令就是根据这个:来寻找下一步跳到那里。最好有一些说明,这样别人看起来才会理解你的意图。

@echo off
::使用冒号加标记名作为goto语句的标记
:start
set /p param=
echo %param%
if %param%==4 echo 请不要输入4! & goto start
pause
if {%1}=={} goto noparms 
if {%2}=={} goto noparms(如果这里的if、%1、%2你不明白的话,先跳过去,后面会有详细的解释。) 
:noparms 
echo Usage: monitor.bat ServerIP PortNumber 
goto end

3.rem命令

<1>注释命令,可以回显(语句会在命令行中显示),在C语言中相当与/--------/,它并不会被执行,只是起一个注释的作用 ,便于别人阅读和你自己日后修改

格式:rem message

<2>::两个冒号,效果同上,但不会回显。(冒号后加任意非字母数字字符都可起到注释作用)

如何使用bat脚本运行python bat脚本命令_重定向_02


4.>>,>与<,>&,<&与&,&&与|,||与^

(1)重定向(>>, > )

">>“与”>"都是输出重定向命令,即把前面命令的流文字重定向写入到一个文件中。二者的唯一区别是,>命令在清除掉原有文件中的内容后才把新的内容写入原文件,而>>命令会另起一行把新的内容追加到原文件中。

追加内容:">>"在文末添加;">"覆盖原内容

(2)重定向(<, >&, <&)

  1. “<”
    <,输入重定向命令。即从文件中读入命令输入,而不是从键盘中读入。
    echo 2005-05-01>temp.txt
    date <temp.txt
  2. “>&”, “<&”
    “>&”,将一个句柄的输出写入到另一个句柄的输入中。
    “<&”,从一个句柄读取输入并将其写入到另一个句柄输出中。
    常用句柄:0、1、2,未定义句柄:3—9
    1>nul 表示禁止输出正确的信息
    2>nul 表示禁止输出错误信息。
    其中1与2都是代表某个数据流输入输出的地址(NT CMD称之为句柄,MSDOS称之为设备)。
    句柄0:标准输入stdin,键盘输入
    句柄1:标准输出stdout,输出到命令提示符窗口(console,代码为CON)
    句柄2:标准错误stderr,输出到命令提示符窗口(console,代码为CON)
    其中:stdin可被<重定向,stdout可被>、>>重定向。

(3)组合命令(&, &&, ||)
&,组合连接命令。即它可以连接n个DOS命令,然后按顺序执行,并且会忽略执行失败的命令。
语法:第一条命令 & 第二条命令 [& 第三条命令…]
顾名思义,就是可以把多个命令组合起来当一个命令来执行。这在批处理脚本里是允许的,而且用的非常广泛。因为批处理认行不认命令数目。这个符号允许在一行中使用2个以上不同的命令,当第一个命令执行失败了,也不影响后边的命令执行。这里&两边的命令是顺序执行的,从前往后执行。
比如:dir z:/ & dir y:/ & dir c:/
以上命令会连续显示z,y,c盘的内容,不理会该盘是否存在

&&,组合连接命令。它可以把它前后两个命令组合起来当一个命令来用。但是和&命令不同的是,&&会检测是否有执行出错的命令,一旦发现出错后将不继续执行剩下的命令。
语法:第一条命令 && 第二条命令 [&& 第三条命令…]
用这种方法可以同时执行多条命令,当碰到执行出错的命令后将不执行后面的命令,如果一直没有出错则一直执行完所有命令。这个命令和上边的类似,但区别是,第一个命令失败时,后边的命令也不会执行。
比如:dir z:/ && dir y:/ && dir c:/

||,用法和&&几乎一样,但作用恰恰相反:当遇到一个执行正确的命令时,就退出此命令组合,不再继续执行下面的命令。

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

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

提示:组合命令和重定向命令一起使用必须注意优先级

管道命令( | )的优先级高于重定向命令(>,>>,<,>&,<&),重定向命令的优先级高于组合命令(&,&&,||)

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

(4)|

|,作用是让前一命令的输出当做后一命令的输入。

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

如:dir c:/|find “txt”

以上命令是:查找C:/所有,并发现TXT字符串。

FIND的功能请用 FIND /? 自行查看

(5)转义字符(^)

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

如:

echo test ^>1.txt

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

另外,此转义字符还可以用作续行符号。

举个简单的例子:

如何使用bat脚本运行python bat脚本命令_重定向_03


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

CR(0D) 命令行结束符

Escape(1B) ANSI转义字符引导符

Space(20) 常用的参数界定符

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

+ COPY命令文件连接符

* ? 文件通配符

/ 参数开关引导符

: 批处理标签引导符

5.设置标题、查看返回码errorlevel

@echo off
::title设置标题
title 我测试一下!
::用以判断上一条命令是否执行成功,默认为0,出错为1
echo %errorlevel%
if %errorlevel% == 0 echo 没问题
pause

如何使用bat脚本运行python bat脚本命令_句柄_04


6.设置颜色

color设置控制台前景和背景颜色。具体可以在cmd下用“color /?”查询。颜色属性由两个十六进制数字指定,第一个数字表示背景色,第二个数字表示文字显示的颜色。

例:color 0A

如何使用bat脚本运行python bat脚本命令_重定向_05


7.call命令

用于在一个批处理程序中调用另一个批处理程序,此调用过程中只是暂时挂起父批处理程序,当子批处理程序运行完毕后会返回父批处理程序继续执行

常用的命令格式为“call [path] filename”,其中path是要调用的批处理文件的位置,可选,默认是与父批处理程序在同一目录下;filename用于指定子批处理程序的文件名,其必须包含有.cmd或.bat扩展名

::该文件名为test.bat

@echo off
echo 这是主程序第一个输出
timeout 2
call test1.bat param1 param2
timeout 2
echo 这是主程序第二个输出
pause
::该文件名为test1.bat
@echo off
timeout 1
echo 这是子程序第一个输出
echo 这是接收到的第一个参数%1 和第二个参数%2
pause

8.set命令
set,显示、设置或删除变量。有三种基本格式:
1.set 显示环境变量
如:在命令行下输入:
set 会显示当前所有的系统环境变量
set c 会显示所有的以c开头或C开头的变量(也即不区分大小写);
set com 会显示所有的以com开头或COM开头的变量(不区分大小写);
2.set 设置环境变量
set [variable=[string]];
如:set str=ok
2.带参数 /a的set 数值计算
set /a 表达式;
/a 命令行开关指定等号右边的字符串为被评估的数字表达式。
set的/A参数就是让SET可以支持数学符号进行加减等一些数学运算!

@echo off
set /p num=请输入一个数字(不要超过2147483647):
REM 批处理能处理的数字不能超过32位(二进制)
set /a num*=2
echo 这个数字的两倍是%num%
pause>nul
set /a var+=1 这样的语法对应原始语法就是set /a var = %var% + 1

3. 带参数 /p 的set 等待用户输入
set /p variable=[promptString](=号右边的promptString是提示语,不是变量的值)。
等待用户输入数据(开关/P)

@echo off
set /p param=请输入密码:
echo %param%
pause
@echo off
set /p str=<%0
echo %str%
pause

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

9.if语句
if表示将判断是否符合规定的条件,从而决定执行不同的命令。有三种格式:
1.if“参数” == “字符串” 待执行的命令
参数如果等于指定的字符串,则条件成立,运行命令,否则运行下一句。(注意是两个等号)
if "%1"“a” format a:
if {%1}
{} goto noparms
if {%2}=={} goto noparms
2. if exist 文件名 待执行的命令
如果有指定的文件,则条件成立,运行命令,否则运行下一句。
if exist config.sys edit config.sys
if errorlevel / if not errorlevel 数字 待执行的命令
如果返回码等于指定的数字,则条件成立,运行命令,否则运行下一句。
if errorlevel 2 goto x2

@echo off
set a=123
set b=abc
set c=12
::/i字符串大小写忽略
if /i %b% equ ABC (
  if %a% geq %c% (
    echo %a%^>=%c%
  ) else (
    echo %a%^<%c%
  )
) else (
  echo %b%不等于ABC
)
pause>nul

如上的操作数可以是字符串、数值、变量;当参与比较的字符串是字符串时,将被转换为对于的ASCII码进行比较;比较运算符有如下:

如何使用bat脚本运行python bat脚本命令_如何使用bat脚本运行python_06


10.start命令

调用外部程序,所有的DOS命令和命令行程序都可以由start命令来调用

注意:执行start时将开启一个新线程来执行该程序,原程序不受影响继续执行

@echo off
::打开test.txt文件
start e:\test.txt
::启动jar包
start java -jar e:\demo.jar
pause
::打开百度
start iexplore http://www.baidu.com

11.变量%0--%9
%0指该文件本身,%1–%9为接收到的参数,如下例子中,子程序的%1即为主程序传输的param1,%2即为param2

::该文件名为test.bat
@echo off
echo 这是主程序第一个输出
timeout 2
start test1.bat param1 param2
timeout 2
echo 这是主程序第二个输出
pause
::该文件名为test1.bat
@echo off
timeout 2
echo 这是子程序第一个输出
echo 这是接收到的第一个参数%1 和第二个参数%2
pause

12.切换目录

::@echo off
::显示当前目录
cd
::切换到根目录
cd\
::盘符加冒号,切换到该盘
d:
::切换到e:hi目录下(目录名不区分大小写)
cd /d e:\hi
::保存当前目录,并切换当前目录为d:\test
pushd d:\test
::恢复当前目录为刚才保存的e:\hi
popd
pause

13.md命令创建文件夹
make directory的缩写(创建目录)。例子如下:

::创建文件夹
md e:\test\test1
::文件夹名有空格需要加引号
md "e:\test op"
::空格隔开,创建多个
md e:\test1 e:\test9\test2 "e:\test5 lmn"

14.rd命令删除文件夹
remove directory的缩写(删除目录)。例子如下:

@echo off
::删除e:\test9空文件夹,不为空不能删除
rd "e:\test op"
::删除e:\test9下所有文件夹,不管是否为空,但会询问是否确认删除[Y/N]
rd /s e:\test9
::自定义删除提示信息
echo 是否删除[Y/N]: & rd /s e:\test9>nul
::/s/q联合使用,不会询问直接删除
rd /s/q e:\test9

15.move命令移动文件(夹)

@echo off
::文件夹移动,如果test文件夹存在,则将test5文件夹移动到test文件夹下
::如果test文件夹不存在,则将test5文件夹移动到test1文件夹下并重命名为test
::注意:文件夹移动不能跨分区
move e:\test5 e:\test1\test
::将d:\test\1.txt文件移动到e:\下并重命名为23.txt
::如果该目录已存在23.txt,则会覆盖
move d:\test\1.txt e:\23.txt>nul&&echo 移动成功并重命名
::将e:\23.txt文件移动到e:\test文件夹下
move e:\23.txt e:\test>nul&&echo 移动到文件夹下

16.del命令删除文件
delete的缩写(删除)。用于删除指定磁盘、目录中的一个或一组文件。

@echo off
::删除该层目录下的所有文件,需要确认[Y/N]
del d:\test
pause
::不需要确认
del /q d:\test
::删除该目录下所有层级的文件,不删除文件夹,需要逐个文件夹确认
del /s d:\test
::删除文件111.png,不需要确认
del d:\test\111.png

17.cope命令复制文件

@echo off
::将d:\test\test.txt复制到e:\test1\目录下并重命名为test2.txt
::如果test2.txt文件已存在,将自动覆盖
copy d:\test\test.txt e:\test1\test2.txt
::将e:\test该层目录下所有文件复制到d:\test1\test3文件夹下
::前提d:\test1\test3文件夹必须已存在
::相同文件名的文件会被覆盖
copy e:\test d:\test1\test3

18.xcope命令复制文件

@echo off
::将e:\test目录下所有文件(夹)复制到d:\test1
::/e目录下所有文件(夹),/y已存在时直接覆盖
xcopy e:\test d:\test1 /e/y

19.cope命令合并文件

@echo off
cd /d d:\test
::将129.txt和156.txt两个文件内容合并存入新建的new.txt中
copy 129.txt+156.txt new.txt
::打印出new.txt中的内容
type new.txt
::将d:\mp3\111.mp3和e:\2.mp3以二进制数据合并复制到d:\new.mp3
::其中/b二进制,/a文本形式
copy /b d:\mp3\111.mp3+e:\2.mp3 d:\new.mp3

20.ren命令重命名文件(夹)
rename的缩写(重新命名)。用于对指定磁盘、目录中的一个文件或一组文件更改名称。
[格式] ren [C:][path]filename1[.ext] filename2[.ext]

@echo off
::将1.txt重命名为58.bat
ren d:\test\1.txt 58.bat
::将d:\test\目录下所有文件名为1开头的txt文件改为bat文件
ren d:\test\1*.txt *.bat
::将d:\test\目录下所有文件名为1开头三个字符的bat改为txt文件
ren d:\test\1??.bat ???.txt

21.timeout延迟

@echo off
set a=1
:start
echo %a%&set /a a=a+1
timeout 1 > nul
goto start
pause
@echo off
::每隔一秒输出斐波拉契数列
set a=1
set b=1
echo %a%&timeout 1 >nul
echo %b%&timeout 1 >nul
:start
set /a c=a+b
echo %c%&set a=%b%&set b=%c%
timeout 1 > nul
goto start
pause

22.调用弹框

::一、MSG命令方式
@echo off
::/time:5设置时间弹框的显示时间为5S,5S后自动关闭
msg * /time:5 这里是弹窗显示的文本
pause
::设置弹窗的多行文本
(echo 这是弹窗的第一行文本
echo 这是第二行文本)|msg * /time:5
pause
::一、调用VBScript的MsgBox实现弹窗
@echo off
::第二个参数65的解释在代码之后的列表中
mshta vbscript:msgbox("弹窗单行显示内容",65,"弹窗的标题")(window.close)
::多行显示文本可在文本中使用vbCrLf或vbNewLine
set msg="多行显示vbCrLf这是第二行vbNewLine这是第三行"
mshta vbscript:msgbox(Replace(Replace(%msg%,"vbCrLf",vbCrLf),"vbNewLine",vbNewLine),6,"自定义标题")(window.close)

MsgBox的button参数取值如下:
0 = vbOKOnly - 只显示确定按钮。
1 = vbOKCancel - 显示确定和取消按钮。
2 = vbAbortRetryIgnore - 显示放弃、重试和忽略按钮。
3 = vbYesNoCancel - 显示是、否和取消按钮。
4 = vbYesNo - 显示是和否按钮。
5 = vbRetryCancel - 显示重试和取消按钮。
16 = vbCritical - 显示临界信息图标。
32 = vbQuestion - 显示警告查询图标。
48 = vbExclamation - 显示警告消息图标。
64 = vbInformation - 显示信息消息图标。
0 = vbDefaultButton1 - 第一个按钮为默认按钮。
256 = vbDefaultButton2 - 第二个按钮为默认按钮。
512 = vbDefaultButton3 - 第三个按钮为默认按钮。
768 = vbDefaultButton4 - 第四个按钮为默认按钮。
0 = vbApplicationModal-应用程序模式,用户必须响应消息框才能继续在当前应用程序中工作。
4096 = vbSystemModal - 系统模式:在用户响应消息框前,所有应用程序都被挂起。
注意:
第一组值 (0 - 5) 用于描述对话框中显示的按钮类型与数目;
第二组值 (16, 32, 48, 64) 用于描述图标的样式;
第三组值 (0, 256, 512) 用于确定默认按钮;
第四组值 (0, 4096) 则决定消息框的样式。在将这些数字相加以生成 buttons 参数值时,只能从每组值中取用一个数字。
23.获得管理员权限
尝试以下两种方式

@ echo off
%1 %2
ver|find "5.">nul&&goto :Admin
mshta vbscript:createobject("shell.application").shellexecute("%~s0","goto :Admin","","runas",1)(window.close)&goto :eof
:Admin
::上面这段代码之后执行的所有东西都是管理员权限方式
@echo off
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\
config\system"
if '%errorlevel%' NEQ '0' (
	echo 请求管理员权限...
	goto UACPrompt
) else ( goto gotAdmin )
:UACPrompt
echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
"%temp%\getadmin.vbs"
exit /B
:gotAdmin
echo 获得管理员权限
pause

24.for语句
for命令是一个比较复杂的命令,主要用于参数在指定的范围内循环执行命令。在批处理文件中使用for命令时,指定变量请使用 %%variable。其实也就和高级程序语言中的for大同小异,其语法如下:
for %%variable IN (set) DO command [command-parameters]
%%variable:指定一个单一字母可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。(*.bat *.txt)
Command:指定对每个文件执行的命令。
command-parameters:为特定命令指定参数或命令行开关。

@echo off
::按行读取d:\test.txt文件中的内容,输出每行的第一个数据,默认每行内以空格和tab为分隔符
for /f %%i in (d:\test.txt) do echo %%i
::delims参数指定分隔符为/
for /f "delims=/" %%i in (d:\test.txt) do echo %%i
::tokens参数指定读取第二列,tokens=*读取所有
for /f "tokens=2 delims=/" %%i in (d:\test.txt) do echo %%i
::skip参数直接跳过前两行,从第三行开始
::tokens=2,*读取第二个和之后剩余所有,%%i为第一列值,%%j为之后剩余所有
::tokens=1,4读取第一个和第四个,%%i为第一列值,%%j为第四列值
::('net start')表示将单引号内语句的执行结果作为集合
for /f "skip=2 tokens=1,* delims=/" %%i in ('net start') do echo %%i %%j
::("asc/2ap/as5")表示对字符串进行处理
for /f "tokens=2,* delims=/" %%i in ("asc/2ap/as5") do echo %%i--%%j
::eol参数直接忽略以#开头的行
for /f "eol=# tokens=*" %%i in (d:\test.txt) do echo %%i
@echo off
for %%t in (*.bat *.txt) do type %%t

注意1,打印的是bat和txt文件的内容
注意2,此bat放在需打印文件内容的文件一个目录层级下
25.sc和net命令

@echo off
::关闭/启动MySQL服务,执行该条语句后会立即执行之后的代码,不会等待停止/启动的过程
sc stop MySQL
sc start MySQL
::设置MySQL服务为自启动,demand手动,disabled禁用
sc config MySQL start= auto
::安装服务
sc create MySQL binPath= "F:\installFiles\mysql-5.7.1.exe"
::卸载服务(卸载前先关闭服务)
sc delete MySQL
::关闭/启动MySQL服务,等待停止/启动的过程,完成后执行之后的代码
net start MySQL
net stop MySQL
::查看所有运行的服务
net start

26.ping命令

@echo off
ping 192.168.0.225
::无休止ping某地址
ping www.baidu.com -t

27.mshta命令

::可以调用vb脚本和js脚本
mshta vbscript:window.execScript("alert('hello world!');","javascript")(window.close)
mshta javascript:window.execScript("msgBox('hello world!')(window.close)","vbs")
mshta vbscript:msgbox("弹窗单行显示内容",65,"弹窗的标题")(window.close)
mshta vbscript:CreateObject("Wscript.Shell").popup("弹窗内容",7,"标题",64)(window.close)
::连续弹二个信息框
mshta vbscript:execute("msgbox ""one BOX"":msgbox ""two BOX"":window.close")

28.choice
choice 使用此命令可以让用户输入一个字符(用于选择),从而根据用户的选择返回不同的errorlevel,然后于if errorlevel配合,根据用户的选择运行不同的命令。
注意:choice命令为DOS或者Windows系统提供的外部命令,不同版本的choice命令语法会稍有不同,请用choice /?查看用法。
choice参数列表:
/C choices指定要创建的选项列表。默认列表是 “YN”。
/N 在提示符中隐藏选项列表。提示前面的消息得到显示,选项依旧处于启用状态。
/CS 允许选择分大小写的选项。在默认情况下,这个工具是不分大小写的。
/T timeout做出默认选择之前,暂停的秒数可接受的值是从0到9999。如果指定了0,就不会有暂停,默认选项会得到选择。
/D choice在nnnn秒之后指定默认选项。字符必须在用 /C选项指定的一组选择中;同时,必须用/T指定 nnnn。
/M text指定提示之前要显示的消息。如果没有指定,工具只显示提示。
/? 显示帮助消息。

choice /C YNC /M "确认请按Y,否请按N,或者取消请按C。"
choice /T 10 /C ync /CS /D y
choice /C ab /M "选项1请选择a,选项2请选择 b。"
choice /C ab /N /M "选项1请选择a,选项2请选择b。
choice /C 123 /M "RUN1,RUN2,RUN3"

29.%与%var%
%:调用程序外部参数%1至%9
%var%:引用变量var
%0 %1 %2 %3 %4 %5 %6 %7 %8 %9 %为命令行传递给批处理的参数
%0 批处理文件本身,包括完整的路径和扩展名
%1 第一个参数
%9 第九个参数
%
从第一个参数开始的所有参数
参数%0具有特殊的功能,可以调用批处理自身,以达到批处理本身循环的目的,也可以复制文件自身等等。
例:最简单的复制文件自身的方法

copy %0 d:/wind.bat

%注释内容%(可以用作行内注释,不能出现重定向符号和管道符号)
30.pause
(1) pause,暂停命令。运行时,将显示下面的文字: Press any key to continue. . .(或者:请按任意键继续. . .)
(2) pause > nul的作用是同样的,区别是不显示“请按任意键继续. . .”
31.type
type,文本输出命令。
%[1-9]表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)分隔的字符串。变量可以从%0到%9,%0表示批处理命令本身,其它参数字符串用%1到%9顺序表示。
现在有一批处理文件t.bat在C盘根目录下,内容如下:

@echo off
type %1
type %2
pause

命令行输入C:/>t a.txt b.txt 运行,%1就表示a.txt,%2就表示b.txt,其他参数顺延
32.at
at,列出在指定的时间和日期在计算机上运行的已计划命令或计划命令和程序,例如at 12:00 “d:\abc.bat”。
33.net time命令
使计算机的时钟与另一台计算机或域的时间同步。
语法:net time [\ComputerName | /domain[:DomainName] | /rtsdomain[:DomainName]]
   [/set] [\ComputerName] /querysntp [\ComputerName] /setsntp[:NTP Server List]
参数:\ComputerName指定要检查或要与之同步的服务器的名称。
   /domain[ :DomainName]指定要同步时钟的域。
   /rtsdomain[:domainname]指定要与之同步时钟的“可信时间服务器”所在的域。
   /set使计算机的时钟与指定的计算机或域的时间同步。
   /querysntp显示当前为本地计算机或 ComputervNname 所指定的计算机配置的网络时间协议 (NTP) 服务器的名称。
   /setsntp[:NTPServerList]指定本地计算机所使用的 NTP 时间服务器的列表。该列表可以包含 IP地址或 DNS名称,
   并用空格分开。如果使用多个时间服务器,则必须使用引号引住该列表。
【备注】使用/set参数时可以直接在后面加上/y或/yes参数实现不询问直接更改时间:
net time \ComputerName /set /y
34.字符串替换与截取
【字符串替换】
%var:str1=str2%
上面语法的意思就是:将字符串变量%var%中的str1替换为str2
【字符串截取】:%a:~[m[,n]]%
%a:~0,n% 取左边n位
%a:~-m% 取右边m位
%a:~m,n% 从m+1位开始取n位
%a:~m,-n% 从m+1位开始,至倒数n+1位
%a:~m % 从m+1位开始取右边全部。

35.,/;/()/!/""字符串界定符
逗号相当于空格,在某些情况下“,”可以用来当做空格使
比如: dir,c:/
分号,当命令相同时,可以将不同目标用;来隔离,但执行效果不变,如执行过程中发生错误,则只返回错误报告,但程序仍会执行。
比如:

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盘存在,有错误提示,但命令仍会执行。
为什么?如果目标路径不存在,则终止执行;如果路径存在,仅文件不存在,则继续执行。
小括号在批处理编程中有特殊的作用,左右括号必须成对使用,括号中可以包括多行命令,这些命令将被看成一个整体,视为一条命令行。括号在for语句和if语句中常见,用来嵌套使用循环或条件语句,其实括号()也可以单独使用。

echo 1 & echo 2 & echo 3
::以上命令相当于
(
echo 1
echo 2
echo 3
)

上面两种写法效果一样,这两种写法都被视为是一条命令行。
注意:这种多条命令被视为一条命令行时,如果其中有变量,就涉及到变量延迟的问题。
感叹号在变量延迟问题中,用来表示变量,即%var%应该表示为!var!,请看前面的setlocal命令介绍。对于这样的"逻辑或取余操作符",我们需要把他们用双引号引起来,也可以用转义字符^
set /a var= 1 “&” 1 这样结果就显示出来了,其他逻辑或取余操作符用法
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
双引号允许在字符串中包含空格,进入一个特殊目录可以用如下方法
cd “program files”
cd progra~1
cd pro*
以上三种方法都可以进入program files这个目录
36.注释语句
<1>:: 注释内容 //不能出现重定向符号和管道符号
<2>: 注释内容 //注释文本不能与已有标签重名可以用作标签下方段的执行内容
<3>rem 注释内容 <4>%注释内容% //可以用作行间注释,不能出现重定向符号和管道符
<5> goto st //可以用作说明goto的条件和执行内容
注释内容:st <6> echo 注释内容 > nul //不能出现重定向符号和管道符号
<7> if not exist nul 注释内容 //不能出现重定向符号和管道符号
<8> :标签 注释内容 //可以用作标签下方段的执行内容
37.pause、cmd、@cmd.exe
挂起命令,当批处理文件运行到pause命令时,会出现“请按任意键继续…”的提示
运行pause 命令时,将显示下面的消息:Press any key to continue. . .
bat文件执行不立即消失的三种方法
<1>可以在程序的结尾加上:pause
注:此时我们可以看到dos窗口没有消失,但是如果点击键盘任意按键,dos还是会消失。此时,pause只是间隔停顿作用。
<2>可以在程序的末尾添加cmd
注:该bat文件同目录下最好不要有cmd命名的bat文件。此时程序运行结束后,可以看到结尾显示了dos的版本,并且可以继续输入指令。
<3>结尾输入@cmd.exe
注:这种方法的好处是不惧怕同目录下的cmd 为名的bat文件。执行bat后,结果和cmd方法是一样的,并且也可以继续输入指令;