windows的cmd与bat批处理脚本(batchscript)
⽬录
序:批处理看这⼀篇就够了
本篇⽂章主要⽬的是帮助⼀些具有良好编程基础的同学来快速⼊门和使⽤BAT批处理脚本来完成⽇常⼯作中⼀些简单的重复的可以被⾃动化的任务,在本篇⽂章中并不过多关注运⾏原理,性能消耗,我们只关注如何编写批处理脚本。
⼀、前⾔
cmd是⾃widnows的dos系统以来就默认搭载在windows系统之中的命令⾏执⾏程序,相当于shell。与powershell相⽐,其兼容性⽐较好,能够在所有的windows版本之中运⾏。与python相⽐,其所能⽀持的操作也更多,当然,python可以通过执⾏cmd来完成相应的功能。通过cmd的脚本的编写,我们能够实现⼀些常见的任务管理,⽂件管理,⽂件安装和卸载等等⼯作。
附:cmd的脚本⽂件我们称为batch script,中⽂名叫批处理⽂件,其⽂件后缀名是.bat,例如:example.bat。
⼆、使⽤技巧
1、查看帮助
查看⼀个命令的帮助内容:
1)⽅式⼀:
通过help命令,例如:help dir,就会出现dir相应的帮助⽂档。
2)⽅式⼆:
通过在命令后⾯追加参数/?,例如dir /?,就会出现dir对应的帮助⽂档。
2、命令的执⾏
1)、从命令⾏读⼊
⽤户在cmd命令⾏窗⼝输⼊⼀⾏命令,然后按下enter,接着cmd解释器读⼊这⼀⾏命令,然后进⾏语法合法分析和语义分析,接着执⾏相应的命令。
2)、从⽂件读⼊
当我们执⾏⼀个batch script⽂件的时候,cmd解释器先读⼊⽂件的⼀⾏,接着同上,执⾏完这⼀⾏之后,再读⼊下⼀⾏,重复直到⽂件末尾。
3、变量
变量的继承?
cmd会继承它的⽗进程的所有的环境变量(如果是从桌⾯启动的cmd,那么它的⽗进程就是windows explorer。),与此同时,通过cmd执⾏的命令也会继承该cmd的环境变量,通过cmd启动执⾏的bat批处理脚本会在⼀个新的cmd环境中执⾏,该环境依然继承旧的cmd 的环境变量。例如:我们从桌⾯或者某个⽂件夹⾥通过使⽤⿏标点击启动了cmd  A,那么A就继承了explorer所有的环境变量,接着我们在A了定义了⼀个新的环境变量zero,当我们从 A中启动了⼀个命令B,B就继承了A所有的环境变量(包括zero),当我们从A中启动⼀个新的脚本C,C会在新的cmd环境中执⾏,C所在的环境也就继承了A中所有的环境变量(包括zero),我们可以在脚本C中使⽤这些环境变量。
cmd不会主动从外部更新⾃⼰的环境变量。例如:当我们从桌⾯或者⽂件夹中通过启动了⼀个cmd  A,当我们通过图形界⾯更改了注册表中的系统环境变量,explorer会应⽤这些改变,但是A并不会应⽤这些改变(相对的,平常我们遇到的⼀些更改了注册表之后,需要重启计算机就是为了通过重启计算机的⽅式,让⼀些程序重启,然后应⽤新注册表中的内容。)。再例如:我们有⼀个cmd A ,
我们从A中启动⼀个cmd B,我们在A中再定义⼀个环境变量one,我们在B中并不能使⽤该环境变量one(因为B中此时并没有更新⾃⼰的环境变量,也就没有获得环境变量one的定义和值。) ,相对的,我们然后在B中定义了⼀个环境变量two,则A中也不能使⽤环境变量two。
变量相关的⼏个命令
set、path、prompt、setlocal和endlocal等。
1)、系统环境变量
所谓系统环境变量就是由windows系统预先定义在系统中的,通常保存在注册表(registry)中,更改这些系统环境变量,可能会引起系统全局的改变。例如path就是⼀个系统环境变量。
cmd通过explorer启动之后,cmd会从explorer继承这⼀部分系统变量,此后若注册表中⼀些系统环境变量发⽣了改变,explorer会更新对应的系统环境变量,但是由于cmd早已启动,所以cmd并不会应⽤这些改变。
改变系统环境变量的值(以下⽅式改变系统环境变量的值的⽅式,只能改变当前cmd的系统环境变量的值,不能改变注册表中环境变量的值。这些改变可以被当前cmd的⼦进程继承。永久新建或改变环境变量:)
path命令
path命令会重新设置path这个环境变量的值。
语法:path [[<drive>:]<path>[;...][;%PATH%]]
例⼦:将%PATH%变量设置为,C:\,path C:\,然后%PATH%的值就会变为C:\。如果我们想追加⼀个路径在%PATH%后⾯,则path %PATH%;C :\;,那么C:\就会追加在尾部。
参考:
prompt命令
prompt改变cmd的提⽰符内容。
语法:prompt [<text>]
例⼦:prompt $d$s$s$t$_$g,系统会按如下所⽰更改提⽰,其中⽇期和时间是最新的:Fri 06/01/2007 13:53:28.91。
参考:
set命令改变任何系统环境变量的值
例如,改变path的值,set PATH=C:\,则path的值会变为C:\。想在PATH后⾯追加C:\,则set PATH=%PATH%;C:\;,那么C:\就会追加在尾部。
附录:⼀些常⽤的系统环境变量
%ALLUSERSPROFILE% 本地 返回“所有⽤户”配置⽂件的位置。
%APPDATA% 本地 返回默认情况下应⽤程序存储数据的位置。
%CD% 本地 返回当前⽬录字符串。
%CMDCMDLINE% 本地 返回⽤来启动当前的 的准确命令⾏。
%CMDEXTVERSION% 系统 返回当前的“命令处理程序扩展”的版本号。
%COMPUTERNAME%    系统 返回计算机的名称。
%COMSPEC%    系统 返回命令⾏解释器可执⾏程序的准确路径。
%DATE%    系统 返回当前⽇期。使⽤与 date /t 命令相同的格式。由 ⽣成。
%ERRORLEVEL%    系统 返回上⼀条命令的错误代码。通常⽤⾮零值表⽰错误。
%HOMEDRIVE%    系统 返回连接到⽤户主⽬录的本地⼯作站驱动器号。基于主⽬录值⽽设置。⽤批处理文件怎么做
户主⽬录是在“本地⽤户和组”中指定的。
%HOMEPATH%    系统 返回⽤户主⽬录的完整路径。基于主⽬录值⽽设置。⽤户主⽬录是在“本
地⽤户和组”中指定的。
%HOMESHARE%    系统 返回⽤户的共享主⽬录的⽹络路径。基于主⽬录值⽽设置。⽤户主⽬录是
在“本地⽤户和组”中指定的。
%LOGONSERVER%    本地 返回验证当前登录会话的域控制器的名称。
%NUMBER_OF_PROCESSORS%    系统 指定安装在计算机上的处理器的数⽬。
%OS%    系统 返回操作系统名称。Windows 2000 显⽰其操作系统为Windows_NT。
%PATH% 系统 指定可执⾏⽂件的搜索路径。
%PATHEXT% 系统 返回操作系统认为可执⾏的⽂件扩展名的列表。
%PROCESSOR_ARCHITECTURE%    系统 返回处理器的芯⽚体系结构。
%PROCESSOR_IDENTFIER% 系统 返回处理器说明。
%PROCESSOR_LEVEL%    系统 返回计算机上安装的处理器的型号。
%PROCESSOR_REVISION% 系统 返回处理器的版本号。
%PROMPT% 本地 返回当前解释程序的命令提⽰符设置。由 ⽣成。
%RANDOM% 系统 返回 0 到 32767 之间的任意⼗进制数字。由 ⽣成。
%SYSTEMDRIVE% 系统 返回包含 Windows server operating system 根⽬录(即系统根⽬录)
的驱动器。
%SYSTEMROOT%    系统 返回Windows server operating system 根⽬录的位置。
%TEMP% 和 %TMP% 系统和⽤户 返回对当前登录⽤户可⽤的应⽤程序所使⽤的默认临时⽬录。
%TIME% 系统 返回当前时间。使⽤与 time /t 命令相同的格式。由 ⽣成。
%USERDOMAIN% 本地 返回包含⽤户帐户的域的名称。
%USERNAME% 本地 返回当前登录的⽤户的名称。
%USERPROFILE% 本地 返回当前⽤户的配置⽂件的位置。
%WINDIR% 系统 返回操作系统⽬录的位置。
当我们不记得系统明的值的时候,我们可以在dos下使⽤set 命令查看系统变量值,⽐如:set WINDIR。
2)、⾃定义变量
⾃定义环境变量需要通过set命令来实现,通过set命令定义的变量可以被⼦进程继承,但是不会写⼊到注册表中。如果我们想定义不会被继承的变量,那么可以在脚本⽤使⽤setlocal和endlocal将定义包围起来,那么在这两个符号中间定义的变量在超出这两个符号包围的范围之后,就⽆法再被访问,也不会被继承,就定义出了本地变量。
注意:等号两边不能有空格。
定义⼀个变量
set  myvar=test
取消⼀个变量
set  myvar=
定义⼀个数字(默认情况,定义的变量都是字符串)
set  /A  myvar=2    #定义⼀个数字
set  /A  myvar1=myvar+2    #定义myvar1是⼀个数字,右边是⼀个表达式,计算得到结果之后,赋值给myvar1。
附:操作符优先级(ps:数学表达式这⼀块平常不怎么⽤,不做过多介绍。)
( )
* / % + -
<< >>
&
^
|
= *= /= %= += -= &= ^= |= <<= >>=
,
等待⽤户输⼊值的变量(可以⽤来跟⽤户进⾏交互)
set  /p  myvar2=    #当执⾏到这⼀条命令的时候,就会等待⽤户从标准输⼊流输⼊⼀个值,这个值就是myvar2的值。这种⽅式类似于C语⾔的scanf()函数。
1set /P Userinput=  ::等待⽤户键盘输⼊
2
3set /P Fileinput= <   ::从⽂件中输⼊,只能读取⽂件的第⼀⾏
查看系统中以xxx开头的变量
set  xxx    #会显⽰当前cmd环境中已经定义的以xxx开头的变量。
set  myvar  #查看myvar变量的值。
set          #查看所有环境变量
局部变量定义
setlocal  中间区域定义的变量都是局部变量      endlocal(其他⽅式定义的都是全局变量),例如:
1setlocal
2set test=jskdfjak
3set test1=jskdfjakwekrj
4echo %test%
5echo %test1%
6endlocal
7
8::在这之后,test和test1⽣命周期结束,⽆法使⽤test和test1这两个变量。
3)、变量的访问和使⽤
变量的访问
%myvar%:直接使⽤这个变量的值。例如:set myvar=test1  echo %myvar%结果是test1。
%myvar:str1=str2%:将myvar中的str1字符串全部替换成str2。例如:set  myvar=test1test2,%myvar:test=really%结果是really1really2。
%myvar:~start[,length]%:从start开始,取出特定长度的⼦串,第⼀个计数为0,最后⼀个计数-1或者(总长-1),没有长度就取到串尾。
set  myvar=test1test2  例如:%myvar:~2%结果是st1test2(从第3个字符开始⼀直到末尾);%myvar:~0,-2%结果是test1tes;
%myvar:~2,5%结果是st1te;%myvar:~-5%结果是test2。
变量扩展原则
执⾏cmd或者bat⽂件是从头向后执⾏,变量有⼀个扩展规则,即在执⾏⼀个语句块时,CMD在读⼊这个语句块的时候,该语句块中的变量将会被该语句块之前的同名的变量的值代替。
语句块的常见类型:
set xxx=xxxxx
ifxxxx()
ifxxxxx() else ()
if xxxxx() else if xxxx()
for 语句整个作为⼀个语句块
()括号作为⼀整个语句块
& || &&等联结的⼀⾏也是⼀个语句块处理
|管道联结的也是⼀整个语句块处理
也就是说⼀个命令往往作为⼀个语句块读⼊,这⾥需要注意过程调⽤并不是以整个语句块,在处理过程调⽤的时候,都是按照过程调⽤包含的命令处理的。
例如:
set a=hello& echo %a% 这个语句通过&连接成为⼀个语句块,⼜如(set a=steve if defined a echo hello %a%)是通过()组合的⼀个语句块在执⾏语句块
时,a将会被a的值所代替,⽽语句块中的set语句将会在该语句块执⾏完后才有效,例如set a=hello (set a=steve  if defined a echo hello %a%)
将会输出hello⽽不是steve,因为语句扩展之后原来的代码就变为了set a=hello (set a=steve  if defined a echo hello hello)
可以理解为当前语句块中所有的set都在下⼀句语句块执⾏时才有效,在当前语句块不做任何事情这样将会对程序的逻辑性产⽣很⼤的影响。
为了解决这个问题,cmd提供了⼀种⽅式:setlocal [Enable|Disable]DelayedExpansion。
SETLOCAL ENABLDELAYEDEXPANSION(必须⼤写):启⽤扩展延迟;SETLOCAL DISABLEDELAYEDEXPANSION(必须⼤写):不启⽤扩展延迟。
注意,启⽤后变量的调⽤将会变为!变量名!,如果使⽤%变量名%,调⽤的将会是未使⽤扩展延迟的状态的变量(即与原来没什么区别)。
4、条件语句
注意:扩好旁边必须存在空格。
if
⽤法⼀:if  string1==string2  (  command  )  ::判断两个变量的关系。
::另外,当str1或者str2中包含了空格的时候,==两边的变量都需要加上双引号。如果它们之中没有空格,我们加上双引号也不会影响,因此我们最常⽤的是的是双引号版本。
if  "string1"=="string2"  (  command  )
例如:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。