现在的位置: 首页 > 操作系统 > 正文

DOS命令行在批处理脚本(bat)中的简单应用【学习笔记】

2016年04月26日 操作系统 ⁄ 共 9410字 暂无评论 ⁄ 阅读 1,229 次
文章目录

【基础】

DOS系统涵盖的方面很广,如批处理、文件管理、磁盘管理、内存管理、网络管理、系统配置、系统管理等。由于工作原因,个人仅用到批处理,故本处总结的大多数笔记均为批处理文件中会经常用到的。

DOS英文全称是Disk Operating System。

BIOS英文全称是Basic Input Output System,是直接与硬件底层打交道的底层代码。它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、开机后自检程序和系统自启动程序,它可从CMOS中读写系统设置的具体信息。其主要功能是为计算机提供最底层的、最直接的硬件设置和控制。

当单纯输入一个命令名时,计算机会先寻找同名的.com后缀执行,未打到则寻找.exe,再未找到则寻找.bat。

【文件管理常用命令】

md/mkdirmkdir(简写为mk),全称make directory,语法md [Drive:]Path,Drive是驱动盘符,省略则默认为当前驱动盘。

rd/rmdirrmdir(简写为rd),全称remove directory,语法rd [Drive:]path [/s][/q],两个参数,/s递归删除,/q安静模式删除,目录参数,若在路径的第一个目录名前插入一个反斜杠(\)则目录被认为是根目录的子目录,若没有则认为是当前目录的子目录。

dir查看目录,语法dir [Drive:][path],参数,/a:[]的参数h为隐藏文件-h反之,d为目录/d为文件,/o:[]的参数有s按大小,d按时间,n按字母,带减号为其反序,/w不显示详情。

cdchdir(简写为cd),全称change directory,更换目录,语法cd [Drive:]Path,cd \为到根目录去。若要更换盘符,如切换到D盘,需要加参数/d或直接输入D:。

copy复制文件;

move移动文件;

del删除文件;

type查看文件内容,语法type [Drive][Path]Filename;

ren重命名;

findstr在文件中查找文本;

find在文件中搜索字符串,语法为:find 参数“string”file_path,参数如下:

/v:显示不包含指定字符串的所有行文本,省略则默认搜索包含指定字符串的所有行文本,可以配合/c显示不包含指定字符串的行数;

/c:显示包含指定字符串的行数(注意是行数,不是行文本);

/i:忽略大小写,默认是区分大小写的;

/n:在文本前显示行号;

sort排序,语法为:sort 参数 file_path [/t 临时存储] [/o 输出文件],参数如下:

/r:降序排序,默认为升序;

/+n:指定按第n个字符开始排序,默认从第1个字符开始排序,小于n的行排在最前;

ipconfig参数/all显示所有适配器完整的TCP/IP配置信息;

Ping参数-n指定请求次数,默认每秒请求一次;

利用ping每秒请求一次,配合参数-n可以达成倒计时功能;

FTP下载get remote_file [local_file],将远程服务器文件remote_file下载到本地并命名为local_file,省略者默认local_file与remote_file同名,需要注意的是下载的文件必须保存在当前目录,而不能指定其他目录。上传使用put,与get类似。

netstat检查网络连接;

【批处理文件常用命令】

@禁止本命令行显示;

echo off该命令行下所有运行的批处理命令都不显示,如果将@放在echo off之前连echo off也不会显示,所以,我们经常见到bat文件开头都是@echo off。

echo.输出一个空行一般在echo后紧跟一个“.”,注意,中间不能有空格,另外“.”也可以换成其他符号。

call在A批处理程序中调用B批处理程序,执行完成再返回本程序。若B批处理文件与A不是同一个目录,则调用时要输入完整目录。

goto跳到指定行继续执行批文件,该命令只识别标号的前8个字符,因而,标号不可过长。

pause暂停批处理程序执行,等待用户按任意键后继续执行,调试choice程序时可使用该命令,然后其下加一个goto again,在程序最开始加上标记:again,就可以循环调试了。想终止程序时直接关闭,或者ctrl+c,然后y。更改pause的提示语,可使用如下命令:

echo 设定的提示语& pause > nul

rem单行注释,注释内容中不可出现重定向或管道符号(>或|),其他常用注释方式如下:

