批处理笔记

一、常见的命令

1、REM和::
2、ECHO和@
3、PAUSE
4、ERRORLEVEL
5、TITLE
6、COLOR
7、mode 配置系统设备
8、GOTO 和:
9、FIND
10、START
11、ASSOC和ftype
12、pushd和popd
13、CALL
14、shift
15、IF
16、setlocal与变量延迟
17、ATTRIB 显示或更改文件属性

二、命令解释

1、echo. 输出空行,相当于输入一个回车
echo 文件内容>文件名
echo 追加文件内容>>文件名
2、mode
mode con cols=113 lines=15 & color 9f
此命令设置DOS窗口大小:15行,113列
3、call

@echo off
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
echo.
goto :eof

4、setlocal与变量延迟
下面代码执行后结果为"4"
批处理运行命令的机制是按行读取的。先将一行整句读取并作预处理。

@echo off
set a=4
set a=5 & 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

启动变量延迟
下面代码返回结果为"5"

@echo off
::setlocal enabledelayedexpansion启动变量延迟,
::并且变量要用一对叹号"!!"括起来
setlocal enabledelayedexpansion
set a=4
set a=5 & echo !a!
pause

输出1,2,3,4,5

@echo off
setlocal enabledelayedexpansion
for /l %%i in (1,1,5) do (
set a=%%i
echo !a!
)
pause

三、常用特殊符号

1、%
引用变量用%var%,调用程序外部参数用%1至%9
%0 批处理文件本身,包括完整的路径和扩展名
%1 第一个参数
%9 第九个参数
%* 从第一个参数开始的所有参数
参数%0具有特殊的功能,可以调用批处理自身,以达到批处理本身循环的目的,也可以复制文件自身等等。
例:最简单的复制文件自身的方法
copy %0 d:\wind.bat
2、| 命令管道符
格式:第一条命令 | 第二条命令 [| 第三条命令...]
第一条命令的结果作为第二条命令的参数使用,记得unix中这种方式很常见。
例:
dir c:\ |find "txt"
以上命令是:查找C:\所有,并发现txt字符串。
3、^ 转义字符
echo test ^>1.txt
结果是:输出"test >1.txt"
4、& 组合命令
语法:第一条命令 & 第二条命令 [& 第三条命令]
当第一条命令执行失败了,也不影响后面命令的执行,里面的命令是顺序执行的,从前往后执行。
例如:
dir z:\ & dir y:\ & dir c:\
以上命令会连续执行显示z,y,c盘的内容,不理会该盘是否存在。
5、&& 组合命令
语法:第一条命令 && 第二条命令 [&& 第三条命令]
同时执行多条命令,当碰到执行出错的命令后将不执行后面的命令,如果一直没有出错则一直执行完所有目录。
这个命令和上边的类似,但区别是,第一个命令失败时,后边的命令也不会执行。
例如:
dir z:\ && dir y:\ && dir c:\
6、|| 组合命令
语法:第一条命令 || 第二条命令 [|| 第三条命令]
用这种方法可以同时执行多条命令,当第一条命令失败后才执行第二条命令,当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令。
提示:组合命令和重定向命令一起使用必须注意优先级
管道命令的优先级高于重定向命令,重定向命令的优先级高于组合命令。
dir c:\ >a.txt && dir d:\ >>a.txt:把C盘和D盘的文件和文件夹列出到a.txt文件中。
7、""字符串界定符
双引号允许在字符串中包含空格,进入一个特殊命令可以用如下方法

@echo off
cd "program files"
cd progra~1
cd pro*
pause  

8、, 逗号
逗号相当于空格,在某些情况下","可以当做空格使用
例如:
dir,c:\
9、; 分号
当命令相同时,可以将不同目标用;来隔离,但执行效果不变,如执行过程中发生错误,则只返回错误报告,但程序仍会执行。
例如:

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

10、() 括号
括号中可以包含多行命令,这些命令将被看成一个整体,视为一条命令行。
例:

@echo off
echo 1 & echo 2 & echo 3
可以写成
(
echo 1
echo 2
echo 3
)
pause

11、! 感叹号
在变量延迟中,用来表示变量,即%var%应该表示为!var!

四、DOS循环:for命令详解

1、基本格式
for %%variable in (set) do command [command-parameters]
参数:for有4个参数 /d /l /r /f
例:

@echo off
::打印C盘根目录下的全部目录名字
for /d %%i in (c:\*) do echo %%i
pause
::把当前路径下文件夹的名字只有1-3个字母的打出来
for /d %%i in (???) do echo %%i
pause

*号表示任意N个字符,?号表示任意一个字符
2、/r 递归

@echo off
::列出C盘根目录和每个目录的子目录下面全部的exe文件
for /r c:\ %%i in (*.exe) do echo %%i
pause
::列出当前路径目录和每个目录的子目录下面全部的exe文件
for /r %%i in (*.exe) do echo %%i
pause

