-
批处理脚本
常用dos命令
批处理复制文件(文件夹)
1.复制C:\a\e.txt 文本文件到d:\b文件夹下面
【复制完的目录结构应该为d:\b\e.txt】
xcopy /y c:\a\e.txt d:\b\ >nul
2.复制C:\a文件夹及其内所有东西(包括隐藏,系统文件)到D:\b文件夹下面
【 a文件夹也要复制过去,也就是说,复制之后,a文件夹应该在b文件夹下】
xcopy /y /e /h c:\a d:\b\a\ >nul
3.复制C:\a文件夹内的所有东西到D:\b文件夹下面
【a文件夹不复制过去,只是把c,d这两个文件夹和e.txt这个文件复制过去】
xcopy /y /e /h c:\a d:\b\ >nul
批处理中cd进其他目录
加 /d参数就可以了。
cd /d d:\
一、批处理基础
批处理是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT 或者CMD。这些命令统称批处理命令。
可以在键盘上按下Ctrl+C组合键来强行终止一个批处理的执行过程。
批处理命令不区分大小写。
命令不懂,直接在CMD下面输入: name /? 这样的格式来看系统给出的帮助文件,比如for /? 就会把FOR命令的帮助全部显示出来!
在批处理中,将命令放在单引号中命令会被执行,将命令放在双引号中,命令会被当成字符串读取。
DOS转义字符
期望得到的字符 | 转义后字符 | |
---|---|---|
% |
%% |
May not always be required in doublequoted strings, just try |
^ |
^^ |
May not always be required in doublequoted strings, but it won't hurt |
& |
^& |
|
<</code> |
^<</code> |
|
> |
^> |
|
| |
^| |
|
' |
^' |
Required only in the FOR /F "subject" (i.e. between the parenthesis),unless backq is used |
` |
^` |
Required only in the FOR /F "subject" (i.e. between the parenthesis), ifbackq is used |
, |
^, |
Required only in the FOR /F"subject" (i.e. between the parenthesis), even in doublequoted strings |
; |
^; |
|
= |
^= |
|
( |
^( |
|
) |
^) |
|
! |
^^! |
Required only when delayed variable expansionis active |
\ |
\\ |
Required only in the regex pattern of FINDSTR |
[ |
\[ |
|
] |
\] |
|
" |
\" |
mkdir 目录名 创建目录
md 目录名 创建目录
rd 目录名 删除目录(用rd命令删除的目录必须是空的且不能删除根目录和当前目录)
rmdir 目录名 删除目录(用rd命令删除的目录必须是空的且不能删除根目录和当前目录)
copy 123 c:\filename 创建一个文件,并同时添加一些内容
type nul >c:\filename 创建一个空文件
echo. >c:\filename 创建一个空文件
del c:\filename 删除文件
我们最好使用绝对路径去操作文件,以下是绝对路径的获取方式:
@echo off
echo 当前盘符:%~d0
echo 当前盘符和路径:%~dp0
echo 当前批处理全路径:%~f0
echo 当前盘符和路径的短文件名格式:%~sdp0
echo 当前CMD默认目录:%cd%
pause
1、rem 和 ::
Rem为注释命令,rem后的内容不被执行,但能回显。
:: 为注释命令, ::后的字符行执行时不会回显, 无论是否用echo on打开命令行回显。
2、echo和 @
(1)echo 信息内容 #输出提示信息
(2)ECHO 文件内容>文件名 #建立新文件
(3)ECHO 文件内容>>文件名 #增加文件内容
(4)ECHO. #输出空行,即相当于输入一个回车 。“.”要紧跟在 ECHO 后面中间不能有空格。 “.”可以用,:;/[\]+等任一符号替代。 ECHO.输出的回车可以经DOS管道转向作为其它命令的输入,比如echo.|time相当于在TIME命令执行后给出一个回车。所以执行时系统会在显示当前时间后,自动返回到DOS 提示符状态
(5)ECHO 答复语|命令文件名 #答复命令中的提问
用于简化一些需要人机对话的命令的操作,它是通过 DOS 管道命令把 ECHO 命令的输出作为人机对话命令的输入。下面的例子就相当于在调用的命令出现人机对话时输入“Y”回车:C:>ECHO Y|CHKDSK /F
(6)echo [{ on|off }] #打开回显或关闭回显功能,echo off,能够关闭 DOS 提示符的显示使屏幕只留下光标,直至键入ECHO ON,提示符才会重新出现。
(7)@放在命令前用于关闭该命令的回显,无论此时echo是否为打开状态。如果想关闭“echo off”命令行自身的显示,则需要在该命令行前加上“@”。
3、pause
pause,是暂停的意思 就是停止系统命令的执行并显示 “请按任意键继续. . .”
4、title 设置cmd窗口的标题
title 新标题 #可以看到cmd窗口的标题栏变了
5、color
设置默认的控制台前景和背景颜色。 color [attr]
attr 指定控制台输出的颜色属性,颜色属性由两个十六进制数字指定,第一个为背景,第二个则为前景。例如: " color fc" 在亮白色上产生亮红色。如果没有给定任何参数,该命令会将颜色还原到 dos启动时的颜色。
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 A = 淡绿色
3 = 湖蓝色 B = 淡浅绿色
4 = 红色 C = 淡红色
5 = 紫色 D = 淡紫色
6 = 黄色 E = 淡黄色
7 = 白色 F = 亮白色
6、goto和 :
goto跳转的意思,允许以“:XXX”来构建一个标签,然后用GOTO XXX跳转到标签:XXX处执行标签后的命令,标签的名字可以随便起,前加个冒号用来表示这个字符串是标签,goto命令就是根据这个冒号(:)来寻找下一步跳到到那里。如果不设结束条件,goto可以持续执行下去。
@echo off
:start
Set /a var+=1
Echo %var%
If %var% leq 3 GOTO start
Pause
运行显示:
1
2
3
4
7、find 在文件中搜索字符串
find [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]
/V 显示所有未包含指定字符串的行。
/C 仅显示包含字符串的行数。
/N 显示行号。
/I 搜索字符串时忽略大小写。
"string" 指定要搜索的文字串,
[drive:][path]filename 指定要搜索的文件。
如果没有指定路径find将搜索键入的文字或另一命令产生的文字。
8、type显示文本文件的内容
TYPE [drive:][path]filename 显示文本文件的内容
find常和type 命令结合使用
find "string" filename
type [drive:][path]filename | find "string" [>tmpfile] #挑选包含string的行
type [drive:][path]filename | find /v "string" #剔除文件中包含string的行
type [drive:][path]filename | find /c #显示文件行数
8、start 命令
调用外部程序的命令(该外部程序在新窗口中运行,批处理程序继续往下执行,不理会外部程序的运行状况)
例:start explorer d:\ 调用图形界面打开D盘
start xxx.bat 调用调用外部的一个批处理
9、call
call调用另一个批处理,当另一个批处理执行完后再继续执行原来的批处理
call [drive:][path]filename [batch-parameters] 调用的其它批处理程序。filename 参数必须具有 .bat 或 .cmd 扩展名。
call :label arguments 调用本文件内命令段,相当于子程序。被调用的命令段以标签:label开头以命令goto :eof结尾。
例:
Set aa=123456
Set cmdstr=echo %aa%
Call %cmdstr%
Pause
本例中如果不用call,而直接运行%cmdstr%,将显示结果%aa%,而不是123456
10、setlocal 变量延迟
变量延迟的启动语句是“setlocal enabledelayedexpansion”,并且变量要用一对叹号“!!”括起来,否则就没有变量延迟的效果。
批处理读取命令时是按行读取的,在没有开启变量延迟的情况下,某条命令行中的变量改变,必须到下一条命令才能体现。
@echo off
set a=4
set a=5 & echo %a%
Pause
结果:4
启动变量延迟后,就会得到正确答案。
@echo off
Setlocal enabledelayedexpansion
Set a=4
Set a=5 & echo !a!
Pause
结果:5
11、shift
shift [/n] 更改批处理文件中可替换参数的位置。
如果命令扩展名被启用,shift命令支持/n 命令行开关;该命令行开关告诉命令从第n个参数开始移位;n 介于零和8之间。例如:
shift /2 会将 %3 移位到 %2,将 %4 移位到 %3,等等;并且不影响 %0 和 %1。
12、% 变量引导符
1)引用变量用%var%
2)调用程序外部参数用%1 至%9、*%等。
%1 第一个参数,%9 第九个参数
%* 从第一个参数开始的所有参数参数
%0 批处理文件本身,包括完整的路径和扩展名。%0可以调用批处理自身,以达到批处理本身循环的目的,也可以复制文件自身等。例:最简单的复制文件自身的方法
copy %0 d:\wind.bat
@echo off
Echo %1 %2 %3 %4
Echo %1
Echo %2
Echo %3
Echo %4
把上下面的代码保存为test.bat,然后输入 d:\test.bat 我是第一个参数 我是第二个参数 我是第三个参数 我是第四个参数,注意中间的空格,我们会看到这样的结果:
我是第一个参数 我是第二个参数 我是第三个参数 我是第四个参数
我是第一个参数
我是第二个参数
我是第三个参数
我是第四个参数
对比下代码,%1就是”我是第一个参数” %2 就是”我是第二个参数”
@echo off
net user
%0
保存为BAT 执行,他就会无限循环执行net user这条命令,直到你手动停止.
13、| 命令管道符
格式:第一条命令 | 第二条命令 [| 第三条命令...] 将第一条命令的结果作为第二条命令的参数来使用。管道命令的优先级高于重定向命令,重定向命令的优先级高于组合命令
dir c:\|find "txt" 显示C:\下的目录文件和子目录列表,并发现TXT字符串。
14、> 输出重定向
作用是将运行的结果传递到后面的范围(后可以是文件,也可以是默认的系统控制台)
15、>> 输出重定向
作用和>有点类似,但他们的区别是>>是传递并在文件的末尾追加,而>是覆盖
16、< 输入重定向
从文件中读入命令输入,而不是从键盘中读入。
@echo off
Echo 2005-05-01>temp.txt
Date <temp.txt
Del temp.txt
这样就可以不等待输入直接修改当前日期
17、>&、<& 重定向符
其中的stdin可被<重定向,stdout可被>、>>重定向。
> :代表重定向到哪里,例如:echo "123" > /home/123.txt
1 :表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
2 :表示stderr标准错误
& :表示等同于的意思,2>&1,表示2的输出重定向等同于1
command >out.file 2>&1 &
command >out.file是将command的标准输出重定向到out.file文件(即输出内容不打印到屏幕上)。2>&1 是将标准错误重定向到标准输出,这里的标准输出已经重定向到了out.file文件,即将标准出错也输出到out.file文件中。最后一个& , 是让该命令在后台执行。
17、^ 转义字符
^是针对特殊符号<、>、&的前导字符,在命令中他将以上 3 个符号的特殊功能去掉,仅仅只把他们当成符号而不使用他们的特殊意义。
比如
echo test ^>1.txt
结果则是:test > 1.txt
另外此转义字符还可以用作续行符号。因为每行末尾还有一个看不见的回车符,转义字符位于行尾时就让回车符失效了,从而起到了续行的作用。
18、& 组合命令
语法:第一条命令 & 第二条命令 [& 第三条命令...]
&为组合命令,可以把多个命令组合起来当一个命令来执行,当第一个命令执行失败了,也不影响后边的命令执行。
dir z:\ & dir y:\ & dir c:\
以上命令会连续显示z,y,c盘的内容,不理会该盘是否存在
19、&& 组合命令
语法:第一条命令 && 第二条命令 [&& 第三条命令...]
同时执行多条命令,当碰到执行出错的命令后将不执行后面的命令,如果一直没有出错则一直执行完所有命令。
dir c:\ && dir d:\ > a.txt
这样执行后a.txt里只有D盘的信息!因为组合命令的优先级没有重定向命令的优先级高!所以这句在执行时将本行分成这两部分:dir c:\和dir d:\ > a.txt
若要a.txt里有C、D盘,则必须得这么写: dir c:\ > a.txt && dir d:\ >> a.txt
20、|| 组合命令
语法:第一条命令 || 第二条命令 [|| 第三条命令...]
可以同时执行多条命令,当一条命令失败后才执行第二条命令,若执行正确将不执行后面的命令。
21、"" 字符串界定符
在批处理中,将命令放在单引号中命令会被执行,将命令放在双引号中,命令会被当成字符串读取。
双引号允许在字符串中包含空格,进入一个特殊目录可以用如下方法
cd "program files"
cd progra~1
cd pro*
以上三种方法都可以进入program files这个目录
22、, 逗号
逗号相当于空格,在某些情况下“,”可以用来当做空格使
比如
dir,c:\
23、; 分号
当命令相同时可以将不同目标用;来隔离,且执行效果不变,如执行过程中发生错误,则只返回错误报告,但程序仍会执行。
例:dir c:\;d:\;e:\1.txt
以上命令相当于
Dir c:\
Dir d:\
Dir e:\1.txt
其中文件e:\1.txt不存在,但 e盘存在,有错误提示,但命令仍会执行。如果目标路径不存在,则终止执行;如果路径存在,仅文件不存在,则继续执行。
24、() 括号
左右括号必须成对使用,括号中可以包括多行命令,这些命令将被看成一个整体,视为一条命令行。 括号在 for 语句和 if 语句中常见。
命令:echo 1 & echo 2 & echo 3
可以写成:
(
echo 1
echo 2
echo 3
)
上面两种写法效果一样,这两种写法都被视为是一条命令行。
注意:这种多条命令被视为一条命令行时,如果其中有变量,就涉及到变量延迟的问题。
25、! 感叹号
在变量延迟问题中用来表示变量,即%var%应该表示为!Var!。
26、attrib显示或更改文件属性
attrib [+R|-R] [+A|-A] [+S|-S] [+H|-H] [[drive:] [path] filename] [/S [/D]]
+ 设置属性。
- 清除属性。
R 只读文件属性。
A 存档文件属性。
S 系统文件属性。
H 隐藏文件属性。
[drive:][path][filename] 指定要处理的文件属性。
/S 处理当前文件夹及其子文件夹中的匹配文件。
/D 也处理文件夹。
例:
md autorun
attrib +a +s +h autorun
上面的命令将建立文件夹autorun,然后将其设为存档、系统、隐藏属性
27、pushd 和 popd
切换当前目录, 一般用处不大,在当前目录名不确定时,会有点帮助。(dos编程中很有用)
@echo off
c: & cd\ & md mp3 #在 C:\ 建立 mp3 文件夹
md d:\mp4 #在 D:\ 建立 mp4 文件夹
cd /d d:\mp4 #更改当前目录为 d:\mp4
pushd c:\mp3 #保存当前目录,并切换当前目录为 c:\mp3
popd #恢复当前目录为刚才保存的 d:\mp4
28、assoc 和 ftype
Assoc 设置'文件扩展名'关联,关联到'文件类型'
Ftype 设置'文件类型'关联,关联到'执行程序和参数'
当你双击一个.txt文件时,windows 并不是根据.txt直接判断用notepad.exe打开,而是先判断.txt属于 txtfile '文件类型',再调用 txtfile关联的命令行 txtfile=%systemroot%\system32\NOTEPAD.EXE %1
可以在"文件夹选项"→"文件类型"里修改这 2 种关联
Assoc #显示所有'文件扩展名'关联
Assoc .txt #显示.txt'文件扩展名'关联
ftype #显示所有'文件类型'关联
ftype exefile #显示exefile 类型关联的命令行,结果显示 exefile="%1" %*
Assoc .txt=Word.Document.8 设置.txt为 word类型的文档,可以看到.txt文件的图标都变了
Assoc .txt=txtfile 恢复.txt的正确关联
Ftype exefile="%1" %* 恢复 exefile 的正确关联
二、批处理中的变量
批处理中的变量分为两类,分别为"系统变量"和"自定义变量"
1、系统变量
他们的值由系统将其根据事先定义的条件自动赋值,也就是这些变量系统已经给他们定义了值, 不需要我们来给他赋值,我们只需要调用而以!
%ALLUSERSPROFILE% 本地 返回“所有用户”配置文件的位置。
%APPDATA% 本地 返回默认情况下应用程序存储数据的位置。
%CD% 本地 返回当前目录字符串。
%CMDCMDLINE% 本地 返回用来启动当前的 Cmd.exe 的准确命令行。
%CMDEXTVERSION% 系统 返回当前的“命令处理程序扩展”的版本号。
%COMPUTERNAME% 系统 返回计算机的名称。
%COMSPEC% 系统 返回命令行解释器可执行程序的准确路径。
%DATE% 系统 返回当前日期。使用与 date /t 命令相同的格式。
%ERRORLEVEL% 系统 返回上一条命令的错误代码。通常用非零值表示错误。
%HOMEDRIVE% 系统 返回连接到用户主目录的本地工作站驱动器号。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。
%HOMEPATH% 系统 返回用户主目录的完整路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。
%HOMESHARE% 系统 返回用户的共享主目录的网络路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。
%LOGONSERVER% 本地 返回验证当前登录会话的域控制器的名称。
%NUMBER_OF_PROCESSORS% 系统 指定安装在计算机上的处理器的数目。
%OS% 系统 返回操作系统名称。Windows 2000 显示其操作系统为 Windows_NT。
%PATH% 系统 指定可执行文件的搜索路径。
%PATHEXT% 系统 返回操作系统认为可执行的文件扩展名的列表。
%PROCESSOR_ARCHITECTURE% 系统 返回处理器的芯片体系结构。值:x86 或 IA64 基于Itanium
%PROCESSOR_IDENTFIER% 系统 返回处理器说明。
%PROCESSOR_LEVEL% 系统 返回计算机上安装的处理器的型号。
%PROCESSOR_REVISION% 系统 返回处理器的版本号。 %PROMPT% 本地 返回当前解释程序的命令提示符设置。
%RANDOM% 系统 返回 0 到 32767 之间的任意十进制数字。
%SYSTEMDRIVE% 系统 返回包含 Windows server operating system 根目录(即系统根目录)的驱动器。
%SYSTEMROOT% 系统 返回 Windows server operating system 根目录的位置。
%TEMP% 和 %TMP% 系统和用户 返回对当前登录用户可用的应用程序所使用的默认临时目录。有些应用程序需要 TEMP,而其他应用程序则需要 TMP。
%TIME% 系统 返回当前时间。使用与 time /t 命令相同的格式。
%USERDOMAIN% 本地 返回包含用户帐户的域的名称。
%USERNAME% 本地 返回当前登录的用户的名称。
%USERPROFILE% 本地 返回当前用户的配置文件的位置。
%WINDIR% 系统 返回操作系统目录的位置。
2、自定义变量
自定义变量使用set命令SET [variable=[string]]
SET /?查看SET 的帮助
SET #键入不带参数的set是显示当前环境变量
SET variable= #清除变量variable的值,使其变成未定义状态。
SET variable="" #此时变量值并不为空,而是等于两个引号,即""
SET /P variable=[promptstring] #提供一个交互界面,让用户自己输入变量的值
Set var=我是值 #Var为变量名,=号右变的是要给变量的值,这就是最简单的一种设置变量的方法了
在批处理中要引用变量就把var变量名用两个%扩起来:%var%
三、set命令
set命令除了可以设置自定义变量外还可以进行数学计算。
SET /A expression /A参数就是让SET 可以支持数学符号进行加减等一些数学运算!数字表达式以递减的优先权顺序支持下列操作(一般的运算常为十进制运算,如果数字字符串最左边为 0,将被认为是八进制,从而出错):
() -分组
! ~ - -一元运算符
* / % -算数运算符
+ - -算数运算符
<< >> -二进制逻辑移位
& -二进制按位“与”
^ -二进制按位“异”
| -二进制按位“或”
= *= /= %= += -= -算数赋值
&= ^= |= <<= >>= -二进制运算赋值
, -表达式分隔符
@echo off
Set /p input=请输入计算表达式:
Set /a var=%input%
Echo 计算结果:%input%=%var%
Pause
请输入计算表达式:1+9+20+30-10
计算结果:1+9+20+30-10=50
请按任意键继续. . .
DOS计算只能精确到32位,这个32位是指二进制32位,其中最高位为符号位(0 为正,1 为负),低位 31 位为数值。31 个 1 换成十进制为 2147483647,所以DOS 计算的有效值范围是-2147483648 至2147483647,超出该数值范围时计算出错
有时候我们需要直接在原变量进行加减操作就可以用这种语法 set /a var+=1即set /a var = %var% + 1。还有一些用逻辑或取余操作符,这些符号,按照上面的使用方法会报错的,对于这样的"逻辑或取余操作符",我们需要把他们用双引号引起来,也可以用转义字符^。
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
@echo off
Set /p n=请输入2的几次方:
Set /a num=1^<^<n
Echo %num%
Pause
运行结果:
请输入2的几次方: 3
8
请按任意键继续. . .
四、字符串的替换和截取
1、字符串替换
%PATH:str1=str2% 将字符串变量%PATH%中的str1替换为str2
@echo off
Set a=bbs.verybat.cn
Echo 替换前的值: "%a%"
Set var=%a:.=点%
Echo 替换后的值: "%var%"
Pause
运行显示:
替换前的值: "bbs.verybat.cn"
替换后的值: "bbs点verybat点cn"
字符串的替换和截取功能在引用变量的地方均可以,并不一定必须要有set命令
@echo off
Set a=bbs.verybat.cn
Echo 替换前的值: "%a%"
Echo 替换后的值: "%a:.=点%"
Pause
2、字符串截取
截取功能语法格式为:%a:~[m[,n]]% 。方括号表示可选,%为变量标识符,a 为变量名,冒号用于分隔变量名和说明部分,~可以简单理解为“偏移”,m为偏移量(缺省为0),n为截取长度(缺省为全部)
1)%PATH:~10,5% 就是显示变量PATH里从 11位(偏移量 10)开始的 5 个字符! :
截取功能例子1:
@echo off
Set a=bbs.verybat.cn
Set var=%a:~1,2%
Echo %var%
Pause
执行结果只显示为"bs"两个字母。
2)%PATH:~-10%
截取功能例子2:
@echo off
Set a=bbs.verybat.cn
Set var=%a:~-3%
Echo %var%
Pause
运行结果:.cn
这个就是把变量a倒数3位的值给变量VAR
截取功能例子3:
@echo off
Set a=bbs.verybat.cn
Set var=%a:~3%
Echo %var%
Pause
运行显示:.verybat.cn
这个就是把变量a的从第 3 位开始后面全部的值给变量VAR
3)%PATH:~0,-2%
@echo off
Set a=bbs.verybat.cn
Set var=%a:~0,-3%
Echo %var%
Pause
运行显示:bbs.verybat
这是把变量a的值从0位开始, 到倒数第三位之间的值全部赋予给var
五、for命令详解
1、基本格式
For %%variable IN (set) DO command [command-parameters]
参数:for有4 个参数 /d /l /r /f
%%variable 可替换的参数。
set指定一个或一组文件。可以使用通配符。 *号表示任意N 个字符,?号只表示任意一个字符
Command 指定对每个文件执行的命令。
Command-parameters 为特定命令指定参数或命令行开关。
2、/d 目录搜索
FOR /D %%variable IN (set) DO command [command-parameters]
/d参数只能显示当前目录下的目录名字,这个参数主要用于目录搜索,不会搜索文件
1)@echo off
For /d %%i in (c:\*) do echo %%i
Pause
运行会把C盘根目录下的全部目录名字打印出来,而文件名字一个也不显示!
2)@echo off
For /d %%i in (???) Do echo %%i
Pause
如果你当前目录下有目录名字只有1-3个字母的,就会显示出来,没有就不显示了
3、/R 文件搜素
FOR /R [[drive:]path] %%variable IN (set) DO command [command-parameters]
检查以 [drive:]path 为根的目录树,如果在/R后没有指定目录,则使用当前目录。把当前或者你指定路径下的文件名字全部读取。
@echo off
For /r c:\ %%i in (*.exe) do echo %%i
Pause
这个会把 C 盘根目录,和每个目录的子目录下面全部的EXE文件都列出来!
4、/L 数字序列
FOR /L %%variable IN (start,step,end) DO command [command-parameters]
使用迭代变量设置起始值 (Start#),然后以增量/减量形式逐步执行一组范围的值,直到该值超过所设置的终止值 (End#)。
例如(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
Pause
保存执行看效果,他会打印从1 2 3 4 5 这样5个数字
@echo off
For /l %%i in (1,1,5) do start cmd
Pause
执行后会打开5 个 CMD 窗口!
当然我们也可以把那个start cmd改成md %%i 这样就会建立指定个目录了!
5、/F 迭代及文件解析
“For /f”用来处理命令输出、字符串及文件内容,delims负责切分字符串,而tokens负责提取字符串。
FOR /F ["options"] %%variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %%variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %%variable IN ('command') DO command [command-parameters]
for /f "tokens=2 delims= " %%y IN ('adb shell "ps | grep com.tencent.mm"') do @set PID=%%
"options"包括一个或多个指定不同解析选项的关键字。这些关键字为:
Eol=c 一个行注释字符的结尾(就一个)
Skip=n 在文件开始时忽略的行数。
Delims=xxx 分隔符集。这个替换了空格和跳格键的默认分隔符集。
Tokens=x,y,m-n 每行的哪一个符号被传递到每个迭代的 for 本身。
delims 中可以设置空格和其他字符做分隔符:
"delims=;, " 以分号,逗号,空格做分隔符。连着写就行了,空格必须放最后。
分隔符有双引号的话,表达式"delims=tokens="就得去掉前后的双引号,写成delims=tokens=,并且该表达式中的所有符号都要转义,如:
for /f tokens^=1^,2^ delims^=^" %%a in (a.txt) do echo %%a %%b
(for中变量必须要用单个字母来表示,但只有一个写在in前,有多个变量值时,变量值对应的赋值给该字母变量后面的字母变量)
@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
运行显示结果:
11段 13段 14段 15段 16 段
21段 23段 24段,25段,26 段
31段 33段 34段-35段-36 段
Eol=; 分号开头的行为注释行
Tokens=1,3* 将每行第1段,第3段和剩余字段分别赋予变量%%i,%%j,%%k
Delims=,- (减号后有一空格)以逗号减号和空格为分隔符,空格必须放在最后
六、if命令
1、IF
IF 条件判断语句有 3 种基本的用法,语法格式如下:
IF [NOT] ERRORLEVEL number command #如果返回值等于或大于指定数字,则执行命令
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command #如果指定的文件名存在,则执行命令
ELSE 子句必须在出现在 IF 之后的同一行上。例如:
IF EXIST filename (
Del filename
) ELSE (
Echo filename missing
)
2、IF [NOT] ERRORLEVEL number command
这个用法的基本做用是判断上一条命令执行结果的返回值,以决定下一个步骤。
IF ERRORLEVEL这个句子必须放在某一个命令的后面,执行命令后由IF ERRORLEVEL 来判断命令的返回值。
当使用 if errorlevel 0 …… 的句式时,它的含义是:如果错误码的值大于或等于0的时候,将执行某个操作;
当使用 if %errorlevel%==0 …… 的句式时,它的含义是:如果错误码的值等于 0 的时候,将执行某操作。
@echo off
net user
IF %ERRORLEVEL% == 0
echo net user 执行成功了!
Pause
这是个简单判断上条命令是否执行成功。一般上一条命令的执行结果代码只有两结果,"成功"用 0 表示 "失败"用 1表示。实际上,errorlevel返回值可以在0~255之间
@echo off
Set /p var=请输入命令:
%var%
If %ERRORLEVEL% == 0 (echo %var%执行成功了) ELSE echo %var%执行失败了!
Pause
当然我门还可以把if else这样的语句分成几行写出来:
@echo off
Set /p var=随便输入个命令:
%var%
If %ERRORLEVEL% == 0 (
Echo !Var! 执行成功了
) ELSE (
Echo 基本上执行失败了..
)
Pause
3、IF [NOT] string1==string2 command
用来比较变量或者字符的值是不是相等的。但是你如果输入相同的字符,但是如果其中一个后面打了一个空格, 这个例子还是会认为相等, 为了防止字符串中含有空格,可用以下格式
If [NOT] {string1}=={string2} command
If [NOT] [string1]==[string2] command
If [NOT] "string1"=="string2" command
IF [/I] string1 ==string2 command #参数/I表示不区分大小写
@echo off
If /i a == A (echo 我们相等) ELSE echo 我们不相等
Pause
加上/I不区分大小写就相等了!
4、IF [NOT] EXIST filename command
判断某个文件或者文件夹是否存在,如果路径有空格加个双引号就不会出现判断出错了!
@echo off
If exist "c:\test" (echo 存在文件) else echo 不存在文件
Pause
七、批处理高级技巧
1、交互界面设计
看看高手设计的菜单界面吧:
@echo off
Cls
Title 终极多功能修复
Color 0A
Echo.
Echo ================================
Echo 请选择要进行的操作,然后按回车
Echo ================================
Echo.
Echo 1.网络修复及上网相关设置,修复IE,自定义屏蔽网站
Echo.
Echo 2.病毒专杀工具,端口关闭工具,关闭自动播放
Echo.
Echo 3.清除所有多余的自启动项目,修复系统错误
Echo.
Echo 4.清理系统垃圾,提高启动速度
Echo.
Echo Q.退出
Echo.
Echo.
:cho
Set choice=
Set /p choice=请选择:
IF NOT "%choice%"=="" SET choice=%choice:~0,1%
If /i "%choice%"=="1" goto ip
If /i "%choice%"=="2" goto setsave
If /i "%choice%"=="3" goto kaiji
If /i "%choice%"=="4" goto clean if /i "%choice%"=="Q" goto endd
Echo 选择无效,请重新输入
Echo.
Goto cho
2、循环语句
1、指定次数循环
FOR /L %variable IN (start,step,end) DO command [command-parameters]
组合命令:
FOR /L %variable IN (start,step,end) DO (
Command1
Command2
……
)
3、条件循环
for命令循环有一个缺点,就是整个循环被当作一条命令语句,涉及到变量延迟的问题。 其实利用goto语句和条件判断可以实现条件循环:
@echo off
Set var=0
Rem ************循环开始了
:continue
Set /a var+=1
Echo 第%var%次循环
If %var% lss 100 goto continue
Rem ************循环结束了
Echo 循环执行完毕
Pause
@echo off
Set var=100
Rem ************循环开始了
:continue
Echo 第%var%次循环
Set /a var-=1
If %var% gtr 0 goto continue
Rem ************循环结束了
Echo 循环执行完毕
Pause
3、子程序
在批处理程序中可以调用外部可运行程序,比如 exe 程序,也可调用其他批处理程序,这些也可以看作子程序,但是不够方便。在 windows中,批处理可以调用本程序中的一个程序段,相当于子程序,这些子程序一般放在主程序后面。子过程一般放在最后,并且注意在主程序最后要加上exit或跳转语句,避免错误的进入子过程。 子程序和主程序中的变量都是全局变量,其作用范围都是整个批处理程序。传至子程序的参数在 call 语句中指定,子程序返回主程序的数据只需在调用结束后直接引用就可以了,当然也可以指定返回变量,请看下面的例子。
子程序例1:
@echo off
Call :sub return 你好
Echo 子程序返回值:%return%
Pause
:sub
Set %1=%2
Goto :eof
运行结果:你好
子程序例2:
@echo off
call :sub return 你好
echo 子程序返回值:%return%
pause
:sub
set %1=%2
goto :eof
运行结果:你好
子程序例3:设计一个求多个整数相加的子程序
@echo off
set sum=0
call :sub sum 10 20 35
echo 数据求和结果:%sum%
pause
:sub
rem 参数1为返回变量名称
set /a %1=%1+%2
shift /2
if not "%2"=="" goto sub
goto :eof
运行结果:65
4、将批处理转化为可执行文件:
由于批处理文件是一种文本文件,任何人都可以对其进行随便编辑,不小心就会把里面的命令破坏掉,所以如果将其转换成.com格式的可执行文件,不仅执行效率会大大提高,而且不会破坏原来的功能,更能将优先级提到最高。Bat2Com 就可以完成这个转换工作。 这是一个只有5.43K大小的免费绿色工具,可以运行在纯DOS或DOS 窗口的命令行中,用法:Bat2Com Filename,这样就会在同一目录下生成一个名为 filenme.com 的可执行文件,执行的效果和原来的.bat文件一样。
在DOS环境下,可执行文件的优先级由高到低依次为.com>.exe>.bat>.cmd,即如果在同一目录下存在文件名相同的这四类文件,当只键入文件名时,DOS执行的是name.com,如果需要执行其他三个文件,则必须指定文件的全名,如name.bat。
5、时间延迟
顾名思义就是执行一条命令后延迟一段时间再进行下一条命令。
1、利用ping 命令延时
@echo off
Echo 延时前:%time%
Ping /n 3 127.0.0.1 >nul
Echo 延时后:%time%
Pause
用到了 ping 命令的“/n”参数,表示要发送多少次请求到指定的 ip。本例中要发送 3 次请求到本机的Ip(127.0.0.1)。127.0.0.1 可简写为127.1。“>nul”就是屏蔽掉ping命令所显示的内容。
2、利用for命令延时
@echo off
echo 延时前:%time%
for /l %%i in (1,1,5000) do echo %%i>nul
Echo 延时后:%time%
Pause
原理很简单,就是利用一个计次循环并屏蔽它所显示的内容来达到延时的目的。
3、利用vbs延迟函数,精确度毫秒,误差1000毫秒内
@echo off
echo %time%
call :delay 5000
echo %time%
pause
exit
:delay
echo wscript.Sleep %1>delay.vbs
cscript //B delay.vbs
del delay.vbs
goto :eof
运行显示:
10:44:06.45
10:44:11.95
请按任意键继续. . .
上面的运行结果显示实际延时了 5500 毫秒,多出来的 500 毫秒是建立和删除临时文件所耗费的时间。误差在一秒之内。
4、仅用批处理命令实现任意时间延迟,精确度10毫秒,误差50毫秒内
@echo off
Set /p delay=请输入需延迟的毫秒数:
Set totaltime=0
Set nowtime=%time%
::读取起始时间,时间格式为:13:01:05.95
echo 程序开始时间:%nowtime%
:delay_continue
Set /a minute1=1%nowtime:~3,2%-100
::读取起始时间的分钟数
Set /a second1=1%nowtime:~-5,2%%nowtime:~-2%0-100000
::将起始时间的秒数转为毫秒
Set nowtime=%time%
Set /a minute2=1%nowtime:~3,2%-100
:: 读取现在时间的分钟数
Set /a second2=1%nowtime:~-5,2%%nowtime:~-2%0-100000
::将现在时间的秒数转为毫秒
Set /a totaltime+=(%minute2%-%minute1%+60)%%60*60000+%second2%-%second1%
If %totaltime% lss %delay% goto delay_continue
Echo 程序结束时间:%time%
Echo 设定延迟时间:%delay%毫秒
Echo 实际延迟时间:%totaltime%毫秒
Pause
运行显示:
请输入需延迟的毫秒数:6000
程序开始时间:15:32:16.37
程序结束时间:15:32:22.37
设定延迟时间:6000毫秒
实际延迟时间:6000毫秒
请按任意键继续. . .
首先设定要延迟的毫秒数,然后用循环累加时间,直到累加时间大于等于延迟时间。
为了方便引用,可将上面的例子改为子程序调用形式:
@echo off
Echo 程序开始时间:%Time%
Call :delay 10
Echo 实际延迟时间:%totaltime%毫秒
Echo 程序结束时间:%time%
Pause
Exit
::-----------以下为延时子程序--------------------
:delay
@echo off
If "%1"=="" goto :eof
Set delaytime=%1
Set totaltime=0
Set nowtime=%time%
::读取起始时间,时间格式为:13:01:05.95
:delay_continue
Set /a minute1=1%nowtime:~3,2%-100
Set /a second1=1%nowtime:~-5,2%%nowtime:~-2%0-100000
Set nowtime=%time%
Set /a minute2=1%nowtime:~3,2%-100
Set /a second2=1%nowtime:~-5,2%%nowtime:~-2%0-100000
Set /a totaltime+=(%minute2%-%minute1%+60)%%60*60000+%second2%-%second1%
If %totaltime% lss %delaytime% goto delay_continue
Goto :eof
6、模拟进度条
下面给出一个模拟进度条的程序。如果将它运用在你自己的程序中,可以使你的程序更漂亮。
@echo off
Mode con cols=113 lines=15 &color 9f
Echo.
Echo 程序正在初始化. . .
Echo.
Set /p=■<nul
For /L %%i in (1 1 38) do set /p a=■<nul&ping /n 1 127.0.0.1>nul
Echo 100%%
Pause
解说:
“set /p a=■<nul”的意思是:只显示提示信息“■”且不换行,也不需手工输入任何信息,这样可以使每个“■”在同一行逐个输出。
“ping /n 0 127.1>nul”是输出每个“■”的时间间隔,即每隔多少时间输出一个“■”。
7、随机数(%random%)的应用技巧
%RANDOM% 系统变量返回0 到32767之间的任意十进制数字。0~32767实际就是15位二进制数的范围。那么,如何获取100以内的随机数呢?很简单,将%RANDOM%按 100进行求余运算即可,见例子。
@echo off
Setlocal enabledelayedexpansion
For /L %%i in (1 1 5) do (
Set /a randomnum=!Random!%%100 :: 求余数运算%%
Echo 随机数:!randomnum!
)
Pause
运行结果:(每次运行不一样)
随机数:91
随机数:67
随机数:58
随机数:26
随机数:20
请按任意键继续. . .
生成5 个 100以内的随机数,求余数运算set /a randomnum=!Random!%%100中的100可以是 1~32768之间的任意整数。
@echo off
Call :randompassword 5 pass1 pass2
Echo %pass1% %pass2%
Pause
Exit
:randompassword
::---------生成随机密码
::---------%1为密码长度,%2 及以后为返回变量名称
::---------for命令最多只能区分31个字段
@echo off
Set password_len=%1
If not defined password_len goto :eof
If %password_len% lss 1 goto :eof
Set wordset=a b c d e f g h i j k l m n o p q r s t u v w x y z
Set return= set num=0
:randompassword1
Set /a num+=1
Set /a numof=%random%%%26+1
For /f "tokens=%numof% delims= " %%i in ("%wordset%") do set return=%return%%%i
If %num% lss %password_len% goto randompassword1
If not "%2"=="" set %2=%return%
Shift /2
If not "%2"=="" goto randompassword
Goto :eof
生成给定位数的随机密码,将26个英文字母或10数字以及其它特殊字符组成一个字符串,随机抽取其中的若干字符。
@echo off
Call :randompassword 6 pass1 pass2 pass3
Echo %pass1% %pass2% %pass3%
Pause
Exit
:randompassword
::---------生成随机密码
::---------%1为密码长度,%2 及以后为返回变量名称
::---------goto循环、变量嵌套、命令嵌套
@echo off
If "%1"=="" goto :eof
If %1 lss 1 goto :eof
Set password_len=%1
Set return=
Set wordset=abcdefghijklmnopqrstuvwxyz023456789_
::---------------------------循环
:randompassword1
Set /a numof=%random%%%36
Call set return=%return%%%wordset:~%numof%,1%%
Set /a password_len-=1
If %password_len% gtr 0 goto randompassword1
::---------------------------循环
If not "%2"=="" set %2=%return%
Shift /2
If not "%2"=="" goto randompassword
Goto :eof
生成给定位数的随机密码,将26个英文字母或10数字以及其它特殊字符组成一个字符串,随机抽取其中的若干字符。
8、注意点
先写一个redis的开启bat文件 redis-Start.bat
再写一个redis的登陆bat文件 redis-login.bat
最后写一个redis汇总启动文件 Redis.bat
@echo off
start /D "F:\批处理文件汇总" call redis-Start.bat
start /D "F:\批处理文件汇总" call redis-login.bat
参数D 后面的参数表示被调用命令的所在目录。
出处:https://www.cnblogs.com/tester-l/p/6049135.html