:注释内容

goto 标签注释内容

另外,多行注释可以使用:配合goto,如:

goto note

注释1

注释2

:note

或者使用rem,但在每一行(除最后一行)最后加上^

:: 注释内容,两个冒号后跟单行注释内容

shift将一个参数复制到前一个参数来改变可替换参数%0到%9的值,即%0的原值被清除,%1的值被复制到%0,而%2的值被复制到%1,等等。参数/n可指定移位起点,如:

shift /2,则会将%3移位到%2,将%4移位到%3,等等,但这并不影响%0和%1。

cls清屏。

shutdown关机,常用参数如下:

/h:休眠,可以与/f选项一起使用。

/r:重启。

/g:关闭并重启计算机,系统重新启动后,重新启动所有注册的应用程序。

/f:强制正在运行的应用程序关闭,不前台警告用户。

/p:立刻关闭本地计算机,没有延时等待或警告,可以和/f一起使用。

/t:设定关机前等待时长,单位为秒,默认值为30,若等待时长大于0,则默认/f参数。

/a:取消所有形式关机。

tasklist系统进程查看,当然,图形界面版的更好用。

taskkill结束进程,常用参数如下:

/pid:指定要终止进程的PID;

/im:指定要终止进程的映像名称(软件在任务管理器中的名称,如QQ.exe),可以使用通配符*(好多书上说不可以,但WIN7测试/im QQ*时成功将所有QQ任务终止掉);

/t:终止进程及其子进程;

/f:指定强制中止进程;

/fi:筛选多个任务,只有此时/im才能使用通配符,常用筛选器有imagename,运算符为eq、ne(匹配、不匹配);

举例:

taskkill /f /im notepad.exe /t

taskkill /f /fi“imagename eq note*”

more分页显示;

start调用外部程序;

【批处理常用符号】

@屏蔽本行命令在屏幕中显示,但命令还会执行;

>输出重定向,将输出结果保存到指定文件,若指定文件不存在则创建,存在则覆盖;

>>与>类似,不同点在于若指定文件存在,则在文件末尾追写,而不是覆盖;

<指定输入为某文本内容,多用于输入较多时,直接采用文本替代输入;

|管道操作,使用一个程序或命令的输出,作为另一个程序或命令的输入,如dir|sort|more,为列出当前目录下所有目录,然后排序,然后分页显示;

%引用变量时会用到这个符号,另外调用参数时也为用到%1~%9,%0比较特殊,它可以调用批处理自身,包括完整的路径和扩展名。

^转义特殊符号为普通字符,在结束还有续行的作用;

&组合命令,批处理认行不认命令数,&可以将多个命令组合成一个命令执行,而且前面的命令失败并不影响后面的命令执行,命令从前往后执行;

setlocal enabledelayedexpansion

set var=yes

echo 开关状态:& echo %var% & set var=no & echo !var! & echo %var%

执行后每个echo都是独立的一行。

&&组合命令,&&与&类似都能组合命令从前向后执行,不同的是,&&若遇到命令执行失败则不会继续执行后面的命令;

||组合命令,组合执行多条命令,当第一条命令失败才会执行第二条,以此类推,当碰到执行正确的命令将不执行后面的命令;

注意:管道命令优先级高于重定向命令,重写向命令优先级高于组合命令;

()括号中可包含多行命令,这些命令会被看成一个整体,视为一条命令行;

*通配符,表示一个或多个任意字符;

?通配符,表示单个字符;

【SET变量赋值】

【语法】

set设定或修改变量值,语法set [variable=[string]]

variable是变量名,string是给变量指定的值(一系统字符串)。

注意:变量名后紧跟等号(=),中间不可有空格,否则赋值失败。等号(=)后可以有空格,但空格会作为一个字符来出现。所以,在使用set赋值时,等号前后都不应该有空格的!

例如:

set var=2

echo %var%

在set指定变量值时,若环境中已存在该变量,则用新值替换旧值,若等号后无值,则只清除旧值。

【变量查看】

查看当前所有系统变量,直接输入set,后面不带任何参数。

查看所有以某个字母开头的一系列环境变量(就是变量),只要在set命令后加上首字母即可,如显示所有以P开头的变量,则输入:set P。若当前环境中未找到以P开头的变量名,则将errorlevel设置成1。