3、/l
表示以增量形式从开始到结束的一个数字序列
因此,(1,1,5)将产生序列1 2 3 4 5,(5,-1,1)将产生序列5 4 3 2 1
例:

@echo off
::打印出1到5的数字
for /l %%i in (1,1,5) do @echo %%i
pause
::打开5个CMD窗口
for /l %%i in (1,1,5) do start cmd
pause

4、/f 迭代及文件解析
例:

@echo off
rem 首先建立临时文件test.txt
echo ;注释行,这是临时文件,用完删除 >test.txt
echo 11段 12段 13段 14段 15段 16段 >>test.txt
echo 21段 22段 23段 24段 25段 26段 >>test.txt
echo 31段 -32段 -33段 -34段 -35段 -36段 >>test.txt
for /f "eol=; tokens=1,3* delims=,- " %%i in (test.txt) do echo %%i %%j %%k
pause
del test.txt
::eol=; 分号开头的行为注释行
::tokens=1,3* 将每行第1段,第3段和剩余字段分别赋予变量%%i,%%j,%%k
:: delims=,-  (减号后有一空格)以逗号减号和空格为分隔符,空格必须放在最后

输出命令的结果

@echo offf
::输出命令的结果
for /f "delims=" %%i in ('net user') do @echo %%i
pause
::括号内的内容用单引号引起来,就表示那个当命令执行
::加"delims="为了让空格的行能整行显示出来

::在PATH变量里指定的路径里搜索notepad.exe文件
for /f "delims=" %%i in ("notepad.exe") do @echo %%~$PATH:i
pause
::显示c:\windows\system32\notepad.exe

五、批处理中的变量

1、系统变量
2、自定义变量

@echo off
set var=我是值
echo %var%
pause
::接收用户输入
set /p var=请输入变量的值
echo %var%
pause

六、if...else... 条件语句

例如:

if exist filename (
    del filename
) else (
    echo filename missing
)
也可写成:
if exist filename (del filename) else (echo filename missing)

七、子程序

1、示例1

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

:sub
set %1=%2
goto :eof

2、示例2:求多个整数相加的子程序

@echo off
set sum=0
call :sub 10 20 35
echo 数据求和结果:%sum%
pause

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

八、用ftp实现自动下载

可以将ftp命令组合保存为一个文本文件,然后用一下命令调用即可
ftp -n -s:filename
示例:
将下面内容保存为ftp.txt文件,可以使用ftp -n -s:ftp.txt命令进行自动下载

open 90.52.8.3 #打开ftp地址,默认端口号可以不写
user iware #用户为iware
password8848 #密码
bin #二进制传输模式
prompt
cd tmp1 #切换至iware用户下的tmp1目录
pwd
lcd d:\download #本地目录
mget * #下载tmp1目录下的所有文件
bye #退出ftp

九、使用"7-zip"和"winrar"实现命令行压缩和解压功能

参考相关帮助文档

十、调用VB******程序

使用windows脚本宿主,可以再命令提示符下运行脚本。
C******.exe提供了用于设置脚本属性的命令行开关。
需要查相关资料,不懂...

十一、将批处理转化为可执行文件

Bat2Com工具
用法:Bat2Com fileName
dos环境下,可执行文件的优先级由高到低依次为.com>.exe>.bat>.cmd

十二、时间延迟

执行一条命令后延迟一段时间再进行下条命令
示例1:利用ping命令延时

@echo off
echo 延时前:%time%
ping /n 3 127.0.0.1 >null
echo 延时后:%time%
pause

解说:用到了ping命令的"/n"参数,表示要发送多少次请求到指定的ip。127.0.0.1可以简写为127.1。">null"就是屏蔽掉ping命令所显示的内容。

示例2:利用for命令延时

@echo off
echo 延时前:%time%
for /l %%i in (1,1,5000) do echo %%i>null
echo 延时后:%time%
pause

解说:利用一个计次循环并屏蔽它所显示的内容来达到延时的目的。

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

@echo off
echo %time%
call :delay 5000
echo %time%
pause
exit

:delay
echo W******.Sleep %1>delay.vbs
C****** //B delay.vbs
del delay.vbs
goto :eof 

4、示例:模拟进度条

@echo off
mode con cols=113 lines=15 & color 9f
cls
echo.
echo 程序正在初始化...
echo.
echo ---------------------------------
set /p= ■<null
for /l %%i in (1 1 38) do set /p a=■<null & ping /n 1 127.0.0.1>null
echo -----------------------------------
pause

解说:set /p a=■<null的意思是:只显示提示信息"■"且不换行,也不需手工输入任何信息,这样可以使"■"在同一行逐个输出。"ping /n 1 127.1>null"是输出每个"■"的时间间隔,即每隔多少时间输出一个"■"。

十三、后记

1、这几天在工作中用到了批处理,感觉批处理很方便也很强大,所以学习了下,做个记录。希望能帮助到一些要学习批处理的同学。如果大家有好的学习资源,记得要分享哦。
2、在dos中可以使用cmdName /? 查看帮助信息。

你可能感兴趣的:(批处理笔记)