Windows批处理学习(二)——批处理(3)
2014-06-08 01:32 -夜 阅读(463) 评论(0) 收藏 举报前记
DOS批处理的变量扩展
1.参数化变量扩展
|
1
2
3
4
5
6
7
8
|
@echo offset var=testcall
:deal %var% demo:dealecho %%0=%0echo %%1=%1echo %%2=%2pause |
|
1
2
3
4
|
@echo offset /p inPath=请输入或拖放目录和文件...echo 你输入的路径为:%inPath%pause |
|
1
2
3
4
|
@echo offecho 当前执行程序:%0echo 拖拽的文件或目录:%1pause |
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 offecho 正在运行的这个批处理:echo 完全路径:%0echo 去掉引号:%~0echo 所在分区:%~d0echo 所处路径:%~p0echo 文件名:%~n0echo 扩展名:%~x0echo 文件属性:%~a0echo 修改时间:%~t0echo 文件大小:%~z0pause |
3.字符串变量扩展
3.1.字符串的拼接
|
1
2
3
4
5
6
7
|
@echo offset 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 offset var=Hello
World .echo 原字符串:%var%echo 将World替换为Tom:%var:World=Tom%set /p name=你输入你的名字:echo 将World替换为输入的名字:%var:World=%%name%%setlocal
enabledelayedexpansionecho 将World替换为输入的名字:%var:World=!name!%pause |
3.3.字符串的截取
|
1
2
3
4
5
6
7
8
9
10
|
@echo offset var=abcdefghecho 原始字符串:%var%echo 字符串索引:01234567echo 从第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 offset var=abcdefghecho 原始字符串:%var%echo 字符串索引:01234567echo 字符串倒数索引:87654321echo 倒数截取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 offecho ***************强制删除目录*****************echo 使用方法:echo 1.请输入要删除目录的完整路径地址。echo 2.将要删除的目录拖放到执行中的批处理中。echo 3.将要删除的目录拖放到程序图标上。echo 注意:支持文件删除,删除后无法在回收站恢复。echo ********************************************echo=set inPath=%1if defined
inPath ( goto
op1) else ( goto
op2):op1if exist
%inPath%\nul ( 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:op2set /p inPath=目录完全路径地址(输入或拖放)并回车:if exist
%inPath%\nul ( rem
删除目录下所有文件 del /f /a /q %inPath% rem
删除当前目录 rd /s /q %inPath%) else ( rem
删除目录下所有文件 del /f /a /q %inPath%)goto
end:endecho=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 offecho *******************锁定文件夹管理********************echo=使用说明:echo=1.新建目录必须使用至少一个"."结尾才能锁定进行管理,否则视为普通目录。echo=2.打开目录必须使用完全路径名。echo=3.删除目录必须首先删除目录中的所有文件。通过打开手动删除。echo *****************************************************:startecho=set /p op=请选择以上操作(1.新建/2.打开/3.删除):if %op%==1
goto op1if %op%==2
goto op2if %op%==3
goto op3:op1set /p dName=请输入新建目录的名称:md
%dName%.\if errorlevel
0 ( echo=%dName%目录新建完成!) else ( echo=%dName%目录创建失败!)goto
end:op2set /p dName=请输入要打开的目录(完整路径):start
%dName%.\if errorlevel
0 ( echo=%dName%目录已打开!) else ( echo=%dName%目录打开失败!)goto
end:op3set /p dName=请输入要删除的目录:rd
%dName%.goto
end:endecho=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 offrem
使用系统环境变量来获取各个指定的目录地址,系统环境变量可以在系统属性中查看echo 正在清理系统垃圾文件,请稍后......rem
“%systemdrive%”为系统盘符环境变量,一般为“C:”del /f /s /q %systemdrive%\*.tmpdel /f /s /q %systemdrive%\*.logrem
“recycled”目录是回收站的目录,如果不清空回收站,则可以注释该语句del /f /s /q %systemdrive%\recycled\*.*rem
“%windir%”为系统目录环境变量,一般为“C:\WINDOWS”del /f /s /q %windir%\*.bakrem
“prefetch”目录为预读文件目录del /f /s /q %windir%\prefetch\*.*rem
“temp”表示临时工作目录rd /s /q %windir%\temp
& md %windir%\temprem
“%userprofile%”为系统当前用户目录环境变量,一般为“C:\Documents and Settings\用户名”rem
“cookies”目录为浏览器“cookie”存放目录del /f /q %userprofile%\cookies\*.*rem
“Local Settings”目录为浏览器缓存目录del /f /s /q "%userprofile%\Local
Settings\Temporary Internet Files\*.*"del /f /s /q "%userprofile%\Local
Settings\Temp\*.*"echo 清理系统垃圾完成!echo.
& pause |
4.重新注册系统组件
|
1
2
3
4
5
6
7
8
9
10
11
12
|
@echo offset 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 offecho #################################################echo 使用说明:echo 不指定工作路径则为当前所在目录。echo 只需要指定需要替换的字符串和替换成的字符串即可。echo #################################################set dPath=%~dp0set /p dPath=设置文件所在目录(默认为%dPath%)::startset /p oldStr=要替换的字符串:set /p newStr=要替换成的字符串:if not
defined oldStr goto startif not
defined newStr goto startsetlocal
enabledelayedexpansionfor /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=nset /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 offtitle
端口/进程管理工具setlocal
enabledelayedexpansion:menuecho=echo ╔-
-╗echo 本机开放的端口及使用该端口的进程管理工具echo=
..........................................................echo 1.TCP/UDP分类列表查看echo 2.本地端口查找echo 3.进程终止echo Q:退出echo ╚-
-╝echo=set op=qset /p op=请选择操作:if %op%==1
goto seeTypeif %op%==2
goto searchPortif %op%==3
goto killProcessif /i %op%
equ q goto endgoto
menu:seeTypeecho=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:searchPortset /p prot=请输入要查找的端口号(输入b返回主菜单):if not
defined prot goto :searchPortif /i %prot%
equ b goto :menuecho=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:killProcessset /p proTag=请输入进程ID或名称(输入b返回主菜单):if not
defined proTag goto killProcessif /i %proTag%
equ b goto menufor /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 killProcessfor /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:endecho=set exitop=nset /p exitop=是否退出?(Y/N)if /i %exitop%
equ y (exit) else (goto
menu)rem
构建输出信息,根据长度补全空格,是左边对齐:builderInforem
字符串最大长度set maxLength=%1rem
原始字符串set str=%2rem
原始字符串长度set /a length=0rem
计算字符串长度,使用循环截取单个字符是否等于空为依据:getLengthset /a length+=1if "%str%"=="" goto
fillSpancefor /f %%i in ("%length%") do ( if not "!str:~%%i,1!"=="" goto
getLength)rem
使用空格补全字符串,如果原始字符串长度小于最大字符串长度则在后面添加空格:fillSpanceset 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 offtitle
服务管理工具setlocal
enabledelayedexpansion:menuecho=echo ==================================================echo=echo -=服务管理工具=-echo=echo 1.启动服务
2.关闭服务echo Q.退出echo=echo 使用说明:启动或关闭服务需要输入服务名称,服务名称echo 可以通过“service.msc”管理面板对应属性中查看。echo ==================================================echo=set /p op=请选择操作:if %op%==1
goto startServiceif %op%==2
goto closeServiceif /i %op%
equ q exitgoto
menu:startServiceecho=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:closeServiceecho=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:endecho=set exitop=nset /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:mainclsecho.echo 要计算某几个数字的和,请直接敲回车echo (注:由于过于复杂和时间问题,原码并非本人编写来自网络)echo 退出请输入
eecho.set num1=0.0set times=0set expression=:input_loopset num2=set sum_=set /a times+=1set /p num2=
请输入第 %times%
个数:if /i "%num2%"=="e" exitif "%num2%"=="" goto
resultif "%num2:~0,1%"=="." set num2=0%num2%call
:input_check "%num2%" num2set expression=%expression%+%num2%setlocal
enabledelayedexpansionfor /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_checkrem
=========== 检测输入是否正确 ===========echo %1|findstr "\.">nul||set %~2=%~1.0for /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_lengthrem
=========== 计算各部分数字的长度 ===========set count=0:interceptset /a count+=1for /f %%i in ("%2") do ( set var=%%i if not "!var:~%count%,1!"=="" goto
intercept set %1_length=!count!)goto
:eof:add_zerorem
=========== 分别在整数部分和小数部分添加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_zerorem
=========== 根据数字字符串长度的差异,生成相应长度的0字符串 ===========set zero=for /l %%i in (1,1,%2) do set zero=!zero!0set %1=%zero%goto
:eof:sumrem
=========== 按位计算新数的和 ===========::
提取整数部分和小数部分来组成新数set num1_new=%int1%%dec1%set num2_new=%int2%%dec2%set /a length_total=%int_length_max%+%dec_length_max%set switch=0set 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:resultif "%expression%"=="" set /a times-=1&goto
input_loopecho.echo %expression:~1%=%num1%echo.pausegoto
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 offset a=10set b=0:texset /a a+=3set /a b+=1mode
con cols=%a% lines=%b%if %a%
lss 60 goto :texecho O(∩_∩)O
圣诞快乐 O(∩_∩)Oset a=15,a6,2e,d0,34,8b,4f,9d,5efor %%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.txtdel
ms.txtpause |
浙公网安备 33010602011771号