【变量引用】

在引用变量时,变量名的两边需要分别用百分号(%)扩起来,如%var%。

【变量赋值】

除了基本的变量赋值,set还有两种带参数的赋值方式/a和/p,这两种方式大大增强了set的功能,具体如下:

/a

等号(=)右侧会被认定为表达式并先进行计算,并将计算得到的最终值赋给变量。计算遵循常规的运算符级别进行运算,具体优先级如下:

分组:()

一元运算符:!(逻辑非)、~(求反)、-(负号)等

算数运算:*(乘)、/(除)、%(除),+(加)、-(减)

逻辑移位:<<、>>

按位:&(与),^(异),|(或)

赋值:=、*=、/=、%=、+=、-=

表达式分隔:,(同时给多个变量赋值时使用逗号隔开)

举例(自行测试时在开头加@echo off,结果加pause):

@echo off

set var=1+1

echo %var%

rem 此时屏幕打印结果是1+1

pause

 

set /a var=1+1

echo %var%

rem 此时屏幕打印结果是2,这就是/a参数的作用

 

set /a var+=1

echo %var%

rem 若var未赋初始值则默认初始值为0,var+=1等价于var=%var%+1

 

set /a var1=1+1,var2=2+1,var3=3+1

echo %var1% %var2% %var3%

rem 此时屏幕打印结果是2 3 4,这就是逗号分隔同时对多个变量时行赋值

/p

交互式将变量值赋为用户输入的值,读取用户输入值前,可以有提示字符串(也可不写提示字符串,不过一般都有),例如:

@echo off

set /p name=请输入用户名:

set /p pw=请输入密码:

if %name% == 姓名 (echo 你输入用户名是:姓名) else (echo 用户名输入错误)

if %pw% == 123456 (echo 你输入密码是:123456) else (echo 密码输入错误)

pause

上面的代码只是做简单的测试,在实际运用上非常重要,如,我们可以让用户输入用户名、密码,然后去连接Oracle数据库,去执行指定文件夹中的脚本。

【变量值字符串替换】

SET VAR2=%VAR1:str1=str2%

可以将变量(VAR1)中的值,所有的特征字符串(str1)替换为其他字符串(str2),若str2为空,则从变量中将所有str1删除。str1如:

set var1=12342

set var2=%var1:2=5%

echo 替换后的值: %var2%

将变量var1中的所有2替换为5

【变量值字符串提取】

%VAR:~x,y%

从变量(VAR)中的第x+1个字符开始的总计y个字符,若不指定y则默认取到结尾,若x和y都是负数,则使用变量的总长加上指定的偏移量或长度,如:

set var=20160501

echo 提取到的月份为:%var:~4,2%

rem 从第5个字符开始的两个字符,即05

set var=20160501

echo 提取到的月份为:%var:~-6,-2%

rem 从倒数第6个字符开始,除去最后两个,提取字符串为1605

【延迟变量】

在批处理中引用变量有两种方式,一种是%VAR%,另一种是!VAR!,前者是静态变量,而后者是动态变量。如果变量值在复合语句(即嵌套语句)中被引用,则必须使用延迟变量。通过如下例子来看:

set var=yes

if %var%==yes (

set var=no

echo %var%

)

你以为输出的肯定应该是no了对吧,但结果打脸了,竟然输出yes!为什么在嵌套语句中我们赋值没起作用呢?

这是因为在DOS编译执行代码时,会把if语句后括号内语句当作一条语句执行而不是两条,所以,在编译执行时括号内第二条语句时,第一条赋值语句并未执行过,%var%使用的值还是yes!

再来看看开启延迟变量后,分别使用静态变量和动态变量的例子:

setlocal enabledelayedexpansion

set var=yes

if %var%==yes (

set var=no

echo %var%

echo !var!

)

语句执行结果,%var%显示为yes,!var!显示为no,太神奇了!

setlocal enabledelayedexpansion用于开启延迟变量,这会告诉编译器,在遇到复合语句时,动态变量不要直接赋值执行,而要等待前面的语句执行之后,再单独执行该语句。

【常用系统变量】

%DATE%:当前日期。

%TIME%:当前时间。

%RANDOM%:0和32767之间的任意十进制数字。

%ERRORLEVEL%:当前ERRORLEVEL数值。

