前记
DOS批处理的变量扩展
1.参数化变量扩展
1
2
3
4
5
6
7
8
|
@ echo off set var= test call
:deal %var% demo :deal echo %%0=%0 echo %%1=%1 echo %%2=%2 pause |
1
2
3
4
|
@ echo off set /p inPath=请输入或拖放目录和文件... echo 你输入的路径为:%inPath% pause |
1
2
3
4
|
@ echo off echo 当前执行程序:%0 echo 拖拽的文件或目录:%1 pause |
2.单字符变量扩展
变量替换方式 | 说明 |
%~变量名 | 删除变量所表示的值的两端的引号 |
%~f变量名 | 在变量之前追加当前执行路径(目录路径) |
%~d变量名 | 将变量转换为当前盘符 |
%~p变量名 | 将变量转换为目录路径(不包含盘符) |
%~n变量名 | 将变量转换为文件名(当集合类型为字符串时) |
%~x变量名 | 将变量转换为文件扩展名,只适合字符串 |
%~s变量名 | 在变量之前追加当前执行短路径(目录短路径) |
%~a变量名 | 将变量转换为文件的属性,只适合字符串 |
%~t变量名 | 将变量转换为文件的修改日期,只适合字符串 |
%~z变量名 | 将变量转换为文件的大小(KB),只适合字符串 |
%~$PATH:变量名 | 将变量转换为环境变量的目录 |
%~dp变量名 | 将变量转换为当前执行目录路径 |
%~nx变量名 | 将变量转换为文件全名称(包括扩展名) |
%~fs变量名 | 将变量转换为完整的短路径名称 |
%~dp$PATH:变量名 | 将变量转换为环境变量的目录 |
%~ftza变量名 | 将变量转换为包含属性、修改日期、大小、全路径的列表 |
1
2
3
4
5
6
7
8
9
10
11
12
|
@ echo off echo 正在运行的这个批处理: echo 完全路径:%0 echo 去掉引号:%~0 echo 所在分区:%~d0 echo 所处路径:%~p0 echo 文件名:%~n0 echo 扩展名:%~x0 echo 文件属性:%~a0 echo 修改时间:%~t0 echo 文件大小:%~z0 pause |
3.字符串变量扩展
3.1.字符串的拼接
1
2
3
4
5
6
7
|
@ echo off set var1=伟大的中国! set var2=我为你自豪! echo 拼接字符串:%var1%%var2% set var3=%var1%%var2% echo %var3% pause |
3.2.字符串的替换
1
2
3
4
5
6
7
8
9
|
@ echo off set var=Hello
World . echo 原字符串:%var% echo 将World替换为Tom:%var:World=Tom% set /p name=你输入你的名字: echo 将World替换为输入的名字:%var:World=%%name%% setlocal
enabledelayedexpansion echo 将World替换为输入的名字:%var:World=!name!% pause |
3.3.字符串的截取
1
2
3
4
5
6
7
8
9
10
|
@ echo off set var=abcdefgh echo 原始字符串:%var% echo 字符串索引:01234567 echo 从第3个字符开始截取:%var:~2% echo 截取前5个字符:%var:~0,5% echo 截取3-6个字符:%var:~2,4% echo 截取6-12个字符:%var:~6,6% echo 截取15-20个字符:%var:~15,5% pause |
1
2
3
4
5
6
7
8
9
|
@ echo off set var=abcdefgh echo 原始字符串:%var% echo 字符串索引:01234567 echo 字符串倒数索引:87654321 echo 倒数截取3个字符:%var:~-3% echo 从倒数第5个字符开始截取3个字符:%var:~-5,3% echo 从第2个字符开始截取到倒数第5个字符位置:%var:~2,-5% pause |
DOS批处理的符号总结
-
“@”符号
-
“>”符号
-
“>>”符号
-
“<”符号
-
“|”符号
-
“^”符号
-
“$”符号
-
“&”符号
-
“&&”符号
-
“||”符号
-
“>&”/“<&”符号
-
“()”符号
-
“!”符号
-
“~”符号
-
“+”符号
-
“-”符号
-
“*”符号
-
“/”符号
-
“%”符号
-
“<<”符号
-
“=”符号
-
“,”符号
-
“.”符号
-
“ ”符号
-
“?”符号
-
“""”符号
-
“''”符号
-
“;”符号
-
“[”符号
-
“]”符号
-
“”符号
-
“:”符号
-
“::”符号
-
“nul”符号
实用案例分析
1.强制删除目录或文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
@ echo off echo ***************强制删除目录***************** echo 使用方法: echo 1.请输入要删除目录的完整路径地址。 echo 2.将要删除的目录拖放到执行中的批处理中。 echo 3.将要删除的目录拖放到程序图标上。 echo 注意:支持文件删除,删除后无法在回收站恢复。 echo ******************************************** echo = set inPath=%1 if defined
inPath ( goto
op1 ) else ( goto
op2 ) :op1 if exist
%inPath%
ul ( rem
删除目录下所有文件(网传有del /f /a /q \?%1做法) del /f /a /q %1 rem
删除当前目录(网传有rd /s /q \?%1做法) rd /s /q %1 ) else ( rem
删除目录下所有文件(网传有del /f /a /q \?%1做法) del /f /a /q %1 ) goto
end :op2 set /p inPath=目录完全路径地址(输入或拖放)并回车: if exist
%inPath%
ul ( rem
删除目录下所有文件 del /f /a /q %inPath% rem
删除当前目录 rd /s /q %inPath% ) else ( rem
删除目录下所有文件 del /f /a /q %inPath% ) goto
end :end echo = echo 删除已完成!请刷新看看是否删除。 pause
> nul |
2.锁定目录管理(无法引用的目录)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
@ echo off echo *******************锁定文件夹管理******************** echo =使用说明: echo =1.新建目录必须使用至少一个 "." 结尾才能锁定进行管理,否则视为普通目录。 echo =2.打开目录必须使用完全路径名。 echo =3.删除目录必须首先删除目录中的所有文件。通过打开手动删除。 echo ***************************************************** :start echo = set /p op =请选择以上操作(1.新建 /2 .打开 /3 .删除): if % op %==1
goto op1 if % op %==2
goto op2 if % op %==3
goto op3 :op1 set /p dName=请输入新建目录的名称: md
%dName%. if errorlevel
0 ( echo =%dName%目录新建完成! ) else ( echo =%dName%目录创建失败! ) goto
end :op2 set /p dName=请输入要打开的目录(完整路径): start
%dName%. if errorlevel
0 ( echo =%dName%目录已打开! ) else ( echo =%dName%目录打开失败! ) goto
end :op3 set /p dName=请输入要删除的目录: rd
%dName%. goto
end :end echo = set /p choose=是否退出?
(Y /N ): if /i %choose%
equ y ( exit ) else ( goto
start ) |
3.清理系统垃圾信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
@ echo off rem
使用系统环境变量来获取各个指定的目录地址,系统环境变量可以在系统属性中查看 echo 正在清理系统垃圾文件,请稍后...... rem
“%systemdrive%”为系统盘符环境变量,一般为“C:” del /f /s /q %systemdrive%*.tmp del /f /s /q %systemdrive%*.log rem
“recycled”目录是回收站的目录,如果不清空回收站,则可以注释该语句 del /f /s /q %systemdrive%
ecycled*.* rem
“%windir%”为系统目录环境变量,一般为“C:WINDOWS” del /f /s /q %windir%*.bak rem
“prefetch”目录为预读文件目录 del /f /s /q %windir%prefetch*.* rem
“temp”表示临时工作目录 rd /s /q %windir% emp
& md %windir% emp rem
“%userprofile%”为系统当前用户目录环境变量,一般为“C:Documents and Settings用户名” rem
“cookies”目录为浏览器“cookie”存放目录 del /f /q %userprofile%cookies*.* rem
“Local Settings”目录为浏览器缓存目录 del /f /s /q "%userprofile%Local
SettingsTemporary Internet Files*.*" del /f /s /q "%userprofile%Local
SettingsTemp*.*" echo 清理系统垃圾完成! echo .
& pause |
4.重新注册系统组件
1
2
3
4
5
6
7
8
9
10
11
12
|
@ echo off set dPath=%systemroot%system32 echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ echo 输入目录,注册其下的所有DLL或OCX组件 echo ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ set /p dPath=请输入你要注册组件的目录(默认为%dPath%): for %%f in (%dPath%.dll) do ( regsvr32 /s %%f ) for %%f in (%dPath%.ocx) do ( regsvr32 /s %%f ) |
5.批量文件重命名操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
@ echo off echo ################################################# echo 使用说明: echo 不指定工作路径则为当前所在目录。 echo 只需要指定需要替换的字符串和替换成的字符串即可。 echo ################################################# set dPath=%~dp0 set /p dPath=设置文件所在目录(默认为%dPath%): :start set /p oldStr=要替换的字符串: set /p newStr=要替换成的字符串: if not
defined oldStr goto start if not
defined newStr goto start setlocal
enabledelayedexpansion for /f "skip=4
tokens=3*" %%a in ( 'dir' ) do ( if not
%%a==^<DIR^> ( if not
%%b==字节 ( if not
%%b==可用字节 ( if not
%%b==%~nx0 ( set fileName=%%b set fileName=!fileName:%oldStr%=%newStr%! ren "%%b" "!fileName!" ) ) ) ) ) set exitop=n set /p exitop=是否退出?(Y /N ) if /i %exitop%
equ y ( exit ) else ( goto
start ) pause |
6.进程、端口信息管理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
|
@ echo off title
端口/进程管理工具 setlocal
enabledelayedexpansion :menu echo = echo ╔-
-╗ echo 本机开放的端口及使用该端口的进程管理工具 echo =
.......................................................... echo 1.TCP /UDP 分类列表查看 echo 2.本地端口查找 echo 3.进程终止 echo Q:退出 echo ╚-
-╝ echo = set op =q set /p op =请选择操作: if % op %==1
goto seeType if % op %==2
goto searchPort if % op %==3
goto killProcess if /i % op %
equ q goto end goto
menu :seeType echo = echo -=TCP协议=- echo = echo 本地地址
端口 进程ID 进程名称 echo ───────────────────────────── for /f "skip=4
tokens=2,5" %%a in ( 'netstat
-ano -p tcp' ) do ( set resultStr= rem
拆分本地地址为IP和端口号 for /f "delims=:
tokens=1,2" %%i in ( "%%a" ) do ( call
:builderInfo 15 %%i set resultStr1=
!resultStr! call
:builderInfo 6 %%j set resultStr2=!resultStr1!
!resultStr! ) call
:builderInfo 6 %%b set resultStr3=!resultStr2!
!resultStr! rem
通过进程ID获取进程名称 for /f "skip=2
delims=, tokens=1" %%i in ( 'tasklist
/fi "PID eq %%b" /fo csv' ) do ( set resultStr4=!resultStr3!
%%~i ) echo !resultStr4! ) echo ========================================================== echo = echo -=UDP协议=- echo = echo 本地地址
端口 进程ID 进程名称 echo ───────────────────────────── for /f "skip=4
tokens=2,4" %%a in ( 'netstat
-ano -p udp' ) do ( set resultStr= rem
拆分本地地址为IP和端口号 for /f "delims=:
tokens=1,2" %%i in ( "%%a" ) do ( call
:builderInfo 15 %%i set resultStr1=
!resultStr! call
:builderInfo 6 %%j set resultStr2=!resultStr1!
!resultStr! ) call
:builderInfo 6 %%b set resultStr3=!resultStr2!
!resultStr! rem
通过进程ID获取进程名称 for /f "skip=2
delims=, tokens=1" %%i in ( 'tasklist
/fi "PID eq %%b" /fo csv' ) do ( set resultStr4=!resultStr3!
%%~i ) echo !resultStr4! ) goto
end :searchPort set /p prot=请输入要查找的端口号(输入b返回主菜单): if not
defined prot goto :searchPort if /i %prot%
equ b goto :menu echo = echo =
-=本地%prot%端口使用明细=- echo = echo 协议名称
进程ID 进程名称 echo ───────────────── for /f "tokens=1,2,4,5" %%a in ( 'netstat
-ano ^| findstr ":%prot%>"' ) do ( for /f %%i in ( 'echo
%%b ^| findstr ":%prot%>"' ) do ( set resultStr= if /i %%a
equ UDP ( call
:builderInfo 6 %%c set resultStr1=
UDP !resultStr! rem
通过进程ID获取进程名称和对应组件 for /f "skip=2
delims=, tokens=1" %%i in ( 'tasklist
/fi "PID eq %%c" /fo csv' ) do ( set resultStr2=!resultStr1!
%%~i ) ) else ( call
:builderInfo 6 %%d set resultStr1=
TCP !resultStr! rem
通过进程ID获取进程名称和对应组件 for /f "skip=2
delims=, tokens=1" %%i in ( 'tasklist
/fi "PID eq %%d" /fo csv' ) do ( set resultStr2=!resultStr1!
%%~i ) ) echo !resultStr2! ) ) goto
end :killProcess set /p proTag=请输入进程ID或名称(输入b返回主菜单): if not
defined proTag goto killProcess if /i %proTag%
equ b goto menu for /f %%i in ( 'echo
%proTag% ^| findstr ".exe .dll"' ) do ( set /a count=0 for /f "skip=2
delims=, tokens=1,2,3" %%a in ( 'tasklist
/fi "imagename eq %%i" /fo csv' ) do ( set /a count+=1 ) set sure=N set /p sure=确定结束%proTag%指向的!count!个进程吗?(Y /N ) if /i !sure!
equ y ( taskkill /im %proTag% /f ) else ( goto
killProcess ) ) set /a num=%proTag% if %num%==0 echo 请输入正确进程ID或进程名称,例如123或cmd.exe...
&& goto killProcess for /f "skip=2
delims=, tokens=1,2,3" %%a in ( 'tasklist
/fi "pid eq %num%" /fo csv' ) do ( set sure=N set /p sure=确定结束%num%指向进程吗?(Y /N ) if /i !sure!
equ y ( taskkill /pid %num% /f ) else ( goto
killProcess ) ) goto
end :end echo = set exitop=n set /p exitop=是否退出?(Y /N ) if /i %exitop%
equ y ( exit ) else ( goto
menu ) rem
构建输出信息,根据长度补全空格,是左边对齐 :builderInfo rem
字符串最大长度 set maxLength=%1 rem
原始字符串 set str=%2 rem
原始字符串长度 set /a length=0 rem
计算字符串长度,使用循环截取单个字符是否等于空为依据 :getLength set /a length+=1 if "%str%" == "" goto
fillSpance for /f %%i in ( "%length%" ) do ( if not "!str:~%%i,1!" == "" goto
getLength ) rem
使用空格补全字符串,如果原始字符串长度小于最大字符串长度则在后面添加空格 :fillSpance set temp= if /i %length%
lss %maxLength% ( for /l %%i in (%length%,1,%maxLength%) do ( set temp=
!temp! ) ) set resultStr=%str%!temp! |
7.启动或关闭服务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
@ echo off title
服务管理工具 setlocal
enabledelayedexpansion :menu echo = echo ================================================== echo = echo -=服务管理工具=- echo = echo 1.启动服务
2.关闭服务 echo Q.退出 echo = echo 使用说明:启动或关闭服务需要输入服务名称,服务名称 echo 可以通过“service.msc”管理面板对应属性中查看。 echo ================================================== echo = set /p op =请选择操作: if % op %==1
goto startService if % op %==2
goto closeService if /i % op %
equ q exit goto
menu :startService echo = set /p serviceName=请输入你要启动的服务名称: for /f "delims=" %%a in ( 'net
start ^| find /i "%serviceName%"' ) do ( set /p choice1=%serviceName%服务正在运行...是否关闭?(Y /N ^) if /i !choice1!
equ y ( net
stop %serviceName% ) goto
end ) net
start %serviceName% goto
end :closeService echo = set /p serviceName=请输入你要关闭的服务名称: for /f "delims=" %%a in ( 'net
start ^| find /i "%serviceName%"' ) do ( net
stop %serviceName% goto
end ) set /p choice2=%serviceName%服务处于停止状态...是否开启?(Y /N ^) if /i %choice2%
equ y ( net
start !serviceName! ) goto
end :end echo = set exitop=n set /p exitop=是否退出?(Y /N ) if /i %exitop%
equ y ( exit ) else ( goto
menu ) |
8.算法扩展:关于浮点数运算
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
@ echo off :main cls echo . echo 要计算某几个数字的和,请直接敲回车 echo (注:由于过于复杂和时间问题,原码并非本人编写来自网络) echo 退出请输入
e echo . set num1=0.0 set times =0 set expression= :input_loop set num2= set sum_= set /a times +=1 set /p num2=
请输入第 % times %
个数: if /i "%num2%" == "e" exit if "%num2%" == "" goto
result if "%num2:~0,1%" == "." set num2=0%num2% call
:input_check "%num2%" num2 set expression=%expression%+%num2% setlocal
enabledelayedexpansion for /f "tokens=1-4
delims=." %%i in ( "%num1%.%num2%" ) do ( set int1=%%i set int2=%%k set dec1=%%j set dec2=%%l call
:get_length int1 %%i call
:get_length int2 %%k call
:get_length dec1 %%j call
:get_length dec2 %%l call
:add_zero call
: sum goto
input_loop ) :input_check rem
=========== 检测输入是否正确 =========== echo %1|findstr "." >nul|| set %~2=%~1.0 for /f "tokens=1*
delims=." %%i in (%1) do ( echo %%i%%j|findstr "^[0-9]*$" >nul
|| ( set /a times -=1&goto
input_loop) ) goto
:eof :get_length rem
=========== 计算各部分数字的长度 =========== set count=0 :intercept set /a count+=1 for /f %%i in ( "%2" ) do ( set var=%%i if not "!var:~%count%,1!" == "" goto
intercept set %1_length=!count! ) goto
:eof :add_zero rem
=========== 分别在整数部分和小数部分添加0字符串 =========== ::
在数位不够的整数部分添0补齐 set /a int_length_diff=%int1_length%-%int2_length% set int_length_diff=%int_length_diff:-=% call
:creat_zero int_zero %int_length_diff% if %int1_length%
gtr %int2_length% ( set int2=%int_zero%%int2% set int_length_max=%int1_length% ) else ( set int1=%int_zero%%int1% set int_length_max=%int2_length% ) ::
在数位不够的小数部分添0补齐 set /a dec_length_diff=%dec1_length%-%dec2_length% set dec_length_diff=%dec_length_diff:-=% call
:creat_zero dec_zero %dec_length_diff% if %dec1_length%
gtr %dec2_length% ( set dec2=%dec2%%dec_zero% set dec_length_max=%dec1_length% ) else ( set dec1=%dec1%%dec_zero% set dec_length_max=%dec2_length% ) goto
:eof :creat_zero rem
=========== 根据数字字符串长度的差异,生成相应长度的0字符串 =========== set zero= for /l %%i in (1,1,%2) do set zero=!zero!0 set %1=%zero% goto
:eof : sum rem
=========== 按位计算新数的和 =========== ::
提取整数部分和小数部分来组成新数 set num1_new=%int1%%dec1% set num2_new=%int2%%dec2% set /a length_total=%int_length_max%+%dec_length_max% set switch=0 set sum_tmp= for /l %%i in (1,1,%length_total%) do ( set /a sum_tmp=!num1_new:~-%%i,1!+!num2_new:~-%%i,1!+!switch! if !sum_tmp!
gtr 9 ( set /a sum_tmp=!sum_tmp!-10 set switch=1 ) else ( set switch=0 ) set sum_=!sum_tmp!!sum_! ) ::
插入小数点 set sum_=!sum_:~0,-%dec_length_max%!.!sum_:~-%dec_length_max%! ::
判断在最高位时是否进位 if %switch%
equ 1 ( set num1=1%sum_% ) else ( set num1=%sum_% ) goto
:eof :result if "%expression%" == "" set /a times -=1&goto
input_loop echo . echo %expression:~1%=%num1% echo . pause goto
main |
9.应用扩展:简单的特效
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
@ echo off set a=10 set b=0 :tex set /a a+=3 set /a b+=1 mode
con cols=%a% lines=%b% if %a%
lss 60 goto :tex echo O(∩_∩)O
圣诞快乐 O(∩_∩)O set a=15,a6,2e,d0,34,8b,4f,9d,5e for %%i in (%a%) do ( ping -n
2 127.1>nul color
%%i ) for %%i in (%a%,%a%) do ( ping -n
1 127.1>nul color
%%i ) >>ms.txt echo */.
. . * . >>ms.txt echo .*
. [] * __ >>ms.txt echo */
. ./~~~~~~~~~~~~'. ^| >>ms.txt echo *,/,..,\,...........,. >>ms.txt echo ^|^|
..▎ #
▎田 田 ▎ ^| ▎ >>ms.txt echo ^|^|
^&^&;▎ ▎ ▎ '^|' ▎
o >>ms.txt echo ^|^| ##■■■■■■■■■■〓 msg
%username% /w /time :3600
<ms.txt del
ms.txt pause |