BAT脚本编写要点(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
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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
|
BAT脚本编写要点(1)_特殊字符 分类: 其他 2011-03-20 00:58 5621人阅读 评论(0) 收藏 举报 脚本cdatecmdtreesystem 1. 点 与echo连用,作用是换行 示例1 [输出空行] echo. 2 > 定向符[输出] 将命令的输出进行重定向 [一般用于将结果写入文件] 注意 nul 为空设备 >nul 则用于屏蔽输出内容 [如 pause>nul] 示例2 [向1.txt中写入字符串 wind] echo wind>1.txt 3 >> 定向符[输出] 将命令的输出进行重定向 [一般用于将结果写入文件] 注意,定向到文件时,它是在末尾追加 > 则会覆盖 示例3 [向1.txt中追加写入字符串 wind] echo wind>>1.txt 4 < 定向符[输入] 配合 set /p 使用时,从指定的文件中获取字符串 赋值给变量 示例4 [将1.txt中第1行内容赋值给变量 wind] set /p wind=<1.txt 5 & 连接符 连接两个命令 注意 不论前面的命令是否成功执行 后面的命令都将执行 示例5 [依次执行两个echo 命令] echo wind& echo snow 6 && 连接符 连接两个命令 注意 仅当前面的命令成功执行时 后面的命令才会被执行 示例6 [echo 命令成功执行 type 命令也将被执行] echo wind&& type 1.txt 示例7 [hello 命令执行失败 type 命令不会被执行] hello&& type 1.txt 7 || 连接符 连接两个命令 注意 仅当前面的命令执行失败时 后面的命令才会被执行 示例8 [echo 命令成功执行 type 命令不会被执行] echo wind|| type 1.txt 示例9 [hello 命令执行失败 type 命令将被执行] hello|| type 1.txt 8 | 传递符 将前面命令的结果 传递给后面的命令使用 [一般用于查找] 示例10 [显示字符串wind 并 传递给find 查找 关键字 w] echo wind| find "w" 2,6,7,8综合 示例11 [将字符串传递给find查找 并 输出查找结果] echo wind| find "w" >nul&& echo 找到字符w|| echo 未找到字符w 9 ^ 转义符 [脱字符] 脱去特殊符号的作用 使之成为一个纯粹的符号 示例12 [输出字符串 &&&&& ] echo ^&^&^&^&^& 10 @ at 其作用相当于 echo off 不显示命令本身 不同之处是@仅处理单个命令 echo off则是全局的 示例13 [命令行不会显示] @echo wind 11 % 百分号 两个百分号表示取值 示例14 [显示变量 wind 的值 smile] set wind=smile echo wind的值为 %wind% 注意,如果要输出一个百分号 则在批处理中要写成两个 12 * 星号 通配作用 示例15 [删除所有文本文件] del *.txt 1 echo 和 @ 回显控制命令 @ #关闭单行回显 echo off #从下一行开始关闭回显 @echo off #从本行开始关闭回显。一般批处理第一行都是这个 echo on #从下一行开始打开回显 echo #显示当前是 echo off 状态还是 echo on 状态 echo. #输出一个 "回车换行" ,一般就是指空白行 echo hello world #输出hello world "关闭回显" 是指运行批处理文件时,不显示文件里的每条命令,只显示运行结果 批处理开始和结束时,系统都会自动打开回显 2 errorlevel 程序返回码 echo %errorlevel% 每个命令运行结束,可以用这个命令行格式查看返回码 用于判断刚才的命令是否执行成功 默认值为0,一般命令执行出错会设 errorlevel 为1 3 dir 显示目录中的文件和子目录列表 dir #显示当前目录中的文件和子目录 dir /a #显示当前目录中的文件和子目录,包括隐藏文件和系统文件 dir c: /a:d #显示 C 盘当前目录中的目录 dir c:/ /a:-d #显示 C 盘根目录中的文件 dir d:/mp3 /b/p #逐屏显示 d:/mp3 目录里的文件,只显示文件名,不显示时间和大小 dir *.exe /s 显示当前目录和子目录里所有的.exe文件 其中 * 是通配符,代表所有的文件名,还一个通配符 ? 代表一个任意字母或汉字 如 c*.* 代表以 c 开头的所有文件 ?.exe 代表所有文件名是一个字母的.exe文件 如果指定的目录或文件不存在,将返回 errorlevel 为1 每个文件夹的 dir 输出都会有2个子目录 . 和 .. . 代表当前目录 .. 代表当前目录的上级目录 dir . #显示当前目录中的文件和子目录 dir .. #显示当前目录的上级目录中的文件和子目录 其它参数可参考 dir /? 4 cd 更改当前目录 cd mp3 #进入当前目录中的mp3 目录 cd .. #进入当前目录中的上级目录 cd/ #进入根目录 cd #显示当前目录 cd /d d:/mp3 #可以同时更改盘符和目录 cd/ "Documents and Settings" /All users 文件名带空格,可以不加引号 建议加上引号,因为有的时候不加引号会运行出错,如登录脚本 如果更改到的目录不存在,则出错返回 errorlevel=1 5 md 创建目录 md abc #在当前目录里建立子目录 abc md d:/a/b/c #如果 d:/a 不存在,将会自动创建 6 rd 删除目录 rd abc #删除当前目录里的 abc 子目录,要求为空目录 rd /s/q d:/temp #删除 d:/temp 文件夹及其子文件夹和文件,不需要按 Y 确认 7 del 删除文件 del d:/test.txt #删除指定文件,不能是隐藏、系统、只读文件 del *.* 删除当前目录里的所有文件,不包括隐藏、系统、只读文件,要求按 Y 确认 del /q/a/f d:/temp/*.* 删除 d:/temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录 del /q/a/f/s d:/temp/*.* 删除 d:/temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录 8 ren 文件重命名 ren 1.txt 2.bak #把 1.txt 更名为 2.bak ren *.txt *.ini #把当前目录里所有.txt文件改成.ini文件 ren d:/temp tmp #支持对文件夹的重命名 9 cls 清屏 10 type 显示文件内容 type c:/boot.ini #显示指定文件的内容,程序文件一般会显示乱码 type *.txt #显示当前目录里所有.txt文件的内容 11 copy 拷贝文件 copy c:/test.txt d:/ 复制 c:/test.txt 文件到 d:/ copy c:/test.txt d:/test.bak 复制 c:/test.txt 文件到 d:/ ,并重命名为 test.bak copy c:/*.* 复制 c:/ 所有文件到当前目录,不包括隐藏文件和系统文件 不指定目标路径,则默认目标路径为当前目录 copy con test.txt 从屏幕上等待输入,按 Ctrl+Z 结束输入,输入内容存为test.txt文件 con代表屏幕,prn代表打印机,nul代表空设备 copy 1.txt + 2.txt 3.txt 合并 1.txt 和 2.txt 的内容,保存为 3.txt 文件 如果不指定 3.txt ,则保存到 1.txt copy test.txt + 复制文件到自己,实际上是修改了文件日期 12 title 设置cmd窗口的标题 title 新标题 #可以看到cmd窗口的标题栏变了 13 ver 显示系统版本 14 label 和 vol 设置卷标 vol #显示卷标 label #显示卷标,同时提示输入新卷标 label c:system #设置C盘的卷标为 system 15 pause 暂停命令 运行该命令时,将显示下面的消息: 请按任意键继续 . . . 一般用于看清楚屏幕上显示的内容 16 rem 和 :: 注释命令 注释行不执行操作 17 date 和 time 日期和时间 date #显示当前日期,并提示输入新日期,按 "回车" 略过输入 date/t #只显示当前日期,不提示输入新日期 time #显示当前时间,并提示输入新时间,按 "回车" 略过输入 time/t #只显示当前时间,不提示输入新时间 18 goto 和 : 跳转命令 :label #行首为:表示该行是标签行,标签行不执行操作 goto label #跳转到指定的标签那一行 19 find (外部命令) 查找命令 find "abc" c:/test.txt 在 c:/test.txt 文件里查找含 abc 字符串的行 如果找不到,将设 errorlevel 返回码为1 find /i "abc" c:/test.txt 查找含 abc 的行,忽略大小写 find /c "abc" c:/test.txt 显示含 abc 的行的行数 20 more (外部命令) 逐屏显示 more c:/test.txt #逐屏显示 c:/test.txt 的文件内容 21 tree 显示目录结构 tree d:/ #显示D盘的文件目录结构 22 & 顺序执行多条命令,而不管命令是否执行成功 c: & cd/ & dir /w 相当于把下面3行命令写到1行去了 c: cd/ dir /w 23 && 顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令 f: && cd/ && dir >c:/test.txt 注意如果f盘不存在,那么后面2条命令将不会执行 find "ok" c:/test.txt && echo 成功 如果找到了 "ok" 字样,就显示 "成功" ,找不到就不显示 24 || 顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令 f: || e: 如果有f盘就不进入e盘 find "ok" c:/test.txt || echo 不成功 如果找不到 "ok" 字样,就显示 "不成功" ,找到了就不显示 25 | 管道命令 前一个命令的执行结果输出到后一个命令 dir *.* /s/a | find /c ".exe" 管道命令表示先执行 dir 命令,对其输出的结果执行后面的 find 命令 该命令行结果:输出当前文件夹及所有子文件夹里的.exe文件的个数 type c:/test.txt|more 这个和 more c:/test.txt 的效果是一样的 26 > 和 >> 输出重定向命令 > 清除文件中原有的内容后再写入 >> 追加内容到文件末尾,而不会清除原有的内容 主要将本来显示在屏幕上的内容输出到指定文件中 指定文件如果不存在,则自动生成该文件 echo hello world>c:/test.txt 生成c:/test.txt文件,内容为hello world 这个格式在批处理文件里用得很多,可以生成 .reg .bat .vbs 等临时文件 type c:/test.txt >prn 屏幕上不显示文件内容,转向输出到打印机 echo hello world>con 在屏幕上显示hello world,实际上所有输出都是默认 >con 的 copy c:/test.txt f: >nul 拷贝文件,并且不显示 "文件复制成功" 的提示信息,但如果f盘不存在,还是会显示出错信息 copy c:/test.txt f: >nul 2>nul 不显示 "文件复制成功" 的提示信息,并且f盘不存在的话,也不显示错误提示信息 echo ^^W ^> ^W>c:/test.txt 生成的文件内容为 ^W > W ^ 和 > 是控制命令,要把它们输出到文件,必须在前面加个 ^ 符号 27 < 从文件中获得输入信息,而不是从屏幕上 一般用于 date time label 等需要等待输入的命令 @echo off echo 2005-05-01>temp.txt date <temp.txt del= "" temp.txt= "" 这样就可以不等待输入直接修改当前日期= "" 28= "" %0= "" %1= "" %2= "" %3= "" %4= "" %5= "" %6= "" %7= "" %8= "" %9= "" %*= "" 命令行传递给批处理的参数= "" 批处理文件本身= "" 第一个参数= "" 第九个参数= "" 从第一个参数开始的所有参数= "" 在c盘根目录新建test.bat,内容如下:= "" @echo= "" off= "" echo= "" 运行cmd,输入= "" c:= "" test.bat= "" "=" " a" = "" b= "" c= "" d= "" 可以看出每个参数的含意= "" 修改test.bat内容如下= "" %~1= "" %~f0= "" %~d0= "" %~p0= "" %~n0= "" %~x0= "" %~s0= "" %~a0= "" %~t0= "" %~z0= "" 再运行cmd,输入= "" 可以参照= "" call= "" ?= "" 或= "" for = "" 看出每个参数的含意= "" 注意这里可以对文件进行日期比较和大小比较= "" load= "" "%%1" = "" "%%2" = "" >c:/test.txt 生成的文件内容为 load "%1" "%2" 批处理文件里,用这个格式把命令行参数输出到文件 29 if 判断命令 if "%1" == "/a" echo 第一个参数是/a if /i "%1" equ "/a" echo 第一个参数是/a /i 表示不区分大小写,equ 和 == 是一样的,其它运算符参见 if /? if exist c:/test.bat echo 存在c:/test.bat文件 if not exist c:/windows ( echo 不存在c:/windows文件夹 rem 有多条命令可用小括号括起来,称为 "复合语句" rem 行前的空格是为了看起来条理清楚 ) if exist c:/test.bat ( echo 存在c:/test.bat ) else ( echo 不存在c:/test.bat rem else 表示 "否则" ,判断结果为假时执行其后的命令 ) 30 应用程序用start调用出错的,也可以call调用 34 choice (外部命令) 选择命令 让用户输入一个字符,从而选择运行不同的命令,返回码errorlevel为1234…… win98里是choice.com win2000pro里没有,可以从win98里拷过来 win2003里是choice.exe choice /N /C y /T 5 /D y>nul 延时5秒 下面是个 choice 语句的例子 @echo off rem 以下在win2000pro运行通过,从win98里拷的chioce.com文件 choice /c:abc aaa,bbb,ccc if errorlevel 3 goto ccc if %errorlevel%==2 goto bbb if errorlevel==1 goto aaa rem 必须先判断数值高的返回码 rem 可以看到 errorlevel 值的判断有3种写法,有时某种写法不好用,可以用另外的写法 rem 直接运行chioce相当于运行choice /c:yn :aaa echo aaa goto end :bbb echo bbb goto end :ccc echo ccc goto end :end 35 assoc 和 ftype 文件关联 assoc 设置 '文件扩展名' 关联,关联到 '文件类型' ftype 设置 '文件类型' 关联,关联到 '执行程序和参数' 当你双击一个.txt文件时,windows并不是根据.txt直接判断用 notepad.exe 打开 而是先判断.txt属于 txtfile '文件类型' 再调用 txtfile 关联的命令行 txtfile=%SystemRoot%/system32/NOTEPAD.EXE %1 可以在 "文件夹选项" → "文件类型" 里修改这2种关联 assoc #显示所有 '文件扩展名' 关联 assoc .txt #显示.txt代表的 '文件类型' ,结果显示 .txt=txtfile assoc .doc #显示.doc代表的 '文件类型' ,结果显示 .doc=Word.Document.8 assoc .exe #显示.exe代表的 '文件类型' ,结果显示 .exe=exefile ftype #显示所有 '文件类型' 关联 ftype exefile #显示exefile类型关联的命令行,结果显示 exefile= "%1" %* assoc .txt=Word.Document.8 设置.txt为word类型的文档,可以看到.txt文件的图标都变了 assoc .txt=txtfile 恢复.txt的正确关联 ftype exefile= "%1" %* 恢复 exefile 的正确关联 如果该关联已经被破坏,可以运行 command.com ,再输入这条命令 36 pushd 和 popd 切换当前目录 @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 一般用处不大,在当前目录名不确定时,会有点帮助 37 for 循环命令 这个比较复杂,请对照 for /? 来看 for %%i in (c: d: e: f:) do echo %%i 依次调用小括号里的每个字符串,执行 do 后面的命令 注意%%i,在批处理中 for 语句调用参数用2个% 默认的字符串分隔符是 "空格键" , "Tab键" , "回车键" for %%i in (*.txt) do find "abc" %%i 对当前目录里所有的txt文件执行 find 命令 for /r . %%i in (*.txt) do find "abc" %%i 在当前目录和子目录里所有的.txt文件中搜索包含 abc 字符串的行 for /r . %%i in (.) do echo %%~pni 显示当前目录名和所有子目录名,包括路径,不包括盘符 for /r d:/mp3 %%i in (*.mp3) do echo %%i>>d:/mp3.txt 把 d:/mp3 及其子目录里的mp3文件的文件名都存到 d:/mp3.txt 里去 for /l %%i in (2,1,8) do echo %%i 生成2345678的一串数字,2是数字序列的开头,8是结尾,1表示每次加1 for /f %%i in ( 'set' ) do echo %%i 对 set 命令的输出结果循环调用,每行一个 for /f "eol=P" %%i in ( 'set' ) do echo %%i 取 set 命令的输出结果,忽略以 P 开头的那几行 for /f %%i in (d:/mp3.txt) do echo %%i 显示 d:/mp3.txt 里的每个文件名,每行一个,不支持带空格的名称 for /f "delims=" %%i in (d:/mp3.txt) do echo %%i 显示 d:/mp3.txt 里的每个文件名,每行一个,支持带空格的名称 for /f "skip=5 tokens=4" %%a in ( 'dir' ) do echo %%a 对 dir 命令的结果,跳过前面5行,余下的每行取第4列 每列之间的分隔符为默认的 "空格" 可以注意到 dir 命令输出的前5行是没有文件名的 for /f "tokens=1,2,3 delims=- " %%a in ( 'date /t' ) do ( echo %%a echo %%b echo %%c ) 对 date /t 的输出结果,每行取1、2、3列 第一列对应指定的 %%a ,后面的 %%b 和 %%c 是派生出来的,对应其它列 分隔符指定为 - 和 "空格" ,注意 delims=- 后面有个 "空格" 其中 tokens=1,2,3 若用 tokens=1-3 替换,效果是一样的 for /f "tokens=2* delims=- " %%a in ( 'date /t' ) do echo %%b 取第2列给 %%a ,其后的列都给 %%b 32 subst (外部命令) 映射磁盘。 subst z: //server/d #这样输入z:就可以访问//server/d了 subst z: /d #取消该映射 subst #显示目前所有的映时 38 xcopy (外部命令) 文件拷贝 xcopy d:/mp3 e:/mp3 /s/e/i/y 复制 d:/mp3 文件夹、所有子文件夹和文件到 e:/ ,覆盖已有文件 加 /i 表示如果 e:/ 没有 mp3 文件夹就自动新建一个,否则会有询问 39 一些不常用的内部命令 >& 将一个句柄的输出写入到另一个句柄的输入中 <& 从一个句柄读取输入并将其写入到另一个句柄输出中 shift 命令行传递给批处理的参数不止9个时,用以切换参数 color 设置cmd窗口的显示颜色 pormpt 更改命令提示符号,默认都是 盘符:/路径/> ,如 c:/> 40 format (外部命令) 格式化硬盘 format c: /q/u/autotest /q表示快速格式化,/autotest表示自动格式化,不需要按 Y 确认 /u表示每字节用 F6 覆盖硬盘数据,使其不可用软件恢复 format c: /c 格式化C盘,并检测坏道 41 fdisk (外部命令) 硬盘分区 win2000不带该命令 win98里的fdisk不支持80G以上大硬盘,winme里的支持 fdisk/mbr 重建硬盘分区表,一般用于清除引导区病毒、还原精灵 注意使用该命令不能从硬盘启动,必须软驱或光驱启动后直接运行 42 ping (外部命令) ping -l 65500 -t 192.168.1.200 不停的向192.168.1.200计算机发送大小为65500byte的数据包 ping -n 10 127.0.0.1>nul ping自己10次,可用于批处理延时10秒 43 SC (外部命令) 服务控制命令 sc create aaa displayname= bbb start= auto binpath= "C:/WINDOWS/System32/alg.exe" 创建服务,服务名称aaa,显示名称bbb,启动类型:自动 可执行文件的路径 "C:/WINDOWS/System32/alg.exe" sc descrīption aaa "ccc" 更改aaa的描述为ccc sc config aaa start= disabled binpath= "C:/WINDOWS/System32/svchost.exe -k netsvcs" 更改aaa的启动类型:已禁用 更改aaa的可执行文件的路径 "C:/WINDOWS/System32/svchost.exe -k netsvcs" sc config aaa start= demand displayname= ddd 更改aaa的启动类型:手动 更改aaa的显示名称ddd sc start aaa 启动aaa服务 sc stop aaa 停止aaa服务 sc delete aaa 删除aaa服务 </temp.txt> |
转:http://www.cnblogs.com/wzhanke/p/4320591.html