%0:当前完整全路径(带双引号)

%~0:当前完整全路径(无双引号)

%~s0:当前短全路径名(无双引号)

%~f0:当前全路径

%cd%:当前目录(无文件名)

%~d0:当前盘符

%~p0:当前目录(无盘符无文件名)

%~n0:当前文件名

%~x0:当前文件扩展名

%~t0:当前文件最后修改时间

%~z0:当前文件大小(B)

【IF判断用法】

【语法】

1)字符串比较

if [not] string1 == string2 command

字符串相等时执行某个命令,带not则为不等时

2)捕捉系统错误码

if [not] errorlevel number command

返回的错误码大于或等于指定数时执行命令,带not则为小于时

3)判断文件存在性

if [not] exist filename command

指定文件存在时执行某个命令,带not则为不存在时

4)扩展的字符串比较

如果命令扩展启用,则IF还有如下功能:

IF [/I] string1 compare-op string2 command

其中,compare-op(比较操作符)有:

EQU - 等于

NEQ - 不等于

LSS - 小于

LEQ - 小于或等于

GTR - 大于

GEQ - 大于或等于

参数/I指定不区分大小写,默认省略则区分大小写。

举例(配合choice):

@echo off

choice /c ync /n /m "执行请按y,不执行请按n,取消请按c,15秒后不选择默认c" /t 15 /d c

 

if %ERRORLEVEL% equ 1 goto exec

if %ERRORLEVEL% equ 2 goto noexec

if %ERRORLEVEL% equ 3 goto quit

 

:exec

echo 执行

goto end

:noexec

echo 不执行

goto end

:quit

echo 取消

goto end

 

:end

pause

需要注意的是,在各执行代码块内必须的goto end,然后设置一个end块,否则批处理命令将从上往下继续执行,造成选择y后把执行、不执行和取消全执行一次。

【else子句】

IF后可跟ELSE,不过else必须与if在同一行执行(不是你看到的在一行,而是程序认为的在一行)。但有时,我们的语句太长,而且逻辑复杂,分行来写会更清晰。这时,我们可以使用括号()将较长的命令行分行。由于括号的完整性,系统会在编译时将换行后的命令行合并成一行进行编译执行。

1)if与else不在同一行,造成else无效:

IF 1==2 echo 正确

ELSE echo 错误

2)if与else在同一行,但if后有命令,造成else无效:

IF 1==2 echo 正确 ELSE echo 错误

3)通过括号将else与if连成一行,else有效:

IF 1==2 (

echo 正确

) ELSE (

echo 错误

)

4)通过括号单独执行if后的命令,else有效:

IF 1==2 (echo 正确) ELSE echo 错误

【IF语句实现循环】

通过IF和GOTO配合可以实现循环功能,例如(实现倒计时电脑休眠):

@echo off

set num=10

rem设定倒计时的时长为10s;

 

:nosleep

rem 设定循环标记

if %num% equ 0 (goto:sleep) else set /a num-=1

rem 设定循环中止条件及循环变量变化方式

echo.

rem 输出一个空行,为了美观,没有实际意义

echo   %num% 秒后电脑将进入休眠……

rem 输出倒计时提示语

ping -n 2 127.0.0.1>nul 2>nul&cls

rem 倒计时实现,利用ping –n的延迟功能,注意n设定为2为延迟1秒,后面的>nul和2>nul是屏蔽错误信息

rem &是语句拼接符号,表示执行完ping之后执行下一个命令,cls是清屏,这样才不会每一个倒计时都在屏幕输出一次

goto:nosleep

rem 循环标记,若循环未达到终止条件则回到循环头部

 

:sleep

echo.

echo 电脑开始休眠

rem shutdown –h -f

rem 执行循环终止后要执行的命令,若循环终止后不执行命令则在循环中条件写为goto end即可

 

pause

【IF嵌套语句】

IF语句可以直接嵌套使用,但需要注意括号的使用。另外,若在嵌套语句中发生了变量值的变量,需要开启延迟变量,具体见DOS批处理BAT变量赋值及用户输入交互式赋值。

【CHOICE判断用法】

【CHOICE实现延时交互式分支执行】

CHOICE [/C choices] [/CS] [/N] [/T timeout /D choice] [/M text]

