版权声明:本文为CSDN博主「lengye7」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lengye7/article/details/107948564
一、前言
二、使用技巧
1、查看帮助
2、命令的执行
3、变量
4、条件语句
5、循环
6、参数
7、函数(过程调用)
8、调用外部脚本
10、跳转
11、脚本注释
12、一个脚本文件的典型结构
附录:一些常用的cmd命令
本篇文章主要目的是帮助一些具有良好编程基础的同学来快速入门和使用BAT批处理脚本来完成日常工作中一些简单的重复的可以被自动化的任务,在本篇文章中并不过多关注运行原理,性能消耗,我们只关注如何编写批处理脚本。
cmd是自widnows的dos系统以来就默认搭载在windows系统之中的命令行执行程序,相当于shell。与powershell相比,其兼容性比较好,能够在所有的windows版本之中运行。与python相比,其所能支持的操作也更多,当然,python可以通过执行cmd来完成相应的功能。通过cmd的脚本的编写,我们能够实现一些常见的任务管理,文件管理,文件安装和卸载等等工作。
附:cmd的脚本文件我们称为batch script,中文名叫批处理文件,其文件后缀名是.bat,例如:example.bat。
查看一个命令的帮助内容:
1)方式一:
通过help命令,例如:help dir,就会出现dir相应的帮助文档。
2)方式二:
通过在命令后面追加参数/?,例如dir /?,就会出现dir对应的帮助文档。
1)、从命令行读入
用户在cmd命令行窗口输入一行命令,然后按下enter,接着cmd解释器读入这一行命令,然后进行语法合法分析和语义分析,接着执行相应的命令。
2)、从文件读入
当我们执行一个batch script文件的时候,cmd解释器先读入文件的一行,接着同上,执行完这一行之后,再读入下一行,重复直到文件末尾。
变量的继承?
cmd会继承它的父进程的所有的环境变量(如果是从桌面启动的cmd,那么它的父进程就是windows explorer。),与此同时,通过cmd执行的命令也会继承该cmd的环境变量,通过cmd启动执行的bat批处理脚本会在一个新的cmd环境中执行,该环境依然继承旧的cmd的环境变量。例如:我们从桌面或者某个文件夹里通过cmd.exe使用鼠标点击启动了cmd A,那么A就继承了explorer所有的环境变量,接着我们在A了定义了一个新的环境变量zero,当我们从 A中启动了一个命令B,B就继承了A所有的环境变量(包括zero),当我们从A中启动一个新的脚本C,C会在新的cmd环境中执行,C所在的环境也就继承了A中所有的环境变量(包括zero),我们可以在脚本C中使用这些环境变量。
cmd不会主动从外部更新自己的环境变量。例如:当我们从桌面或者文件夹中通过cmd.exe启动了一个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的子进程继承。永久新建或改变环境变量:【windows】常见的系统环境变量,如%appdata%表示什么意思catshitone的专栏-CSDN博客%appdata%)
path命令
path命令会重新设置path这个环境变量的值。
语法:path [[<drive>:]<path>[;…][;%PATH%]]
例子:将%PATH%变量设置为,C:\,path C:\,然后%PATH%的值就会变为C:\。如果我们想追加一个路径在%PATH%后面,则path %PATH%;C :\;,那么C:\就会追加在尾部。
参考:path | Microsoft Docs
prompt命令
prompt改变cmd的提示符内容。
语法:prompt [<text>]
例子:prompt $d$s$s$t$_$g,系统会按如下所示更改提示,其中日期和时间是最新的:Fri 06/01/2007 13:53:28.91。
参考:prompt | Microsoft Docs
set命令改变任何系统环境变量的值
例如,改变path的值,set PATH=C:\,则path的值会变为C:\。想在PATH后面追加C:\,则set PATH=%PATH%;C:\;,那么C:\就会追加在尾部。
附录:一些常用的系统环境变量
%ALLUSERSPROFILE% 本地 返回“所有用户”配置文件的位置。
%APPDATA% 本地 返回默认情况下应用程序存储数据的位置。
%CD% 本地 返回当前目录字符串。
%CMDCMDLINE% 本地 返回用来启动当前的 Cmd.exe 的准确命令行。
%CMDEXTVERSION% 系统 返回当前的“命令处理程序扩展”的版本号。
%COMPUTERNAME% 系统 返回计算机的名称。
%COMSPEC% 系统 返回命令行解释器可执行程序的准确路径。
%DATE% 系统 返回当前日期。使用与 date /t 命令相同的格式。由Cmd.exe 生成。
%ERRORLEVEL% 系统 返回上一条命令的错误代码。通常用非零值表示错误。
%HOMEDRIVE% 系统 返回连接到用户主目录的本地工作站驱动器号。基于主目录值而设置。用
户主目录是在“本地用户和组”中指定的。
%HOMEPATH% 系统 返回用户主目录的完整路径。基于主目录值而设置。用户主目录是在“本
地用户和组”中指定的。
%HOMESHARE% 系统 返回用户的共享主目录的网络路径。基于主目录值而设置。用户主目录是
在“本地用户和组”中指定的。
%LOGONSERVER% 本地 返回验证当前登录会话的域控制器的名称。
%NUMBER_OF_PROCESSORS% 系统 指定安装在计算机上的处理器的数目。
%OS% 系统 返回操作系统名称。Windows 2000 显示其操作系统为Windows_NT。
%PATH% 系统 指定可执行文件的搜索路径。
%PATHEXT% 系统 返回操作系统认为可执行的文件扩展名的列表。
%PROCESSOR_ARCHITECTURE% 系统 返回处理器的芯片体系结构。
%PROCESSOR_IDENTFIER% 系统 返回处理器说明。
%PROCESSOR_LEVEL% 系统 返回计算机上安装的处理器的型号。
%PROCESSOR_REVISION% 系统 返回处理器的版本号。
%PROMPT% 本地 返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。
%RANDOM% 系统 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。
%SYSTEMDRIVE% 系统 返回包含 Windows server operating system 根目录(即系统根目录)
的驱动器。
%SYSTEMROOT% 系统 返回Windows server operating system 根目录的位置。
%TEMP% 和 %TMP% 系统和用户 返回对当前登录用户可用的应用程序所使用的默认临时目录。
%TIME% 系统 返回当前时间。使用与 time /t 命令相同的格式。由 Cmd.exe 生成。
%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()函数。
set /P Userinput= ::等待用户键盘输入
set /P Fileinput= < test.txt ::从文件中输入,只能读取文件的第一行
查看系统中以xxx开头的变量
set xxx #会显示当前cmd环境中已经定义的以xxx开头的变量。
set myvar #查看myvar变量的值。
set #查看所有环境变量
局部变量定义
setlocal 中间区域定义的变量都是局部变量 endlocal(其他方式定义的都是全局变量),例如:
setlocal
set test=jskdfjak
set test1=jskdfjakwekrj
echo %test%
echo %test1%
endlocal
::在这之后,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(必须大写):不启用扩展延迟。
注意,启用后变量的调用将会变为!变量名!,如果使用%变量名%,调用的将会是未使用扩展延迟的状态的变量(即与原来没什么区别)。
注意:扩好旁边必须存在空格。
if
用法一:if string1==string2 ( command ) ::判断两个变量的关系。
::另外,当str1或者str2中包含了空格的时候,==两边的变量都需要加上双引号。如果它们之中没有空格,我们加上双引号也不会影响,因此我们最常用的是的是双引号版本。
if “string1″==”string2” ( command )
例如:
set str1=test1
set str2=test1
if %str1%==%str2% (
echo success
)
::另外,当str1或者str2中包含了空格的时候,==两边的变量都需要加上双引号。如果它们之中没有空格,我们加上双引号也不会影响,因此我们最常用是如下版本的比较。
set str1=test1
set str2=test1
if “%str1%”==”%str2%” (
echo success
)
::注意左括号跟str2之间有一个空格。
::下面是其他的判断关系式
if “%str1%” EQU “%str2%” (
echo success
)
::等于
if “%str1%” LSS “%str2%” (
echo success
)
::小于
if “%str1%” LEQ “%str2%” (
echo success
)
::小于等于
if “%str1%” GTR “%str2%” (
echo success
)
::大于
if “%str1%” GEQ “%str2%” (
echo success
)
::大于等于
用法二:if EXIST filename ( command ) ::用于判断在当前文件夹是否存在名为filename的文件
if EXIST testprocess.bat (
echo success
)
if exist “D:\test my folder\a.txt” (
del “D:\test my folder\a.txt”
) else (
echo 您所要删除的文件不存在
)
用法三: if “%ERRORLEVEL%”==”0” ( command ) ::错误判断
if “%ERRORLEVEL%”==”0” (
echo success
)
::判断上一条命令执行是否成功。
注意:上面三种用法都可以加上一个否定NOT,表示取反,从而形成下面的用法。
if NOT “string1″==”string2” ( command )
if NOT EXIST filename ( command )
if NOT “%ERRORLEVEL%”==”0” ( command )
上面三种用法也可以和ELSE语句一起使用,形成如下用法:
if “string1″==”string2” (
command
) else (
command
)
if EXIST filename (
command
) else (
command
)
if “%ERRORLEVEL%”==”0” (
command
) else (
command
)
if xxx () else if xxx ()这种形式也比较常用。
这几种用法同样可以在if后面加上not,不再依依列出。
ps:if语句中,特别要注意变量扩充原则,否则容易造成错误。
for语句
语法:for {%% | %} in () do []
最常用的方式:for %%i in xxxx do xxxx。
主要有以下几种最常用的用法:
ps:使用%可能会发生歧义,我们直接使用%%来避免发生歧义。
用法一:for %%i in (*.*) do @echo %%i
这就是 for 的一般使用格式。注意到其中的文字 for 、in 和 do ,是 for 的固定用法。其内容可以理解为:在某一范围内(in),对于其中的某一文件来说(for),做如下的处理(do)。而 for %i in (*.*) do @echo %i 就是在当前工作目录的所有文件中(in (*.*)),对于其 中的某一文件(for %i),做出显示其名称的处理(do @echo %i)。变量 i 仅在当前循环语句 for 里起作用,%i 表示其值。
for %%i in (*) do (
echo %%i
)
::对本文件夹下的任意文件,通过for循环使用%%i迭代文件名,依次使用echo %%i操作。即,依次遍历当前文件夹下的文件,并输出其文件名。
set testfor=a,b,c,d
for %%i in (%testfor%) do (
echo %%i
)
::结果是a b c d
set testfor1=a b c d
for %%i in (%testfor1%) do (
echo %%i
)
::结果是a b c d
set testfor2=abcd
for %%i in (%testfor2%) do (
echo %%i
)
::结果是abcd
set testfor3=a,b c;d;e
for %%i in (%testfor3%) do (
echo %%i
)
::结果是a b c d e
for %%i in (a,b,c,d) do (
echo %%i
)
::结果是a b c d
用法二:for /l %%i in (5,3,16) do echo %%i
/L是重要的参数之一,用来指定数值变量的步进循环模式,数值型的变量 i 依次成为:5、8、11、14 。正如 in 里所描述的规律 (5,3,16) 一样,从 5 开始,每次增加 3 ,直到 16为止。
for /L %%i in (5,3,16) do (
echo %%i
)
::%%i从5开始,每次加3,直到16为止,依次循环。即第一次5,第二次8,第三次11,第四次14,每次循环都输出%%i的值。
for /L %%i in (1,1,16) do (
echo %%i
)
::从1开始,每次加1,到16为止,每次循环输出%%i的值,结果是:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16。
用法三:for 也可以对指定范围内的文字进行循。for 后面跟参数 /F ,/F 后面跟选项,所指定的范围 in 里可以是一个文件里的文字,可以是一个字符串,也可以是一条命令的输出结果。我们首先以一个文件里的文字作为循环对象,循环时,每一行将被循环一 次。(不做过多介绍,平常不怎么用。如果需要更改文件内容,我建议直接用python。)
::使用for循环来分割字符串
@echo off
::定义一个以分号作为分隔的字符串
set str=AAA;BBB;CCC;DDD;EEE;FFF
::str的副本
set remain=%str%
:loop
for /f “tokens=1* delims=;” %%a in (“%remain%”) do (
::输出第一个分段(令牌)
echo %%a
rem 将截取剩下的部分赋给变量remain,其实这里可以使用延迟变量开关
set remain=%%b
)
::如果还有剩余,则继续分割
if defined remain goto :loop
pause
这里的%%b为什么能够标记剩下部分?这是由%%a决定的。首先,tokens标记将字符串分割为几份,这里标记是1和剩下所有,所以是两份;然后,%%a迭代了第一份,那么for命令就会自动将剩下的部分全部使用%%b迭代标记;如果这里使用%%i来迭代第一份,那么for命令就会自动将剩下的部分全部使用%%j迭代标记,这里的字符迭代,完全是由for命令自动从in前面的那个符号开始自动往后面分配的,按照小写字母来分配,所以我们使用%%b在in前面,那么for命令就会自动迭代所有的分组,使用b c d e 等符号迭代标记。
FOR /F “eol=; tokens=2,3* delims=, ” %i in (myfile.txt) do @echo %i %j %k
会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,用逗号和/或空格分隔符号,将分隔后的每行中的第二个和第三个符号传递给 for 函数体,剩下的所有符号作为一个整体,然后通过符迭代。请注意,此 for 函数体的语句引用 %i 来获得第二个符号,引用 %j 来获得第三个符号,引用 %k 来获得第三个符号后的所有剩余符号。对于带有空格的文件名,您需要用双引号将文件名括起来。为了用这种方式来使用双引号,还需要使用 usebackq 选项,否则,双引号会被理解成是用作定义某个要分析的字符串的。%i 在 for 语句中显式声明,%j 和 %k 是通过tokens= 选项隐式声明的。可以通过 tokens= 一行指定最多 26 个符号,只要不试图声明一个高于字母 “z” 或”Z” 的变量。请记住,FOR 变量是单一字母、分大小写和全局的变量;而且,不能同时使用超过 52 个。
此外/D和/R两个选项也很有用。
ps:for循环同样要注意变量的扩展原则。
第一种:%0 %1 %2 …,这种方式通常在被调用脚本或者过程调用中使用。
%*:从%0开始的所有参数。
%0:表示被调用时的第一个参数,即指向当前被调用的脚本路径名或者被调用的过程名。
%1:表示被调用时的第二个参数。
%2:以此类推
第二种:等待用户输入的参数,适用于需要与用户交互的场景。
set /p arg=
注意:bat脚本采用空格来分隔参数,如果参数内部包含空格,则需要使用引号包括。
在批处理中,其实没有函数的概念,只有过程调用的概念。
cmd执行一个批处理脚本,只会从上往下一行一行读取并执行,其并不能分辨哪些语句是属于过程调用的,哪些是需要执行的语句,只要遇到语句都会执行,当其执行到exit这条语句的时候,就会终止执行,因此exit就成了分隔脚本正文和过程调用的分割线。
过程调用:
:过程调用名
command
exit /b ::一定要加上这一条,否则就会继续往下执行,直到exit为止或者到脚本末尾为止。
通过call命令调用对应的过程,call :过程调用名或 call :过程调用名 参数1 参数2 …。
exit与goto :eof?
exit是退出批处理脚本的执行并返回到创建这个批处理的进程。另外,exit可以用于同一个批处理的call :label中,用来退出过程调用。此外,exit还可以使用 /b选项设定退出状态码,以供创建进程访问。
goto :eof是直接让cmd直接跳转到批处理脚本末尾执行,执行完毕批处理脚本退出不返回到创建这个批处理的进行。
在call命令的调用中,exit和goto :eof效果相同,都会结束call命令的执行,返回到call的下一行继续执行,它们结束的是call命令创建的那个新的上下文。
例子:
call :testcall
call :add 1 2
exit /b
::这里以上是脚本正文,这里以下是过程调用部分
:testcall
echo test success!
exit /b
:testcall1
echo test success1!
exit /b
::可以增加参数
:add
set /a sum=%1+%2
echo sum
exit /b
调用外部脚本需要依赖call或者start命令。
call命令:call命令可以调用同一脚本中的过程调用或者外部脚本。
主要有三种常用形式:
1)、调用同脚本中的过程调用
如上所示
2)、调用外部脚本
call filename arg1 arg2
3)、调用外部脚本中的过程调用(可以把这个被调用的外部脚本作为一个库)
@echo off &setlocal
call “other.bat”
call “other.bat” test
call “other.bat” hello
call “other.bat” notexistinglabel
pause
::other.bat
if “%~1” neq “” (call :%~1&exit /b)
echo No argument passed.
exit /b
:hello
echo Hello World!
exit /b
:test
echo This is a test.
exit /b
或者另外一个形式
if “%~1” neq “” (goto %~1)
echo No argument passed.
exit /b
:hello
echo Hello World!
exit /b
:test
echo This is a test.
exit /b
start命令:start命令可以调用不同目录下的外部脚本。
call、goto与start的区别:
goto:goto用于在同一个batch file中进行跳转,该命令会让cmd直接跳转到指定的标签行继续往下执行,如果遇到exit就直接退出了。而call在调用同一batch file中的过程调用的时候,也会跳转标签处继续往下执行,遇到exit不会直接退出,而是回到call的下一行继续执行。
call:call可以调用同一batch file中的过程调用,也可以调用外部的batch file。call命令在执行的过程中,会新建一个上下文,跳转到执行的标签进行执行或者调用batch file,同时暂停当前脚本的执行,当call命令执行完毕之后(不论是批处理执行到了结尾,还是通过exit或者goto :eof退出),会返回到call的下一行继续执行。
start:start可以调用一个batch file,它会重建建立一个新的cmd进程,不影响原脚本的执行,新建的cmd进程的脚本执行也不受原脚本的影响。
每一条命令执行完之后,都会将执行结果填写在ERRORLEVEL这个环境变量中,我们通过观察它的值,可以确定命令执行成功与否。
我们通过%ERRORLEVEL%来确定这个命令执行结果,其含义是代表上一条执行的命令的执行结果:0表示成功,非0表示不成功。
我们可以通过goto跳转到指定的地方继续执行脚本,跳转的地方需要事先标记,与过程调用标记一致,就不做过多介绍了。有一个特殊的比较:EOF,这是系统事先定义好的一个标记,表示跳转到脚本末尾。
goto :testgoto
:testgoto
echo this is goto!
goto :EOF ::跳转到脚本末尾。
::这是一个注释
rem 这一行也是注释
@echo off
::上面这一条命令表示不在cmd中输出执行的命令
title 这是一个脚本的标题
::title 标记的内容会显示在命令行的左上角窗口上,用户提示正在执行哪一个脚本
rem 这是注释
::下面的内容开始脚本的正文
set /a num=15
if EXIST testprocess.bat (
echo success!
)
set str1=test1
set str2=test1
if “%str1%” EQU “%str2%” (
echo success1
)
if “%ERRORLEVEL%”==”0” (
echo success6
)
::判断命令执行是否成功
for %%i in (*) do (
echo %%i
)
for /l %%i in (1,1,16) do (
echo %%i
)
:gotosymbol
set testfor=a,b,c,d
for %%i in (%testfor%) do (
echo %%i
)
call :testcall
call :add 1 2
pause
::pause这一条命令会暂停脚本的执行,在命令行中输出按任意键继续…
goto :testgoto
goto :gotosymbol
exit /b
::这里以上是脚本正文,这里以下是过程调用部分
:testcall
echo test success!
exit /b
::可以增加参数
:add
set /a sum=%1+%2
echo %sum%
:testgoto
echo this is goto!
组合命令
&:通过&组合的命令,所有命令都会得到执行。
&&:通过&&组合的命令,前一条命令执行成功,才会继续执行后面一条命令,如果前一条命令执行失败,就不会执行后面一条命令。
||:通过||组合的命令,前一条命令执行失败,才会继续执行后面一条命令,如果前一条命令执行成功,就不会执行后面一条命令。
管道和重定向
:将命令的输出重定向到文件中,但是会清除原来文件中内容。
:将命令的输出重定向文件中,不会清除原来文件中的内容,会将内容追加到文件尾部。
<:将某个文件中的内容重定向为输入。例如:set /p myvar=<sss.txt,从sss.txt中读入一行放入myvar中。
<&:将右侧设备重定向到左侧。
&:将左侧设备重定向到右侧。例如:copy __$1234.txt abc.txt 1>a.txt 2>&1,会将正确信息输出到a.txt, 出错信息重定向到到设备1,从而将出错信息也输出到a.txt。
|:管道,将上一个命令的值作为后一个命令的输入。
NUL:空设备,类似于linux的/dev/null。
0:标准输入流,即键盘。
1:标准输出流,即cmd命令行窗口。
2:错误输出流,即错误输出到命令窗口。
目录命令
cd:后面不跟参数表示输出当前目录,后面跟参数表示切换到参数目录。
md:创建目录。
rd:删除一个目录。
dir:显示目录中的文件和子目录列表。
tree:以图形显示驱动器或者路径的文件夹结构。
xcopy:复制文件和目录树。
如何取消xcopy的/F和/D的提示?
echo f|xcopy xxxx,利用管道给xcopy一个f的输入。
这里的原理是xcopy需要从标准输入读入一个f(我们从键盘输入f,enter就是标准输入),但是我们通过管道给他一个f输入(xcopy应该实现了从管道读入输入的功能),从而实现了自动输入f,达到取消xcopy的提示的目的。
文件命令
type:显示文本文件的内容。
copy:将一份或多份文件复制到另一个位置。
del:删除一个或数个文件。
move:移动文件并重命名文件和目录。(Windows XP Home Edition中没有)
ren:重命名文件。
replace: 替换文件。
attrib: 显示或更改文件属性。
find: 搜索字符串。例如:dri | find “test”
fc: 比较两个文件或两个文件集并显示它们之间的不同。
echo “my_name”>test:在当前目录创建一个内容为my_name的文件。
type nul>test:在当前目录创建一个叫test的空文件。
网络命令
ping:进行网络连接测试、名称解析。
ftp:文件传输。
net:网络命令集及用户管理。
telnet:远程登陆。
ipconfig:显示、修改TCP/IP设置。
msg:给用户发送消息。
arp:显示、修改局域网的IP地址-物理地址映射列表。
系统资源信息命令
at:安排在特定日期和时间运行命令和程序。
shutdown:立即或定时关机或重启。
tskill:结束进程。
taskkill:结束进程(比tskill高级,但WinXPHome版中无该命令)。
tasklist:显示进程列表(Windows XP Home Edition中没有)。
sc:系统服务设置与控制。
reg:注册表控制台工具。
powercfg:控制系统上的电源设置。
其他命令
echo:输出。
pause:暂停执行。