描述:该工具允许用户从选择列表选择一个项目,然后返回所选项目的索引号。

参数详解:

/C choices:指定要创建的选项列表,选项个数由用户自由选择,默认选项是“YN”。

/CS:指定区分大小写,省略则不区分大小写。

/N:在提示符中隐藏选项列表,省略则不隐藏选项。

/T timeout:指定延时或倒计时多少秒后执行指定程序,跟/D联合使用(指定超时后的默认选项),可接受的延时值从0到9999。若指定0,则表示不延时,省略则不延时。

/D choice:在/T指定秒之后的默认选项,字符必须为/C中指定选项,同时,/T必须出现。

/M text:提示性文本信息,如向用户解释输入指定字符后的结果。

返回值:ERRORLEVEL

若用户输入/C choices(如/C YNC)中的第1个选项(Y)则返回1,第二个选项(N)则返回2,第三个选项(C)则返回3。

示例:

CHOICE /C abc /M "确认请按a,否请按b,取消请按c。"

CHOICE /C ync /CS /T 10 /D y

CHOICE /C ab /N /M "选项1请选择a,选项2请选择b。"

根据用户输入分支执行并延时(若需要定时执行可借助计划任务或写定时bat,在其他文章会专门总结这个问题):

@echo off

choice /c ync /n /m "执行请按y,不执行请按n,取消请按c,30秒后不选择默认c" /t 30 /d c

 

if %ERRORLEVEL% equ 1 goto exec

if %ERRORLEVEL% equ 2 goto noexec

if %ERRORLEVEL% equ 3 goto quit

 

:exec

echo 执行

goto end

:noexec

echo 不执行

goto end

:quit

echo 取消

goto end

 

:end

pause

注:各执行代码块内必须有goto end跳至最后,否则批处理命令将从上往下继续执行,造成选择y后,执行、不执行和取消全部执行。

【FOR循环】

【语法】

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

%variable:指定一个单一字母作为变量。

(set):指定一个或一组文件可,以使用通配符。

command:指定对每个文件执行的命令。

command-parameters:为特定命令指定参数或命令行开关。

在批处理程序中使用FOR命令时,指定变量要使用%%variable而不是%variable,且变量名称区分大小写。

【参数】

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

/D

如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配。若set(文件或目录)中包含通配符(*或?),则对当前目录下与set相匹配的每个目录执行command。

例如:

@echo off

for /d %%x in (C:\*) do echo %%x

rem 该命令会把C盘下所有目录一个个写入变量x,然后再输出

for /d %%x in (window?) do echo %%x

rem 该命令会把本文件所在目录下以window开头,后面有任意一个字符的目录打印出来

pause

/R

检查以[drive:]path为根的目录树,指向每个目录中的FOR语句。如果在/R后没有指定目录规范,则使用当前目录。如果集仅为一个单点(.)字符,则枚举该目录树。

/d只能显示当前目录下的所有目录名,但/r则可以将当前或指定目录下的所有文件名读取。

如果set中的文件名含有通配符,则列举/r参数后指定路径下所有子目录所有与set匹配的文件;

如果set中为具体文件名不含通配符,则枚举该目录树,而不管set中指定的文件是否存在。

例如:

@echo off

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

rem 将C盘下所有后缀为.exe的文件列举出来

for /r e:\ %%i in (test.txt) do echo %%i

rem 枚举C盘所有目录路径,不管目录下是否有test.txt,这非常不实用

for /r e:\ %%i in (test.txt) do if exist %%i echo %%i

rem 列出所有包含test.txt的目录路径

pause

/L

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

该集表示以增量形式从开始到结束的一个数字序列。因此,(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

rem 将产生5行数据,分别是1、2、3、4、5

pause

使用该命令可以指定循环次数,类似其他语言中的for I in 1..5 loop …end loop

for /L %variable IN (start,step,end) DO (

Command1

Command2

……

)

/F:

FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]

好复杂,感觉也不太实际,其功能excel都可以处理,不深究这个了。

 

【参考书籍】

《DOS命令实用技术详解》

《新手学习的DOS批处理高级教程全集》

» 声明:本站文章源于个人经验总结或书籍、互联网转载,内容仅用于个人学习,请勿转载,否则后果自负!

给我留言

留言无头像?