1. echo 表示显示此命令后的字符 

echo脚本 bat脚本echo_命令行

echo脚本 bat脚本echo_字符串_02

ECHO 和 @
@字符放在命令前将关闭该命令回显,无论此时 echo 是否为打开状态。
echo 命令的作用列举如下:
( 1)打开回显或关闭回显功能
格式:echo [{ on|off }]
如果想关闭“ECHO OFF”命令行自身的显示,则需要在该命令行前加上“@”。
( 2)显示当前 ECHO 设置状态
格式:echo
( 3)输出提示信息
格式: ECHO 信息内容
上述是 ECHO 命令常见的三种用法,也是大家熟悉和会用的,但作为 DOS 命令淘金者你还应该知道下
面的技巧:
( 4)关闭 DOS 命令提示符
在 DOS 提示符状态下键入 ECHO OFF,能够关闭 DOS 提示符的显示使屏幕只留下光标,直至键入
ECHO ON,提示符才会重新出现。
( 5)输出空行,即相当于输入一个回车
格式: ECHO.
值得注意的是命令行中的“. ”要紧跟在 ECHO 后面中间不能有空格,否则“. ”将被当作提示信息输出到
屏幕。另外“. ”可以用,:; ”/ [\]+等任一符号替代。
命令 ECHO.输出的回车,经 DOS 管道转向可以作为其它命令的输入,比如 echo.|time 即相当于在 TIME
命令执行后给出一个回车。所以执行时系统会在显示当前时间后,自动返回到 DOS 提示符状态( 6)答复命令中的提问
格式: ECHO 答复语|命令文件名
上述格式可以用于简化一些需要人机对话的命令(如: CHKDSK/ F; FORMAT Drive:; del *.*)的操作,
它是通过 DOS 管道命令把 ECHO 命令输出的预置答复语作为人机对话命令的输入。下面的例子就相当于
在调用的命令出现人机对话时输入“Y”回车:
C:>ECHO Y|CHKDSK/F
C:>ECHO Y|DEL A :*.*
( 7)建立新文件或增加文件内容
格式: ECHO 文件内容>文件名
ECHO 文件内容>>文件名
例如:
C:>ECHO @ECHO OFF>AUTOEXEC.BAT 建立自动批处理文件
C:>ECHO C:\CPAV\BOOTSAFE>>AUTOEXEC.BAT 向自动批处理文件中追加内容
C:>TYPE AUTOEXEC.BAT 显示该自动批处理文件
@ECHO OFF
C:\CPAV\BOOTSAFE
( 8)向打印机输出打印内容或打印控制码
格式: ECHO 打印机控制码>PRN
ECHO 打印内容>PRN
下面的例子是向 M-1724 打印机输入打印控制码。<Alt>156 是按住 Alt 键在小键盘键入 156,类似情况
依此类推:
C:>ECHO +156+42+116>PRN(输入下划线命令 FS* t)
C:>ECHO +155@>PRN(输入初始化命令ESC@)
C:>ECHO.>PRN(换行)
( 9)使喇叭鸣响
C:>ECHO ^G“^G”是在 dos 窗口中用 Ctrl+G 或 Alt+007 输入,输入多个^G 可以产生多声鸣响。使用方法是直接将其
加入批处理文件中或做成批处理文件调用

echo 和 @详细用法

echo off 表示在此语句后所有运行的命令都不显示命令行本身 
@与echo off相象,但它是加在每个命令行的最前面,表示运行时不显示这一行的命令行(只能影响当前行)。 

2. call 调用另一个批处理文件,不终止父批处理程序。(如果不用call而直接调用别的批处理文件,执行完那个批处理文件后将无法返回当前文件并执行当前文件的后续命令)。 

rem 语法: call [[Drive:][Path] FileName [BatchParameters]] [:label [arguments]]
call "%cd%\test2.bat" haha kkk aaa (调用指定目录下的 test2.bat,且输入3个参数给他)

call test2.bat arg1 arg2 (调用同目录下的 test2.bat,且输入2个参数给他)

echo脚本 bat脚本echo_命令行

echo脚本 bat脚本echo_字符串_02

start 命令
批处理中调用外部程序的命令(该外部程序在新窗口中运行,批处理程序继续往下执行,不理会外部程序
的运行状况),如果直接运行外部程序则必须等外部程序完成后才继续执行剩下的指令
例: start explorer d:\
调用图形界面打开 D 盘

常用参数:

MIN 开始时窗口最小化

SEPARATE 在分开的空间内开始 16 位 Windows 程序

HIGH 在 HIGH 优先级类别开始应用程序

REALTIME 在 REALTIME 优先级类别开始应用程序

WAIT 启动应用程序并等候它结束

parameters 这些为传送到命令/程序的参数

Sample:start /MIN test2.bat arg1 arg2 (调用同目录下的 test2.bat,且输入2个参数给他,且本窗口最小化)

start 命令

3. pause 暂停批处理的执行并在屏幕上显示Press any key to continue...的提示,等待用户按任意键后继续。

要显示其他提示语,可以这样用:
Echo 其他提示语 & pause > nul

4. rem 表示此命令后的字符为解释行(注释),不执行。::也有同样的功能。 

echo脚本 bat脚本echo_命令行

echo脚本 bat脚本echo_字符串_02

REM 和 ::
REM 为注释命令,一般用来给程序加上注解,该命令后的内容不被执行,但能回显。其次, :: 也可以起到 rem 的注释作用, 而且更简洁有效; 但有两点需要注意:
第一, 任何以冒号:开头的字符行, 在批处理中都被视作标号, 而直接忽略其后的所有内容。
有效标号:冒号后紧跟一个以字母数字开头的字符串, goto 语句可以识别。
无效标号:冒号后紧跟一个非字母数字的一个特殊符号, goto 无法识别的标号,可以起到注释作用,所以 ::
常被用作注释符号,其实 :+ 也可起注释作用。
第二, 与 rem 不同的是, ::后的字符行在执行时不会回显, 无论是否用 echo on 打开命令行回显状态, 因为
命令解释器不认为他是一个有效的命令行, 就此点来看, rem 在某些场合下将比 :: 更为适用; 另外, rem
可以用于 config.sys 文件中。
行内注释格式: %注释内容% (不常用,慎用)

rem和::

 

5. errorlevel 程序返回码  echo %errorlevel%

echo脚本 bat脚本echo_命令行

echo脚本 bat脚本echo_字符串_02

每个命令运行结束,可以用这个命令行格式查看返回码
用于判断刚才的命令是否执行成功
默认值为 0,一般命令执行出错会设 errorlevel 为 1

errorlevel

 

6. title  设置 cmd 窗口的标题。title 新标题 #可以看到 cmd 窗口的标题栏变了

 

7. 命令行中使用参数,需要用到一个参数表示符"%"。 

%[1-9]表示参数,参数是指在运行批处理文件时在文件名后加的以空格(或者Tab)分隔的字符串。变量可以从%0到%9,%0表示批处理命令本身,其它参数字符串用%1到%9顺序表示。

@echo off 
echo %1

 

8. goto 批处理文件运行到这里将跳到goto所指定的标号。

@echo off
:start
set /a var+=1
echo %var%
if %var% leq 3 GOTO start
pause

 

9. if 是条件语句,用来判断是否符合规定的条件,从而决定执行不同的命令。有五种格式。

1、if [not] "参数" == "字符串" 待执行的命令 
 
参数如果等于(not表示不等,下同)指定的字符串,则条件成立,运行命令,否则运行下一句。 
 
例:if "%1"=="a" format a: 
 
2、if [not] exist [路径\]文件名 待执行的命令 
如果有指定的文件,则条件成立,运行命令,否则运行下一句。 
 
如: if exist c:\config.sys type c:\config.sys 
表示如果存在c:\config.sys文件,则显示它的内容。 
 
3、if errorlevel <数字> 待执行的命令 
 
很多DOS程序在运行结束后会返回一个数字值用来表示程序运行的结果(或者状态),通过if errorlevel命令可以判断程序的返回值,根据不同的返回值来决定执行不同的命令。如果返回值等于指定的数字,则条件成立,运行命令,否则运行下一句。 
必须放在某一个命令的后面 ,Number 的数字取值范围 0~255,判断时值的排列顺序应该由大到小。
如if errorlevel 2 goto x2 

4.判断变量是否已经定义,if defined 变量 command 语句;

5.判断两个数值是否相等,if 数值1 equ 数值2 command 语句;

echo脚本 bat脚本echo_命令行

echo脚本 bat脚本echo_字符串_02

例:
@echo off
dir c:
rem 退出代码为>=1 就跳至标题 1 处执行, >=0 就跳至标题 0 处执行
IF ERRORLEVEL 1 goto 1
IF ERRORLEVEL 0 goto 0
Rem 上面的两行不可交换位置,否则失败了也显示成功。
:0
echo 命令执行成功!
Rem 程序执行完毕跳至标题 exit 处退出
goto exit
:1
echo 命令执行失败!
Rem 程序执行完毕跳至标题 exit 处退出
goto exit:exit
pause
运行显示:命令执行成功!
(2) IF [NOT] string1==string2 command
string1 和 string2 都为字符的数据,英文内字符的大小写将看作不同,这个条件中的等于号必须是两个(绝
对相等的意思)
条件相等后即执行后面的 command
检测当前变量的值做出判断,为了防止字符串中含有空格,可用以下格式
if [NOT] {string1}=={string2} command
if [NOT] [string1]==[string2] command
if [NOT] "string1"=="string2" command
这种写法实际上将括号或引号当成字符串的一部分了,只要等号左右两边一致就行了,比如下面的写法就
不行:
if {string1}==[string2] command
(3) IF [NOT] EXIST filename command
EXIST filename 为文件或目录存在的意思
echo off
IF EXIST autoexec.bat echo 文件存在!
IF not EXIST autoexec.bat echo 文件不存在!
这个批处理大家可以放在 C 盘和 D 盘分别执行,看看效果

if 例子

 

 10. choice 使用此命令可以让用户输入一个字符(用于选择),从而根据用户的选择返回不同的errorlevel,然后于if errorlevel配合,根据用户的选择运行不同的命令。

CHOICE返回的状态可以用errorlevel来接收,echo %errorlevel%

echo脚本 bat脚本echo_命令行

echo脚本 bat脚本echo_字符串_02

注意:choice命令为DOS或者Windows系统提供的外部命令,不同版本的choice命令语法会稍有不同,请用choice /?查看用法。 
 
choice的命令语法(该语法为Windows 2003中choice命令的语法,其它版本的choice的命令语法与此大同小异): 
 
CHOICE [/C choices] [/N] [/CS] [/T timeout /D choice] [/M text] 
 
描述: 
  该工具允许用户从选择列表选择一个项目并返回所选项目的索引。 
 
参数列表: 
 /C  choices    指定要创建的选项列表。默认列表是 "YN"。 
 
 /N         在提示符中隐藏选项列表。提示前面的消息得到显示,选项依旧处于启用状态。 
 
 /CS        允许选择分大小写的选项。在默认情况下,这个工具是不分大小写的。 
 
 /T  timeout    做出默认选择之前,暂停的秒数。可接受的值是从 0 到 9999。如果指定了 0,就不会有暂停,默认选项 
           会得到选择。 
 
 /D  choice    在 nnnn 秒之后指定默认选项。字符必须在用 /C 选项指定的一组选择中; 同时,必须用 /T 指定 nnnn。 
 
 /M  text     指定提示之前要显示的消息。如果没有指定,工具只显示提示。 
 
 /?         显示帮助消息。 
 
 注意: 
 ERRORLEVEL 环境变量被设置为从选择集选择的键索引。列出的第一个选择返回 1,第二个选择返回 2,等等。如果用户按的键不是有效的选择,该工具会发出警告响声。如果该工具检测到错误状态,它会返回 255 的ERRORLEVEL 值。如果用户按 Ctrl+Break 或 Ctrl+C 键,该工具会返回 0 的 ERRORLEVEL 值。在一个批程序中使用 ERRORLEVEL 参数时,将参数降序排列。 
 
示例: 
 CHOICE /? 
 CHOICE /C YNC /M "确认请按 Y,否请按 N,或者取消请按 C。" 
 CHOICE /T 10 /C ync /CS /D y 
 CHOICE /C ab /M "选项 1 请选择 a,选项 2 请选择 b。" 
 CHOICE /C ab /N /M "选项 1 请选择 a,选项 2 请选择 b。" 
  
如果我运行命令:CHOICE /C YNC /M "确认请按 Y,否请按 N,或者取消请按 C。" 
屏幕上会显示: 
确认请按 Y,否请按 N,或者取消请按 C。 [Y,N,C]? 
  
  
例:test.bat的内容如下(注意,用if errorlevel判断返回值时,要按返回值从高到低排列): 
@echo off 
choice /C dme /M "defrag,mem,end"
if errorlevel 3 goto end 
if errorlevel 2 goto mem 
if errotlevel 1 goto defrag 
  
:defrag 
c:\dos\defrag 
goto end 
  
:mem 
mem 
goto end 
  
:end 
echo good bye
此批处理运行后,将显示"defrag,mem,end[D,M,E]?" ,用户可选择d m e ,然后if语句根据用户的选择作出判断,d表示执行标号为defrag的程序段,m表示执行标号为mem的程序段,e表示执行标号为end的程序段,每个程序段最后都以goto end将程序跳到end标号处,然后程序将显示good bye,批处理运行结束。

CHOICE详细用法

 

11.for循环

a. 语法:FOR %%variable IN (command1) DO command [command-parameters]

1、for、in和do是for语句的关键字,它们三个缺一不可;
 2、%%I是for语句中对形式变量的引用,就算它在do后的语句中没有参与语句的执行,也是必须出现的;
 3、in之后,do之前的括号不能省略;
 4、command1和command2表示字符串、变量或命令语句;
1、for语句的形式变量I,可以换成26个字母中的任意一个,这些字母会区分大小写,也就是说,%%I和%%i会被
认为不是同一个变量;形式变量I还可以换成其他的字符,但是,为了不与批处理中的%0~%9这10个形式变量发生冲
突,请不要随意把%%I替换为%%0 ~%%9中的任意一个;
  2、in和do之间的command1表示的字符串或变量可以是一个,也可以是多个,每一个字符串或变量,我们称之为
一个元素,每个元素之间,用空格键、跳格键、逗号、分号或等号分隔;
  3、for语句依次提取command1中的每一个元素,把它的值赋予形式变量I,带到do后的command2中参与命令的执行
;并且每次只提取一个元素,然后执行一次do后的命令语句,而无论这个元素是否被带到command2中参与了command2
的运行;当执行完一次do后的语句之后,再提取command1中的下一个元素,再执行一次command2,如此循环,直到
command1中的所有元素都已经被提取完毕,该for语句才宣告执行结束;

echo脚本 bat脚本echo_命令行

echo脚本 bat脚本echo_字符串_02

[code1]

@echo off
for %%I in (bbs.bathome.cn) do echo %%I
pause

[code2]

@echo off
for %%I in (bbs,bathome,cn) do echo %%I
pause

  和[code1]的执行结果相比,[code2]的执行结果发生了如下变化:
  1、显示结果分成了3行(不算最后一行中文提示);
  2、每一行都从逗号处被切分;

[code3]

@echo off
set str=c d e f g h i j k l m n o p q r s t u v w x y z
echo 当前硬盘的分区有:
for %%i in (%str%) do if exist %%i: echo %%i:
pause

  这段代码能检测硬盘都有哪些分区

#通配符
想知道当前目录下都有哪些文件吗?请用下面的代码:

@echo off
for %%i in (*.*) do echo "%%i"
pause

  想列出当前目录下所有的文本文件吗?请用下面的代码:

@echo off
for %%i in (*.txt) do echo "%%i"
pause

  想列出只用两个字符作为文件名的文本文件吗?请用下面的代码:

@echo off
for %%i in (??.txt) do echo "%%i"
pause

code

 

参数:FOR 有 4 个参数 /d /l /r /f
参数 /d

FOR /D %%variable IN (set) DO command [command-parameters]
如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配。
这个参数主要用于目录搜索,不会搜索文件,看这样的例子
@echo off
for /d %%i in (c:\*) do echo %%i
pause
运行会把 C 盘根目录下的全部目录名字打印出来,而文件名字一个也不显示!

在来一个,比如我们要把当前路径下文件夹的名字只有 1-3 个字母的打出来
@echo off
for /d %%i in (???) do echo %%i
pause
这样的话如果你当前目录下有目录名字只有 1-3 个字母的,就会显示出来,没有就不显示了
这里解释下*号和?号的作用,*号表示任意 N 个字符,而?号只表示任意一个字符

@echo off
for /d %%i in (window?) do echo %%i
pause
保存到 C 盘下执行,会显示什么呢?自己看吧! 显示: windows
/D 参数只能显示当前目录下的目录名字,这个大家要注意!

参数 /R

FOR /R [[drive:]path] %%variable IN (set) DO command 
检查以 [drive:]path 为根的目录树,指向每个目录中的FOR 语句。如果在 /R 后没有指定目录,则使用当前目录。如果集仅为一个单点(.)字符,则枚举该目录树递归.
上面我们知道,/D 只能显示当前路径下的目录名字.
/R可以把当前或者你指定路径下的文件名字全部读取,注意是文件名字

请注意 2 点:
1、 set 中的文件名如果含有通配符(?或*),则列举/R 参数指定的目录及其下面的所用子目录中与 set相符合的所有文件,无相符文件的目录则不列举。
2、相反,如果 set 中为具体文件名,不含通配符,则枚举该目录树(即列举该目录及其下面的所有子目录),而不管 set 中的指定文件是否存在。这与前面所说的单点( .)枚举目录树是一个道理,单点代表当前目录,也可视为一个文件。
例:
@echo off
for /r c:\ %%i in (*.exe) do echo %%i
pause
C 盘根目录,和每个目录的子目录下面全部的 EXE 文件都列出来了!!!!
例:
@echo off
for /r %%i in (*.exe) do @echo %%i
pause
以当前目录为搜索路径, D:\test 目录和他下面的子目录的全部 EXE 文件列出来!!!
例:
@echo off
for /r c:\ %%i in (boot.ini) do echo %%i
pause
运行本例发现枚举了 c 盘所有目录,为了只列举 boot.ini 存在的目录,可改成下面这样:
@echo off
for /r c:\ %%i in (boot.ini) do if exist %%i echo %%i
pause
用这条命令搜索文件真不错。。。。。

参数 /L

FOR /L %%variable IN (start,step,end) DO command [command-parameters]
该集表示以增量形式从开始到结束的一个数字序列。
因此, (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 个数字
(1,1,5)这个参数也就是表示从 1 开始每次加 1 直到 5 终止!

@echo off
for /l %%i in (1,1,5) do start cmd
pause
执行后是不是吓了一跳,怎么多了 5 个 CMD 窗口

参数 /f  提取文本信息

@echo off
for /f %%i in (test.txt) do echo %%i
pause 

rem 换行符,一行一显示

a. 切分字符串的利器:delims=

@echo off
for /f "delims=," %%i in (test.txt) do echo %%i
pause  
每行第一个逗号之后的所有内容都不见了(如果有不存在逗号的行,则保留原样),也就说,
你成功地提取到了每行第一个逗号之前的所有内容!
如果没有指定"delims=符号列表"这个开关,那么,for /f 语句默认以空格键或跳格键作为分隔
符号。请把[txt1]中不同位置上的标点符号改为空格或跳格,再运行[code4]试试。

"delims=符号列表",可以一次性指定多个分隔符号!
@echo off
for /f "delims=.," %%i in (test.txt) do echo %%i
pause

 b. 定点提取:tokens=

tokens= 后面一般跟的是数字,如 tokens=2,也可以跟多个,但是每个数字之间用逗号分隔,如 tokens=3,5,8
,它们的含义分别是:提取第2节字符串、提取第3、第5和第8节字符串。注意,这里所说的“节”,是由 delims=
这一开关划分的,它的内容并不是一成不变的。

 

 

 

 

12. find  在文件中搜索字符串

FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]
/V 显示所有未包含指定字符串的行。
/C 仅显示包含字符串的行数。
/N 显示行号。
/I 搜索字符串时忽略大小写。
/OFF[LINE] 不要跳过具有脱机属性集的文件。
"string" 指定要搜索的文字串,
[drive:][path]filename
指定要搜索的文件

echo脚本 bat脚本echo_命令行

echo脚本 bat脚本echo_字符串_02

Find 常和 type 命令结合使用
Type [drive:][path]filename | find "string" [>tmpfile] #挑选包含 string 的行
Type [drive:][path]filename | find /v "string" #剔除文件中包含 string 的行
Type [drive:][path]filename | find /c #显示文件行数
以上用法将去除 find 命令自带的提示语(文件名提示)
例:
@echo off
echo 111 >test.txt
echo 222 >>test.txt
find "111" test.txt
del test.txt
pause
运行显示如下:
---------- TEST.TXT
111
请按任意键继续. . .
例:
@echo off
echo 111 >test.txt
echo 222 >>test.txt
type test.txt|find "111"
del test.txt
pause
运行显示如下:
111
请按任意键继续. .

示例等

echo脚本 bat脚本echo_命令行

echo脚本 bat脚本echo_字符串_02

基本格式:find "要查找的字符串" 要查找的文件(不在当前目录则需要给出完整路径)

例1
find "abc" d:\abc.txt
在abc.txt中查找字符串abc的行。
------------------------------------------------------------------------------------------------------

/I 搜索字符串时忽略大小写。

例2
find /i "abc" d:\abc.txt
参数/i代表的是“Ignore”(忽略),也就是忽略大小写。通过/I 参数可以不区分要查找的字符串“abc”的大小写。
------------------------------------------------------------------------------------------------------

/N 显示行号。

例3
find /n "abc" d:\abc.txt
参数/n代表英语单词“Number”(号码).。通过/n参数我们可以查找到字符串"abc"所在的行号。
------------------------------------------------------------------------------------------------------

/C 仅显示包含字符串的行数。

例4
find /c "abc" d:\abc.txt
参数/c是英语单词“Count”(计数)的缩写。通过/c参数我们可以统计包含"abc"字符串的行数。
------------------------------------------------------------------------------------------------------

/V  显示所有未包含指定字符串的行。

例5
find /v "abc" d:\abc.txt
这个参数用于找出文件中不包含指定字符串的行。在这里表示查找不包含"abc"字符串的行。

注意:find命令中要查找的字符串一字要用双引号" "括起来。
------------------------------------------------------------------------------------------------------

示例2

echo脚本 bat脚本echo_命令行

echo脚本 bat脚本echo_字符串_02

字符串查找增强:findstr

在文件中寻找字符串。
FINDSTR [/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/F:file]
        [/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]]
        strings [[drive:][path]filename[ ...]]

  /B        在一行的开始配对模式。
  /E        在一行的结尾配对模式。
  /L        按字使用搜索字符串。
  /R        将搜索字符串作为一般表达式使用。
  /S        在当前目录和所有子目录中搜索
              匹配文件。
  /I         指定搜索不分大小写。
  /X        打印完全匹配的行。
  /V        只打印不包含匹配的行。
  /N        在匹配的每行前打印行数。
  /M        如果文件含有匹配项,只打印其文件名。
  /O        在每个匹配行前打印字符偏移量。
  /P        忽略有不可打印字符的文件。
  /OFF[LINE] 不跳过带有脱机属性集的文件。
  /A:attr   指定有十六进位数字的颜色属性。请见 "color /?"
  /F:file   从指定文件读文件列表 (/ 代表控制台)。
  /C:string 使用指定字符串作为文字搜索字符串。
  /G:file   从指定的文件获得搜索字符串。 (/ 代表控制台)。
  /D:dir    查找以分号为分隔符的目录列表
  strings   要查找的文字。
  [drive:][path]filename  指定要查找的文件。

除非参数有 /C 前缀,请使用空格隔开搜索字符串。
例如: 'FINDSTR "hello there" x.y' 在文件 x.y 中寻找 "hello" 或
"there" 。  'FINDSTR /C:"hello there" x.y' 在文件 x.y 寻找 "hello there"。
------------------------------------------------------------------------------------------------------

1.基本格式:findstr " strings " [drive:][path]filename

Strings  是要查找的内容。
[rive:][path]filename  指定要查找的文件,路径可缺省,缺省情况下为当前目录。

例1
findstr "icq" 123.txt
在123.txt中查找包含有“icq”这三个字符串的行。
------------------------------------------------------------------------------------------------------

/I  指定搜索不分大小写。

例2
findstr /i "MSN" 123.txt
在123.txt中查找包含有“MSN”这三个字符的行,且不区分大小写。
------------------------------------------------------------------------------------------------------

★/R 将搜索字符串作为正则表达式使用。参数/R 强调以正则表达式规则来解读字符串。R - Right 右即为正。我们
都说右手是正手,因此引申为右为正,左为反。

例3
findstr /r "icq msn" 123.txt
在123.txt中查找包含有 “icq”或“msn”的行,查找的多个字符串间用空格隔格开。
------------------------------------------------------------------------------------------------------

 /S 在当前目录和所有子目录中搜索。

例4
findstr /s /i "MSN" *.txt
在当前目录和所有子目录中的txt文件中搜索字符串"MSN"(不区分字母大小写)。
------------------------------------------------------------------------------------------------------

/C:string 使用指定字符串作为文字搜索字符串。

例5
findstr /c:"icq msn" 123.txt
在123.txt中查找包含有 “icq msn”这几个字符的行。注意,这里“icq msn”是一整体的。
此参数多用于查找含有空格的字符串。
------------------------------------------------------------------------------------------------------

★在使用 findstr "我 你 他" test.txt 的时候,并不能查找到内容,但是,加上开关 /i 或者 /r 之后就正确无误
了,可能是在查找多个纯中文字符串的时候的一个bug吧;单个的纯中文字符串没有任何问题。
------------------------------------------------------------------------------------------------------


2.findstr 命令中正则表达式的用法规则

一般表达式的快速参考:
  .        通配符: 任何字符
  *        重复: 以前字符或类别出现零或零以上次数
  ^        行位置: 行的开始
  $        行位置: 行的终点
  [class]  字符类别: 任何在字符集中的字符
  [^class] 补字符类别: 任何不在字符集中的字符
  [x-y]    范围: 在指定范围内的任何字符
  \x       Escape: 元字符 x 的文字用法
  \<xyz    字位置: 字的开始
  xyz\>    字位置: 字的结束
------------------------------------------------------------------------------------------------------

● 通配符和重复符规则,即 . 和 *
通配符,即一个句点,代表任何一个字符,而且只能是一个,包括字母、数字、半角符号还有空格。
重复符,即型号* 代表前面字母的出现次数(出现次数从0到多次,0表示没有)。

findstr . 123.txt 或 findstr "." 123.txt
在文件123.txt中查找任意字符,不包括空行。

例6
findstr .* 2.txt 或 findstr ".*" 2.txt
在文件123.txt中查找任意字符,包括空行。

例7
findstr ac* 123.txt
在文件123.txt中查找出现一个“a”字符串,以及a后面出现过0次或者任意次c的字符行。
如:
a
ac
acc
addc
等都匹配。

例8
findstr ak5* 123.txt
在文件123.txt中查找出现一个“ak”字符串,以及ak后面出现过0次或者任意次5的字符行。如:
ak
ak5
akbbb
ak125
ak555
等都匹配。
------------------------------------------------------------------------------------------------------

●行首、行尾符规则,即 ^ 和 $

例9
findstr "^step" 123.txt
在文件123.txt中查找行首为step字符串的行。
如:
stepkdka
step 456
这两行都匹配的。

例10
findstr "step$" 123.txt
在文件123.txt中查找行尾为step字符串的行。
如:
123 dstep
123step
这两行也匹配的。

例11
findstr "^step$" 123.txt
在文件123.txt中查找行首为step,且行尾也为step的行,即step独自一行。
------------------------------------------------------------------------------------------------------

● 字符集规则,即[class]
①表示含有集里的任意一个字符的即匹配。
②该字符集里的元素可以是字母和数字和一般的半角字符,如:}{ ,.][等,但双引号"不被识别。不能是汉字, 汉字
不被正确解释(汉字不是ASCII码)。
如果在字符集内插入通配符和重复符号,即"[.*]"将会把. 和 *视为普通字符,没有通配和重复的含义。

例12
findstr "[0-9]" 123.txt
在文件123.txt中查找数字0-9的任意之一的行。
如:
4kkb
1 lkka cc
这两行都匹配。

例13
findstr "[a-zA-Z]" 123.txt
在文件123.txt中查找包括任意字母行。

例14
findstr "[abcezy]" 2.txt
在文件123.txt中查找包括a b c e z y其中任意一字母的行。

例15
findstr "[a-fl-z]" 2.txt
在文件123.txt中查找小写字符a到f 或l到z的任意一字母的行,但不包含g h I j k这几个字母。

例16
findstr "M[abc][123]Y" 2.txt
在文件123.txt中查找可以匹配 Ma1Y , Mb1Y, Mc1Y; Ma2Y , Mb2Y, Mc2Y; Ma3Y , Mb3Y, Mc3Y的行。
------------------------------------------------------------------------------------------------------

● 减法规则,即[^class]

例17
findstr "[^0-9]" 123.txt
如果是纯数字的行便过滤掉,例如2323423423 这样的字符串被过滤,345hh888这样的形式则过滤不了。
注意,纯数字的行不能有空格,不论行首行尾或者是行中都不能有空格,否则过滤失败!

例18
findstr "[^a-z]" 123.txt
如果是纯字母的行便过滤掉,例如 sdlfjlkjlksjdklfjlskdf 这样的字符将被过滤,如果是sdfksjdkf99999这样的形
式则过滤不了。
注意,纯字母的行不能有空格,不论行首行尾或者是行中都不能有空格,否则过滤失败!

例19
findstr "[^add]" 123.txt
过滤仅含有由a d d三个字母组成的纯字母字符串的行。
如:
a
ad
ddaadd
dd
这些行都会被过滤。
注意,仅含有由a d d三个字母组成的纯字母字符串的行不能有空格,不论行首行尾或者是行中都不能有空格,否则
过滤失败!

例20
findstr "[^echo]" 123.txt
过滤仅含有由e  c  h  o 四个字母组成的纯字母字符串的行。
如:
e
c
ec
cho
chooo
这些行都会被过滤。
------------------------------------------------------------------------------------------------------

●单词前缀后缀定位规则,即\<xyz和xyz\>

该xyz可以是英文单词或数字,但不适用于汉字。符号 \ 理解为转义符,化解小于号和大于号的重定向命令含义。
该规则是匹配类似单个英文单词的。

例21
findstr "\<echo" 123.txt
所有含有以echo为前缀的字符串的行,都匹配。
如:
echo:kkk a add
jjkk echo
这两行都匹配。
(思考:为什么:echo也匹配?)

例22
findstr "echo\>" 123.txt
所有含有以echo为后缀的字符串的行,都匹配。
如:
qq bbecho 这一行也匹配。
(思考:为什么kkkk echo:也匹配?)

例23
findstr "\<end\>123.txt
这里是用来精确查找单词。查找单词end的行,
注意:
ended
cdkend
bcd-end-jjkk
这类词都不匹配。
(思考:为什么end echo和end也匹配?因为\<xyz\>格式要查找的是单个英文单词。)
------------------------------------------------------------------------------------------------------

● 转义符 \
把表达式中的特殊字符(元字符)转化为普通字符。常见写法:
\.
\*
\\
\[
\]??
\-

例24
findstr "\.abc" 123.txt
在文件123.txt中查找可以匹配“.abc”字符串的行,这里\。是把。给转义了。

例25
findstr "1\\" 123.txt 或findstr "1\\\\" 123.txt
在文件123.txt中查找可以匹配“1\”字符串的行,这里\\是把\给转义了。

★要查找的字符串含有\时,可以用\\把\给转义;或者把\变成\\\\。如果目标字符串的\后面还有内容,则搜索字符
串\除了要变成\\(本身的转义要求),还可以在它后面再加一个字符,如\\.
------------------------------------------------------------------------------------------------------

findstr和通配符

 

13. C:\AUTOEXEC.BAT 是每次系统启动时都会自动运行的,可以将每次启动时都要运行的命令放入该文件中。

 

14. 常用系统变量

%CD%  获取当前目录
%PATH%  获取命令搜索路径
%DATE%  获取当前日期。
%TIME%  获取当前时间。
%RANDOM% 获取 0 和 32767 之间的任意十进制数字。

echo脚本 bat脚本echo_命令行

echo脚本 bat脚本echo_字符串_02

%SystemRoot% === C:\WINDOWS (%windir% 同样)

%ProgramFiles% === C:\Program Files

%USERPROFILE% === C:\Documents and Settings\Administrator (子目录有“桌面”,“开始菜单”,“收藏夹”等)

%APPDATA% === C:\Documents and Settings\Administrator\Application Data

%TEMP% === C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp (%TEM% 同样)

%APPDATA% === C:\Documents and Settings\Administrator\Application Data

%OS% === Windows_NT (系统)

%Path% === %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem (原本的设置)

%HOMEDRIVE% === C: (系统盘)

%HOMEPATH% === \Documents and Settings\Administrator

:: 枚举当前的环境变量

setlocal enabledelayedexpansion

FOR /F "usebackq delims==" %%i IN (`set`) DO @echo %%i !%%i!

系统参数

 

15. 变量读取。使用%variable%可以获取变量值,举例如下

D:\>echo %RANDOM%
157

 

16.  变量设置。使用set命令显示、设置或删除 windows环境变量。set命令用法可以在cmd下执行"set /?" 或"help set"查看。

SET [variable=[string]] #variable表示变量名,string表示变量值。

  举例如下:

D:\>set VAR1="I Love BAT Script"
D:\>echo %VAR1%
"I Love BAT Script"

echo脚本 bat脚本echo_命令行

echo脚本 bat脚本echo_字符串_02

学习set命令详解

学习要点:
1.用set 命令设置自定义变量
2.用set 命令进行字符串处理
3.用set 命令进行简单计算
-----------------------------------------------------------------------------------------------------


一、用set 命令设置自定义变量
格式:set [variable=[string]]
variable 指定环境变量名。 string 指定要指派给变量variable的一系列字符串。
-----------------------------------------------------------------------------------------------------

例1,
@echo off
set var=abcd
echo %var%
pause

在例1中,set var=abcd 是批处理设置变量的方法。Var是变量名,而abcd则是变量名var的值。echo %var% ,在批
处理中我们要引用这个变量就把var 变量名用两个%(百分号)扩起来,如%var%

注意:以下用法将清除变量variable 的值,使其变成未定义状态。

set variable=
上面等号后面无任何符号,如果写成SET variable="",此时变量值并不为空,而是等于两个引号,即"" 

例2,
@echo off
set var=
set var1=""
if defined var (echo var的值为%var%) else echo var没有赋值
if defined var1 (echo var1的值为%var1%) else echo var1没有赋值
pause

set还可以提供一个交互界面,让用户自己输入变量的值,然后我们在来根据这个值来做相应操作,现在我就来说说set
的这种语法,只需要加一个"/P"参数就可以了!

例3,
@echo off
set /p var=请输入变量的值:
echo  您输入了%var%
pause

执行上面的批处理时,系统会提示你:“请输入变量的值:”还是自己动手尝试一下吧,呵呵!
-----------------------------------------------------------------------------------------------------

 


二、用set 命令进行字符串处理

1、字符串替换
格式:%PATH:str1=str2%
意思就是:将字符串变量%PATH%中的str1 替换为str2
-----------------------------------------------------------------------------------------------------

例4,
@echo off
set a= bbs. bathome. cn
echo  替换前的值: "%a%"
set var=%a: =%
echo  替换后的值: "%var%"
pause

执行后显示:
替换前的值: " bbs. bathome. cn"
替换后的值: "bbs.bathome.cn"

对比一下,我们发现它把变量%a%的空格给替换掉了, 而%PATH:str1=str2%这个操作就是把变量%PATH%的里的str1 全
部用str2 替换。

例5,
@echo off
set a= bbs.bathome.cn
echo  替换前的值: "%a%"
set var=%a:.=小情%
echo  替换后的值: "%var%"
pause

执行后显示:
替换前的值: " bbs.bathome.cn"
替换后的值: " bbs小情bathome小情cn"

这里是把变量%a%里面的"."全部替换为"小情",大家多多动手练习就会了,这个没有什么难的,呵呵~~
-----------------------------------------------------------------------------------------------------


2、字符串截取
格式:%a:~[m[,n]]%
方括号表示可选,%为变量标识符,a为变量名,不可少,冒号用于分隔变量名和说明部分,符号~可以简单理解为“
偏移”即可,m 为偏移量(缺省为0),n 为截取长度(缺省为全部)
-----------------------------------------------------------------------------------------------------

例6,
@echo off
set a=bbs.bathome.cn
set var=%a:~1,3%
echo %var%
pause

执行显示为:bs.
我们来分析一下set var=%a:~1,3% ,这里%a:~1,3%就是说变量 a  偏移量为1,要截取它的3位字符长度。合起来就是
把变量a 的值从第2 位(偏移量 1)开始,截取3 个字符赋予变量var

例7,
@echo off
set a=bbs.bathome.cn
set var=%a:~1,-3%
echo %var%
pause

执行显示:bs.bathome
这里就是把变量a 第2位起到倒数第3位前的值赋予var

例8,
@echo off
set a=bbs.bathome.cn
set var=%a:~-3%
echo %var%
pause

执行显示:.cn
这里就是就是把变量a 倒数 3 位的值赋予变量var

例9,
@echo off
set a=bbs.bathome.cn
set var=%a:~-3,2%
echo %var%
pause

执行显示:.c

这里就是就是把变量a 倒数 3 位的值的前2位赋予变量var

例10,
@echo off
set a=bbs.bathome.cn
set var=%a:~3%
echo %var%
pause

执行显示:.bathome.cn
这里就是把变量a 从第3 位开始后面全部的值给变量var

上面这几个例子要好好的记住哦,而且不要记错了!


我们还是总结一下吧:
a=bbs.bathome.cn

%a:~1,3%    -------- “bs.”        变量a 偏离1位,截取3位字符。

%a:~1,-3%   -------- “bs.bathome” 变量a 偏离1位,截取倒数第3位前的字符。

%a:~-3%    -------- “.cn”        变量a 偏离-3位,截取倒数的3位字符。

%a:~-3,2%   -------- “.c”        变量a 偏离-3位,截取倒数后3位的前两2位字符

%a:~3%     -------- “.bathome.cn”变量a 偏离3位,截取完后面的字符。

%a:~,3%     -------- “bbs”      变量a 偏离0位,截取3位字符。
-----------------------------------------------------------------------------------------------------

我们来道综合题:输入任意字符串,求字符串的长度

例11,
@echo off
set /p str=请输入任意长度的字符串:
echo  你输入了字符串:"%str%"
call :stringlenth "%str%" num
echo  字符串长度为:%num%
pause
:stringLenth
::字符串长度计算子程序
set thestring=%~1
::参数%1 为字符串"%str%",%~1则去掉"%str%"的双引号。
if not defined theString goto :eof
set Return=0
:stringLenth_continue
set /a Return =1
set thestring=%thestring:~0,-1%
::偏移量为1,截取倒数第1位前的所有字符。
if defined thestring goto stringLenth_continue
if not "%2"=="" set %2=%Return%
::参数%2为返回变量num的名称,不能含空格或特殊字符。
goto :eof
-----------------------------------------------------------------------------------------------------


最后,提供一下batmat写的一个例子帮助大家对截取字符的理解吧:

例子:
@echo off&color a&mode con cols=90 lines=12
title 截取字符练习工具 by bat-zw19750516
set var=1234567890一二三四五六七八九零
cls&echo.&echo  原始图案为:%var%
echo.&echo  注意前面有10个阿拉伯数字后面有10个语文数字,等下截取后记得看下。
echo.&echo  命令形式为:%%var:~m,n%%,其中的m为第一个参数可负可正可为零,n为第二个参数可负可正不为零。
echo.&echo  为了方便重复练习没有设置退出,要退出请直接关闭窗口。
echo.&echo  请按任意键开始练习。&pause>nul

:begin
set a=&set b=&set "c="
cls&echo.&set /p a= 请输入第一个参数(应为小于20的整数):
echo %a:-=%|findstr "[^0-9]"&&goto wrong
if "%a%" equ "" goto wrong
if %a% geq 20 goto wrong
cls&echo.&set /p b= 请输入第二个参数(应为大于-20并不为零的整数):
echo %b:-=%|findstr "[^0-9]"&&goto wrong
if "%b%" equ "" goto wrong
if %b% equ 0 goto wrong
if %b% lss -20 goto wrong
set /a c=20-a b
if %a% lss 0 if %b% lss 0 if %a% geq %b% goto wrong
if %a% gtr 0 if %b% lss 0 if %c% leq 0 goto wrong
cls&echo.&echo  原始图案为: %var%
echo.&echo  你输入的截取命令是: %%var:~%a%,%b%%%
echo.&call,echo  截取到的图案是 :%%var:~%a%,%b%%%
echo.&echo  请按任意键再次练习。&pause>nul&goto begin

:wrong
cls&echo.&echo  输入不合要求,请正确输入。&ping /n 2 127.1 >nul&goto begin
-----------------------------------------------------------------------------------------------------

 


三、用set 命令进行简单计算
格式:set /a expression
/a 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式评估器很简单并以递减的优先权顺序支持下
列操作:

  ( )             分组
  !  ~  -        一元运算符
  *  /  %       算数运算符
    -           算数运算符
  <<   >>       二进制逻辑移位
  &             二进制按位“与”
  ^              二进制按位“异”
  |              二进制按位“或”
  =   *=   /=   %=  =  -=           算数赋值
  &=   ^=   |=   <<=    >>=          二进制运算赋值
  ,                                   表达式分隔符

set 的/a 参数就是让set 可以支持数学符号进行加减等一些数学运算, 注意:一般的运算常为十进制运算.
-----------------------------------------------------------------------------------------------------

例12,
@echo off
set /p input=请输入计算表达式:
set /a var=%input%
echo  计算结果:%input%=%var%
pause

注意:DOS 计算只能进行整数运算,精确到整数,它是不支持浮点计算的!

请输入计算表达式:1 9 20 30-10
计算结果:1 9 20 30-10=50
请按任意键继续. . .

请输入计算表达式:10/3        #除法只能精确到整数
计算结果:10/3=3
请按任意键继续. . .

请输入计算表达式:-100 62       #负数
计算结果:-100 62=-38
请按任意键继续. . .

请输入计算表达式:100%3         #求余数
计算结果:100%3=1
请按任意键继续. . .

注意:以上的求余数运算符%在批处理程序中必须写成%%

请输入计算表达式:(25 75)*2/(15 5)     #括号
计算结果:(25 75)*2/(15 5)=10
请按任意键继续. . .

请输入计算表达式:1234567890*9876543210       #范围
无效数字。数字精确度限为  32  位。
计算结果:1234567890*9876543210=
请按任意键继续. . .

注意:上面的计算过程显示,DOS 计算只能精确到32 位,这个 32 位是指二进制32 位,其中最高位为符号位(0 为
正,1 为负),低位31 位为数值。31 个 1 换成十进制为2147483647,所以DOS 计算的有效值范围是-2147483648
至2147483647,超出该数值范围时计算出错.请看下面的计算过程:

请输入计算表达式:2147483647-1       #最大值减 1,值有效
计算结果:2147483647-1=2147483646
请按任意键继续. . .

请输入计算表达式:2147483647 1        #最大值加 1,出错,结果为最小值
计算结果:2147483647 1=-2147483648
请按任意键继续. . .

请输入计算表达式:-2147483648-1      #最小值减 1,出错,结果为最大值
计算结果:-2147483648-1=2147483647
请按任意键继续. . .

我们来看一看下面的这个例子

例13,
@echo off
set /a a=1 1,b=2 1,c=3 1
echo  计算结果:%a% %b% %c%
pause

执行显示:计算结果:2 3 4

发现其他数学运算也有效果!,这就是表达式分隔符"逗"号的作用!
有时候我们需要直接在原变量进行加减操作就可以用这种语法,
set /a var =1对应原始语法就是set /a var = %var% 1
set /a var*=2对应原始语法就是set /a var = %var%*2

另外还有一些用逻辑或取余操作符,这些符号,按照上面的使用方法会报错。比如我们在CMD 里输入set /a var=1 & 1
 "与运算",它并不会显示为 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

注意:凡是按位计算均需换算成二进制,然后再计算。

思考题:求2 的n 次方

参考答案:
例14,
@echo off
set /p n=请输入2 的几次方:
set /a num=1^<^<n
echo %num%
pause

set命令详解

 

17. 字符串基本操作

(1)字符串截取。使用命令 echo %var:~n,k%,其中"%var",表示待截取字符的字符串,"~"取字符标志符,"n”表示字符截取起始位置,"k" 表示截取结束位置(不包含该字符)。举例如下

@echo off 
set str=superhero
echo str=%str% 
echo str:~0,5=%str:~0,5%
echo str:~3=%str:~3%
echo str:~-3=%str:~-3% 
echo str:~0,-3=%str:~0,-3% 
pause

输出结果如下:

str=superhero
str:~0,5=super
str:~3=erhero
str:~-3=ero
str:~0,-3=superh
请按任意键继续. . .

(2)字符串替换。使用命令%var:old_str=new_str% ,举例如下

@echo off 
set str=hello world!
set temp=%str:hello=good% 
echo %temp% 
pause

输出结果如下:

good world!
请按任意键继续. . .

(3)字符串合并

由于没有直接的字符串合并函数,只能用笨方法了。

set str1=%str1%%str2% (合并 str1 和 str2)

(4)计算字符串长度

echo脚本 bat脚本echo_命令行

echo脚本 bat脚本echo_字符串_02

没有现成的函数。如下程序利用 goto形成循环,不断将字符串截短1,并记录截短的次数,到字符串变成空时的次数即长度。

set testStr=This is a test string

:: 将 testStr 复制到str,str 是个临时字符串

set str=%testStr%

:: 标签,用于goto跳转

:next1

:: 判断str是不是空,如果不是则执行下边的语句

if not "%str%"=="" (

:: 算术运算,使num的值自增1,相当于num++或者++num语句

set /a num+=1

:: 截取字符串,每次截短1

set "str=%str:~1%"

:: 跳转到next1标签: 这里利用goto和标签,构成循环结构

goto next1

)

:: 当以上循环结构执行完毕时,会执行下边的语句

echo testStr=%testStr%

echo testStr的长度为:%num%

字符串长度

(5)截取字符串时,需要传递参数

直接 echo %args:~%num%,-5% 没办法想要的字符串,需要如下两步

setlocal enabledelayedexpansion

echo !args:~%num%,-5!

 

pushd 保存当前目录,切换当前目录
popd 切换到前次的当前目录

@echo off
Echo 产生一个临时文件 > tmp.txt
Rem 下行先保存当前目录,再将 c:\windows 设为当前目录
pushd c:\windows
Call :sub tmp.txt
Rem 下行恢复前次的当前目录
Popd
Call :sub tmp.txt
pause
Del tmp.txt
exit
:sub
Echo 删除引号: %~1
Echo 扩充到路径: %~f1
Echo 扩充到一个驱动器号: %~d1
Echo 扩充到一个路径: %~p1
Echo 扩充到一个文件名: %~n1
Echo 扩充到一个文件扩展名: %~x1
Echo 扩充的路径指含有短名: %~s1
Echo 扩充到文件属性: %~a1
Echo 扩充到文件的日期/时间: %~t1
Echo 扩充到文件的大小: %~z1
Echo 扩展到驱动器号和路径: %~dp1
Echo 扩展到文件名和扩展名: %~nx1
Echo 扩展到类似 DIR 的输出行: %~ftza1
Echo.
Goto :eof

 

19. setlocal 与 变量延迟 按顺序写代码,看看,不推荐。(交换两个变量的值,但是不使用临时变量)

echo脚本 bat脚本echo_命令行

echo脚本 bat脚本echo_字符串_02

setlocal 与 变量延迟
为了更好的说明问题,我们先引入一个例子。
例 1:
@echo off
set a=4
set a=5 & echo %a%
pause
结果: 4
解说:为什么是 4 而不是 5 呢?在 echo 之前明明已经把变量 a 的值改成 5 了?
让我们先了解一下批处理运行命令的机制:
批处理读取命令时是按行读取的(另外例如 for 命令等,其后用一对圆括号闭合的所有语句也当作一行),
在处理之前要完成必要的预处理工作,这其中就包括对该行命令中的变量赋值。我们现在分析一下例 1,批处理在运行到这句“set a=5 & echo %a%”之前,先把这一句整句读取并做了预处理——对变量 a 赋了
值,那么%a%当然就是 4 了!(没有为什么,批处理就是这样做的。)
而为了能够感知环境变量的动态变化,批处理设计了变量延迟。简单来说,在读取了一条完整的语句之后,
不立即对该行的变量赋值,而会在某个单条语句执行之前再进行赋值,也就是说“延迟”了对变量的赋值。
那么如何开启变量延迟呢?变量延迟又需要注意什么呢?举个例子说明一下:
例 2:
@echo off
setlocal enabledelayedexpansion
set a=4
set a=5 & echo !a!
pause
结果: 5
解说:启动了变量延迟,得到了正确答案。变量延迟的启动语句是“setlocal enabledelayedexpansion”,并
且变量要用一对叹号“!!”括起来(注意要用英文的叹号),否则就没有变量延迟的效果。
分析一下例 2,首先“setlocal enabledelayedexpansion”开启变量延迟,然后“set a=4”先给变量 a 赋值为
4, “set a=5 & echo !a!”这句是给变量 a 赋值为 5 并输出(由于启动了变量延迟,所以批处理能够感知到动
态变化,即不是先给该行变量赋值,而是在运行过程中给变量赋值,因此此时 a 的值就是 5 了)。
再举一个例子巩固一下。
例 3:
@echo off
setlocal enabledelayedexpansion
for /l %%i in (1,1,5) do (
set a=%%i
echo !a!
)
pause
结果:
1
2
3
4
5
解说:本例开启了变量延迟并用“!!”将变量扩起来,因此得到我们预期的结果。如果不用变量延迟会出现什
么结果呢?结果是这样的:
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。
ECHO 处于关闭状态。ECHO 处于关闭状态。
即没有感知到 for 语句中的动态变化。
提示:在没有开启变量延迟的情况下,某条命令行中的变量改变,必须到下一条命令才能体现。这一点也
可以加以利用,看例子。
例:交换两个变量的值,且不用中间变量
@echo off
::目的:交换两个变量的值,但是不使用临时变量
::Code by JM 2007-1-24 CMD@XP
::出处: http://www.cn-dos.net/forum/viewthread.php?tid=27078
set var1=abc
set var2=123
echo 交换前: var1=%var1% var2=%var2%
set var1=%var2%& set var2=%var1%
echo 交换后: var1=%var1% var2=%var2%
pause

setlocal 与 变量延迟

 

20. ATTRIB 显示或更改文件属性

echo脚本 bat脚本echo_命令行

echo脚本 bat脚本echo_字符串_02

设置文件属性:attrib

显示或更改文件属性。
ATTRIB [ R | -R] [ A | -A ] [ S | -S] [ H | -H] [[drive:] [path] filename] [/S [/D]]

     设置属性。
  -    清除属性。
  R   只读文件属性。
  A   存档文件属性。
  S   系统文件属性。
  H   隐藏文件属性。
  [drive:][path][filename]   指定要处理的文件属性。
  /S  处理当前文件夹及其子文件夹中的匹配文件。
  /D  也处理文件夹。
------------------------------------------------------------------------------------------------------

1。查看文件的文件属性
格式:ATTRIB [drive:][path][filename]

例1,
attrib d:\ pagefile.sys
查看d:\ pagefile.sys文件的属性。
------------------------------------------------------------------------------------------------------


2。修改文件的属性。
格式:attrib ?属性

例1,
attrib –h d:\ pagefile.sys
消除d:\ pagefile.sys的“隐藏”属性。

例2,
attrib +s h d:\ pagefile.sys
给d:\ pagefile.sys设置“系统”和“隐藏”属性。
------------------------------------------------------------------------------------------------------


3。批量文件处理

例1,
attrib h d:\123\*.bat /s
通过/s参数可批量将d:\123及其子目录下的所有bat文件设置为“隐藏”属性.

例2,
attrib h d:\123 /s /d
将d:\123及其下所有同名为123的子目录设置为“隐藏”属性.参数/d必须在批量设置文件属性的同时,对指定目录及
其下所有子目录进行文件属性操作。参数/d可以理解为“directory”(目录),也就是说/d 必需和/s一起使用。
------------------------------------------------------------------------------------------------------

思考:

 “attrib h d:\123 /s /d”和“attrib h d:\123\*.* /s /d”有什么区别呢?
前者只有d:\123以及它同名的子目录设为了“隐藏”,而其它文件及子目录都没有设置“隐藏”。
后者则将d:\123下的所有文件及子目录设置了“隐藏”属性,但d:\123目录没有设置“隐藏”属性。
------------------------------------------------------------------------------------------------------

attrib

 

21.比较运算符:

EQU - 等于 (一般使用“==”)

NEQ - 不等于 (没有 “!=”,改用“ if not 1==1 ”的写法)

LSS - 小于

LEQ - 小于或等于

GTR - 大于

GEQ - 大于或等于

 

22. 其他命令

echo脚本 bat脚本echo_命令行

echo脚本 bat脚本echo_字符串_02

1. ping 命令
测试网络联接状况以及信息包发送和接收状况。但是不能够测试端口。

语法:ping IP地址或主机名 [-t] [-a] [-n count] [-l size]

参数含义:

-t 不停地向目标主机发送数据;

-a 以IP地址格式来显示目标主机的网络地址;

-n count 指定要Ping多少次,具体次数由count来指定;

-l size 指定发送到目标主机的数据包的大小。

Sample: ping 192.168.0.1 -t (不停的测试192.168.0.1,按ctrl+c停止)

Sample: for /L %%a in (0,1,255) do ping 192.168.0.%%a -n 1 >> tmp.txt (ping一下所有的局域网电脑)

2. telnet 命令
测试端口使用 telnet IP地址或主机名 端口,使用tcp协议的

Sample: telnet 192.168.0.1 80 (测试192.168.0.1的80端口)

3.color 命令
设置背景及字体颜色

语法: color bf

b 是指定背景色的十六进制数字; f 指定前景颜色(即字体颜色)。

颜色值: 0:黑色 1:蓝色 2:绿色 3:湖蓝 4:红色 5:紫色 6:** 7:白色

8:灰色 9:淡蓝 A:淡绿 B:浅绿 C:淡红 D:淡紫 E:淡黄 F:亮白

如果没有给定任何参数,该命令会将颜色还原到 CMD.EXE 启动时的颜色。

如果两参数一样,视为无效输入。只有一个参数时,设置字体。

4. random 命令
产生随机数(正整数0~)

5. exit 命令
结束程序。即时是被调用的程序,结束后也不会返回原程序

6. shutdown命令
shutdown -s 关机

ping,telnet,color ,random,exit,shutdown

 ping  ipconfig  arp  start  shutdown  taskkill 命令

 

 23. 注册表操作

echo脚本 bat脚本echo_命令行

echo脚本 bat脚本echo_字符串_02

1) 备份注册表,将[HKEY_LOCAL_MACHINE ... Run]的内容,备份到“c:\windows\1.reg”

reg export HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run c:\windows\1.reg

reg export HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run c:\windows\2.reg

2) 修改/添加注册表内容

a.一般的添加或修改

reg add "HKCU\Environment" /v Java_Home /t reg_sz /d "D:\Java\jdk1.6.0_07" /f

上句解析:“HKCU”是“HKEY_CURRENT_USER”的缩写,不用缩写用全称也可以;

添加名称为“Java_Home”的变量;类型为“reg_sz”,另一种常见类型是“reg_dword”;值为 D:\Java\jdk1.6.0_07;

b.使用变量

set SoftWareHome=HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java

reg add "%SoftWareHome%Web Start\1.6.0_07" /v Home /t reg_sz /d "%cd%\jre1.6.0_07\bin" /f

c.如果注册表的名称有空格,或者数据用特殊符号时

reg add "%SoftWareHome2%\HelpCommands" /v "01:Online Documentation" /t reg_sz /d "\"%cd%\Documentation\Index.htm\"" /f

传入值为(值用双引号括起来的):"D:\ProgramFiles\1.work_soft\Sybase\PowerDesigner_12\Documentation\Index.htm"

reg add "%SoftWareHome2%\Paths" /v ReportTemplates /t reg_sz /d "%cd%\Resource Files\Report Templates\\" /f

传入值为(“\”结尾的): E:\Holemar\1.notes\90. Windows\Resource Files\Report Templates\

d.增加空的内容

reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Shared Tools\MSConfig\startupreg\IMJPMIG8.1"

e.添加或修改默认值

reg add "%vpath%InstallPath" /ve /t reg_sz /d "%cd%" /f

这里用“/ve”来代替一般修改时的“/v 变量名”,即可修改默认值了

3) 删除注册表的内容

双引号里面的是注册表的目录,下面两句将删除这目录下的所有信息

reg delete "HKEY_CURRENT_USER\Software\RealVNC" /f

reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\RealVNC" /f

双引号里面的是注册表的目录,下面一句将删除这目录下指定的某个信息

reg delete "HKEY_LOCAL_MACHINE\Software\RealVNC" /v VNC_Server /f

4) 注册表的常用位置

a.系统启动项:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run]

example: REG ADD HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run /v VNC_Server /t REG_SZ /d "%cd%\VNC_Server.bat" /f

b.系统环境变量:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment]

c.当前用户的环境变量:

[HKEY_CURRENT_USER\Environment]

5) 修改注册表之后,结束并重新加载explorer.exe进程,可刷新注册表,令其生效

taskkill /f /im explorer.exe >nul

start "" "explorer.exe"

注册表操作

 

24. 文件处理

a.删除

1) 删除一个文件或多个文件

del /s /q /f d:\test\a.bat

将直接删除d:\test\a.bat,没有任务提示

del temp\* /q /f /s

将直接删除 本目录的 temp 目录的所有文件,没有任务提示

删除文件的时候可以使用“*”作通配符

2) 删除一个空目录

rd /q /s d:\test\log

将直接删除d:\test\log目录,如果log目录里面有文件将无法删除

3) 删除一个非空目录 (必须指定目录名称)

rmdir /q /s d:\test\logs

必须指定目录名称,不能使用通配符

/S 除目录本身外,还将删除指定目录下的所有子目录

/Q 安静模式,带 /S 删除目录树时不要求确认

无论里面是否有文件或文件夹将全部直接删除

b.创建目录

MKDIR [drive:]path

MD [drive:]path

路径有空格时,可以用双引号括起来,也可以用 &nbsp; 替代

echo脚本 bat脚本echo_命令行

删除命令:del

echo脚本 bat脚本echo_命令行

echo脚本 bat脚本echo_字符串_02

md  rd  ren  move 命令

学习要点:
1.创建文件夹:md
2.删除文件夹:rd
3.重命名文件(夹):ren
4.移动文件(夹):move
------------------------------------------------------------------------------------------------------


一.创建文件夹:md

md命令用于创建文件夹,下面例子中的路径是可以缺省的,如果缺省则在当前目录下创建新文件夹;如果创建的新文
件夹及其路径带有空格或特殊符号的,要用双引号括起来。
------------------------------------------------------------------------------------------------------

1.创建单个文件夹
格式:MD [路径\]目录

例1
md d:\abc
在D盘下建立一个名为abc的文件夹。

例2
md abc
这里为缺省路径,则在当前目录下创建一个名为abc的文件夹。

例3
md "d:\my game"
在D盘下建立一个名为my game的文件夹。
对于新建的文件夹名称中包含有空格或是特殊符号的,一定要用双引号” “把文件夹名括起来。

例4
md "C:\Documents and Settings\456^ 789"
在C:\Documents and Settings下建立一个名为456^ 789的文件夹,由于路径中有空格,所以我们用双引号" "把路径
和文件夹名一起括起来了。
------------------------------------------------------------------------------------------------------


2.同时创建多个目录
格式:md [路径\]目录1 [路径\]目录2 [路径\]目录3……

例5
md abc D:\gmae\123 abcd
在当前目录下建立abc和abcd两个文件,同时D:\gmae下也建立一个文件夹123。
------------------------------------------------------------------------------------------------------

3.创建多级目录
格式:md [路径\]目录1\目录2\目录3\…

假如我们要在D盘下建立文件夹abc,然后在abc中建新文件夹abcd,接着再在abcd中建文件夹abcde,有没有一个命令可以
一次性搞定的呢?答案肯定的!

例6
md d:\abc\abcd\abcde
就这么一个命令就搞定了,不信?你当然可以测试一下罗,呵呵~
------------------------------------------------------------------------------------------------------

思考:

  在例4中如果命令不用双引号括起来,即md C:\Documents and Settings\456^ 789  这样会发生什么情况呢?这个
就让大家动手去测试一下了,哈哈!!
------------------------------------------------------------------------------------------------------

 


二.删除文件夹:rd

删除一个目录。
RMDIR [/S] [/Q] [drive:]path
RD [/S] [/Q] [drive:]path

    /S      除目录本身外,还将删除指定目录下的所有子目录和
            文件。用于删除目录树。
    /Q      安静模式,带 /S 删除目录树时不要求确认
------------------------------------------------------------------------------------------------------

在不加任何参数时,rd命令只能删除空的文件夹。

例1.
rd d:\123
rd abc
第一个是删除D盘下的空文件夹123。第二个是删除当前目录下的空文件夹abc。
------------------------------------------------------------------------------------------------------

/S  除目录本身外,还将删除指定目录下的所有子目录和文件。用于删除目录树。

例2.
rd /s d:\123
如果文件夹123不为空,则通过/S参数,可删除文件夹123。
------------------------------------------------------------------------------------------------------

/Q  安静模式,带 /S 删除目录树时不要求确认。

例3.
rd /s /q d:\123
在使用/S参数时,系统会提示: d:\123 是否确认(Y/N)? 此时通过/Q参数可以使其不用询问而直接删除。
------------------------------------------------------------------------------------------------------

 


三.重命名文件(夹):ren

重命名文件。
RENAME [drive:][path]filename1 filename2.
REN [drive:][path]filename1 filename2.

filename1的路径可以省略,缺省情况下为当前目录。filename2只能是文件名,不能使用任何路径。
------------------------------------------------------------------------------------------------------

1.单个文件的重命名

例1
ren d:\123.txt 456.bat
把123.txt 重命名为456并把后缀名修改为bat。

例2
ren 123.txt 456.bat
缺省路径情况下,把当前目录下的123.txt重命名为456.bat。
------------------------------------------------------------------------------------------------------

2.批量重命名

通过*和?这两个通配符来批量重命名。*表示任意多个字符,?表示一个字符。

例3
ren *.bat *.txt
把后缀名为bat的文件批量更改为txt后缀后的文件。
------------------------------------------------------------------------------------------------------

★对于通配符?比较复杂,在此就不说了,请大家多找一下相关的资料吧!
★当文件具有隐藏属性或系统属性的时候,ren不能直接重命名,需要把文件的隐藏或系统属性去掉方可更名,这一
点大家要注意!
------------------------------------------------------------------------------------------------------

 


四.移动文件(夹):move

移动文件并重命名文件和目录。

要移动至少一个文件:
MOVE [/Y | /-Y] [drive:][path]filename1[,...] destination

要重命名一个目录:
MOVE [/Y | /-Y] [drive:][path]dirname1 dirname2

  [drive:][path]filename1 指定您想移动的文件位置和名称。
  destination             指定文件的新位置。目标可包含一个驱动器号
                          和冒号、一个目录名或组合。如果只移动一个文件
                          并在移动时将其重命名,您还可以包括文件名。
  [drive:][path]dirname1  指定要重命名的目录。
  dirname2                指定目录的新名称。

  /Y                      取消确认改写一个现有目标文件的提示。
  /-Y                     对确认改写一个现有目标文件发出提示。
------------------------------------------------------------------------------------------------------

1.移动文件(夹)
基本格式:MOVE [/Y | /-Y] [drive:][path]filename1[,...] destination

[drive:][path]filename1[,...]
想要移动的文件(夹)可以使用相对路径,也可以使用绝对路径,缺省路径情况下默认为当前目录。

Destination 只能是目录路径, 可以使用相对路径,也可以使用绝对路径,缺省路径情况下默认为当前目录。

例1
move d:\abc d:\abcd
如果把文件夹abc移到文件夹abcd内。

例2
move 123.txt abc
把当前目录下的123.txt移动到当前文件夹abc内。这里都使用了相对路径,缺省路径情况下默认为当前目录。

例3
move 123.txt e:\abc
把当前目录下的123.txt移动到e:\abc目录下。
------------------------------------------------------------------------------------------------------

2.重命名文件(夹)

例4
move d:\abc d:\abcd
这里要注意一下,如果目标文件夹abcd不存在,则把abc移到d:\下,并把自身名称更改为abcd。
利用这一特性,move命令具备重命名功能。

例5
move d:\123.txt d:\abc\456.txt
如果 456.txt存在,系统将会提示你:改写 D:\456.txt 吗? (Yes/No/All):
当你输入Y后则123.txt会覆盖456.txt。如果456.txt不存在,则把123.txt移到d:\abc目录下,并重命名为456.txt。

例6
move /y 123.txt 456.txt
如果123.txt和456.txt都存在,通过/y参数后,系统不会提示你,而直接把123.txt覆盖456.txt。

例7
move 123.txt e:\abc\456.txt
对于跨区移动,如果456.txt存在会提示:文件存在。命令不会执行;如果456.txt不存在,则把123.txt移到e:\abc
目录下,并重命名为456.txt。
------------------------------------------------------------------------------------------------------

★MOVE命令可以跨分区移动文件,却不可以跨分区移动文件夹。
★对于跨分区移动文件时,如果目标位置存在和将要移动的文件同名时,系统会提示:“文件存在” 最后,命令将
不会执行。
★对于隐藏或系统属性的文件,只有把它们的属性去除后,move命令才会执行。


我们还是来总结一下:

对于move A B这样的模式

1、如果A、B同为文件夹名,
   ①如果B存在,则把A移动到B目录下。(如例1);
   ②如果B不存在,则把A移动到B所在的目录下,同时重命名为B。(如例4)。

2、如果A为文件名,B为文件夹名,
  ① 将把A移动到B目录下。(如例2,例3);
   ② 如果B文件夹内有和A文件同名的:
      I A和B为同一分区,则提示:是否覆盖/不覆盖/全部覆盖?
      II A和B为不同分区,则提示:文件存在。不做任何操作!

3、如果A、B同为文件名,
   ①A和B为同一分区,如果B存在,则系统会提示你是否将把A重命名为B;如果B不存在就把A移动到B所在的目录下
     的同时,重命名 为B。(如例5);
   ②A和B为不同分区,如果B存在,则命令不执行;如果B不存在,则把A移动到B所在的目录下并重命名为B。(如例
     7)。
------------------------------------------------------------------------------------------------------

md rd ren move 命令

 

25. % 批处理变量引导符
引用变量用%var%,调用程序外部参数用%1 至%9 等等

echo脚本 bat脚本echo_命令行

echo脚本 bat脚本echo_字符串_02

%0 批处理文件本身,包括完整的路径和扩展名
%1 第一个参数
%9 第九个参数
%* 从第一个参数开始的所有参数
参数%0 具有特殊的功能,可以调用批处理自身,以达到批处理本身循环的目的,也可以复制文件自身等
等。
例:最简单的复制文件自身的方法
copy %0 d:\wind.bat
小技巧:添加行内注释
%注释内容%(可以用作行内注释,不能出现重定向符号和管道符号)
为什么这样呢?此时“注释内容”其实被当作变量,其值是空的,故只起注释作用,不过这种用法容易出现
语法错误,一般不用

%

echo脚本 bat脚本echo_命令行

echo脚本 bat脚本echo_字符串_02

③出现在 set /a 语句中时,表示两数相除取余数,也就是所谓的模运算,它在命令行窗口和批处理文件中的写法
略有差异:在命令行窗口中,只需要单个的%,在批处理文件中,需要连续两个百分号,写成%%。

例如:在命令行窗口中,运行 set /a num=4%2 ,则结果将显示0,因为4除以2的余数为0;
如果保存为批处理文件,则此语句将略有改变:

例3
@echo off
set /a num=4%%2
echo 4除以2的余数为 %num%
pause
-----------------------------------------------------------------------------------------------------

④转义符号:如果要显示%本身时,需要在前面用%来转义。

例4
@echo off
echo 一个百分号:%%
echo 两个百分号:%%%%
echo 三个百分号:%%%%%%
pause
-----------------------------------------------------------------------------------------------------

%另外两种用法

 

26. > 重定向符

输出重定向命令
这个字符的意思是传递并且覆盖,他所起的作用是将运行的结果传递到后面的范围(后边可以是文件,也
可以是默认的系统控制台)
在 NT 系列命令行中,重定向的作用范围由整个命令行转变为单个命令语句,受到了命令分隔符&,&&,||
和语句块的制约限制。
比如:
使用命令: echo hello >1.txt 将建立文件 1.txt,内容为”hello “(注意行尾有一空格)
使用命令: echo hello>1.txt 将建立文件 1.txt,内容为”hello“(注意行尾没有空格)

 

27. >> 重定向符

输出重定向命令
这个符号的作用和>有点类似,但他们的区别是>>是传递并在文件的末尾追加,而>是覆盖
用法同上
同样拿 1.txt 做例子使用命令:
echo hello > 1.txt
echo world >>1.txt
这时候 1.txt 内容如下:
hello
world

 

28. <、 >&、 <& 重定向符

echo脚本 bat脚本echo_命令行

echo脚本 bat脚本echo_字符串_02

<,输入重定向命令,从文件中读入命令输入,而不是从键盘中读入。
@echo off
echo 2005-05-01>temp.txt
date <temp.txt
del temp.txt
这样就可以不等待输入直接修改当前日期
>&,将一个句柄的输出写入到另一个句柄的输入中。
<&,刚好和>&相反,从一个句柄读取输入并将其写入到另一个句柄输出中。
常用句柄: 0、 1、 2,未定义句柄: 3—9
1>nul 表示禁止输出正确的信息
2>nul 表示禁止输出错误信息。
其中的 1 与 2 都是代表某个数据流输入输出的地址( NT CMD 称之为句柄, MSDOS 称之为设备)。
句柄 0:标准输入 stdin,键盘输入
句柄 1:标准输出 stdout,输出到命令提示符窗口( console,代码为 CON)
句柄 2:标准错误 stderr,输出到命令提示符窗口( console,代码为 CON)
其中的 stdin 可被<重定向, stdout 可被>、 >>重定向。
我们已经知道读取文本中的内容可以用 for 命令,但如果只需要读取第一行用 for 命令就有点麻烦。简单的
办法如下:
@echo off
set /p str=<%0
echo %str%
pause
运行显示批处理文件自身的第一行: @echo off

了解

 

29. | 命令管道符
格式:第一条命令 | 第二条命令 [| 第三条命令...]
将第一条命令的结果作为第二条命令的参数来使用

dir c:\|find "txt"
以上命令是:查找 C: \所有,并发现 TXT 字符串。

 

30. ^ 转义字符
^是对特殊符号<,>,&的前导字符,在命令中他将以上 3 个符号的特殊功能去掉,仅仅只把他们当成符号而不使用他们的特殊意义。

echo脚本 bat脚本echo_命令行

echo脚本 bat脚本echo_字符串_02

echo test ^>1.txt
结果则是: test > 1.txt
他没有追加在 1.txt 里,呵呵。只是显示了出来
另外,此转义字符还可以用作续行符号。
举个简单的例子:
@echo off
echo 英雄^
是^好^
男人
pause

^

 

31. 复制文件:copy

echo脚本 bat脚本echo_命令行

echo脚本 bat脚本echo_字符串_02

复制文件:copy

Copy只能复制文件,不能复制文件夹。

1。单个文件的复制

格式:copy source[drive:][path][filename]  [destination [drive:][path][filename]]
即copy 要复制的源文件(包括路径和文件名)  文件复制的目标路径[\文件名],当[destination [drive:][path]
[filename]]缺省时则为当前目录。

例1,
copy c:\123.txt d:\
把123.txt复制到d:\目录下。如果此操作成功,命令行窗口中会提示“已复制 1个文件”。

例2,
copy c:\123.txt d:\abc.bat
把123.txt复制到d:\目录下,并把它修改为abc.bat,这里修改了文件名和它的格式。

例3,
copy .\123
把当前目录下的123子目录中的文件全部拷到当前目录。这里好像有点难理解,呵呵,解释一下:比如当前目录是
c:\windows,它有很多子目录的,现在就把它的一个子目录123里面的文件全都拷到当前目录c:\windows,这样应该明
白了吧!~
------------------------------------------------------------------------------------------------------


2。批量复制文件

例1,
copy c:\123 d:\abc
将c:\123 目录中所有文件复制到d:\abc目录中.

例2,
copy c:\123\*.rm d:\abc /y
将c:\123 目录中所有rm格式的文件复制到d:\abc目录中,当目标目录中已经存在了和源目录中即将复制的文件相同文
件名的文件时,就会出现如“改写x:\xx吗?(Yes/No/All):”这样的提示,让你选择是覆盖、不覆盖还是全部覆盖,
通过参数/y(复制单个文件或批量复制时皆可使用),可以实现重名文件无须确认直接覆盖。
------------------------------------------------------------------------------------------------------


3。合并文件
格式:copy /b 文件1+文件2+……文件N 合并后的文件名

例1,
copy /b d:\1.mp3+d:\2.mp3 e:\3.mp3
把1.mp3和2.mp3合并成3.mp3。

例2,
copy /b d:\1.txt d:\2.mp3
把1.txt和2.mp3合并,这里没有指定合成后的文件名哦,缺省情况下,合并后的文件名是命令中的第一个文件的名。
在这里,即把2.mp3合并进了1.txt。
------------------------------------------------------------------------------------------------------

★在尾部隐藏了文本数据的图片文件,在使用其他软件进行编辑并保存后,隐藏的文本数据有可能会丢失。
★MP3文件在使用此方法连接后,能实现连续播放。
★合并图片/歌曲这样的二进制文件必须使用/b参数(b代表Binary,二进制),否则合并将会失败;另一个合并参是/a
(a代表ASCII,文本文件),只能用于纯文本的合并。两参数不能同时使用,二进制方式可以合并文本和二进制文件,
而文本方式则只能合并文本。
------------------------------------------------------------------------------------------------------

复制文件:copy

 

32. 复制文件(夹):xcopy

echo脚本 bat脚本echo_命令行

echo脚本 bat脚本echo_字符串_02

复制文件(夹):xcopy

复制文件和目录树。
XCOPY source [destination] [/A | /M] [/D[:date]] [/P] [/S [/E]] [/V] [/W]
                           [/C] [/I] [/Q] [/F] [/L] [/G] [/H] [/R] [/T] [/U]
                           [/K] [/N] [/O] [/X] [/Y] [/-Y] [/Z]
                           [/EXCLUDE:file1[ file2][ file3]...]

 Source
 必需的。指定要复制的文件的位置和名称。该参数必须包含驱动器或路径。
 Destination
 可省略。指定要复制的文件的目标。该参数可以包含驱动器盘符和冒号、目录名、文件名或者它们的组合。
如果省略 Destination,xcopy 命令将文件复制到当前目录。
------------------------------------------------------------------------------------------------------

xcopy可使用的参数太多了,这里只选几个常用的来讲一下。

/S 复制非空的目录和子目录。如果省略 /s,xcopy 将在一个目录中工作。

例1,
xcopy /s d:\123 e:\kkk\
复制d:\123目录下所有文件(夹)到e:\kkk,不包括空的子目录。(默认情况下,xcopy 不复制隐藏或系统文件)
------------------------------------------------------------------------------------------------------

/E 复制所有子目录,包括空目录。同时使用 /e、/s 和 /t 命令行选项。

例2,
xcopy /e d:\123 e:\kkk\
复制d:\123目录下所有文件(夹)到e:\kkk,包括空的子目录。(默认情况下,xcopy 不复制隐藏或系统文件)
------------------------------------------------------------------------------------------------------

/H 复制具有隐藏和系统文件属性的文件。默认情况下xcopy 不复制隐藏或系统文件。

例3,
xcopy /e /h d:\123 e:\kkk\
复制d:\123目录下所有文件(夹)到e:\kkk,包括空的子目录。加上了/h参数后,xcopy 复制隐藏或系统的文件
------------------------------------------------------------------------------------------------------

/T 只复制子目录结构(即目录树),不复制文件。要复制空目录,必须包含 /e 选项。
------------------------------------------------------------------------------------------------------

/Y 禁止提示您确认要覆盖现存的目标文件。
当目标目录中已经存在了和源目录中即将复制的文件相同文件名的时候,就会出现“改写 X:\XXX  (Yes/No/All)?”
这样的提示,让你选择是覆盖、不覆盖还是全部覆盖时,通过参数/y,可以实现重名文件无须确认直接覆盖。
------------------------------------------------------------------------------------------------------

★注意指定 Destination 是文件还是目录。
如果 Destination 不包含现有目录且不以反斜杠 (\) 结尾,会出现下列消息:

 Does destination specify a file name
 or directory name on the target
 (F = file, D = directory)?

系统将会询问你
目标 X:\XXX 是文件名还是目录名
(F = 文件,D = 目录)?
 如果要将一个或多个文件复制到一个文件,请按 F。如果要将一个或多个文件复制到一个目录,请按 D。
------------------------------------------------------------------------------------------------------

思考:

比较一下xcopy /e d:\123 e:\kkk\  和 xcopy /e d:\123 e:\kkk 两者之间有什么不同?
两者都是复制d:\123目录下所有文件(夹)到e:\kkk,包括空的子目录,但前者不会询问你
目标e:\kkk 是文件名还是目录名
(F = 文件,D = 目录)?
------------------------------------------------------------------------------------------------------

复制文件(夹):xcopy

 

33. & 组合命令
语法:第一条命令 & 第二条命令 [& 第三条命令...]

这个符号允许在一行中使用 2 个以上不同的命令,当第一个命令执行失败了,也不影响后边的命令执行。这里&两边的命令是顺序执行的,从前往后执行。

&& 组合命令

语法:第一条命令 && 第二条命令 [&& 第三条命令...]
用这种方法可以同时执行多条命令,当碰到执行出错的命令后将不执行后面的命令,如果一直没有出错则一直执行完所有命令

|| 组合命令

语法:第一条命令 || 第二条命令 [|| 第三条命令...]
用这种方法可以同时执行多条命令,当一条命令失败后才执行第二条命令,当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令;
提示:组合命令和重定向命令一起使用必须注意优先级。管道命令的优先级高于重定向命令,重定向命令的优先级高于组合命令。

echo脚本 bat脚本echo_命令行

echo脚本 bat脚本echo_字符串_02

dir z:\ & dir y:\ & dir c:\
以上命令会连续显示 z,y,c 盘的内容,不理会该盘是否存在

dir z:\ && dir y:\ && dir c:\

问题:把 C 盘和 D 盘的文件和文件夹列出到 a.txt 文件中。看例:
dir c:\ && dir d:\ > a.txt
这样执行后a.txt里只有D盘的信息!为什么?因为组合命令的优先级没有重定向命令的优先级高!所以这
句在执行时将本行分成这两部分: dir c:\和 dir d:\ > a.txt,而并不是如你想的这两部分: dir c:\ && dir d:\和
> a.txt。要使用组合命令&&达到题目的要求,必须得这么写:dir c:\ > a.txt && dir d:\ >> a.txt
这样,依据优先级高低, DOS 将把这句话分成以下两部分: dir c:\ > a.txt 和 dir d:\ >> a.txt。例十八中的几
句的差别比较特殊,值得好好研究体会一下。
当然这里还可以利用&命令(自己想一下道理哦):
dir c:\ > a.txt & dir d:\ >> a.txt

组合命令

 

34. 命令管道符 |

表示把在它之前的命令或语句的执行结果作为在它之后的命令或语句的处理对象,简而言之,就是把它之前的输出作为它之后的输入

echo脚本 bat脚本echo_命令行

echo脚本 bat脚本echo_字符串_02

例1
tasklist | find /i "qq.exe" && taskkill /f /im qq.exe
将tasklist(进程列表)用传递符"|" 传递给find 命令,执行查找QQ的进程。

例2
echo Y|rd /s c:\abc
通过管道命令|将echo y 的结果传给rd /s c:\abc 命令,从而达到自动输入y 的目的。


★注意,管道命令 | 的输入方法,shift键 \

示例

 

35. "" 字符串界定符,双引号允许在字符串中包含空格

①在表示带有空格或特殊符号的路径时常要用""来将路径括起来。
cd /d cd "d:\program files\^%*abc"
因为路径中带有空格和特殊符号,所以要用""将路径括起来。

②表示其中的内容是一个完整的字符串。
@echo off
set "var=abc 123"
echo %var%
pause
这里表示变量var的值为字符串“abc 123”。

 

 36. , 逗号

逗号相当于空格,在某些情况下“,”可以用来当做空格使
比如dir,c:\

 

37. :分号,当命令相同时,可以将不同目标用;来隔离,但执行效果不变,如执行过程中发生错误,则只返回错误报告,但程序仍会执行。

echo脚本 bat脚本echo_命令行

echo脚本 bat脚本echo_字符串_02

dir c:\;d:\;e:\;z:\以上命令相当于
dir c:\
dir d:\
dir e:\
dir f:\
如果其中 z 盘不存在,运行显示:系统找不到指定的路径。然后终止命令的执行。
例: dir c:\;d:\;e:\1.txt
以上命令相当于
dir c:\
dir d:\
dir e:\1.txt
其中文件 e:\1.txt 不存在,但 e 盘存在,有错误提示,但命令仍会执行。
为什么?如果目标路径不存在,则终止执行;如果路径存在,仅文件不存在,则继续执行

分号

 

38. () 括号
小括号在批处理编程中有特殊的作用,左右括号必须成对使用,括号中可以包括多行命令,这些命令将被看成一个整体,视为一条命令行。

echo脚本 bat脚本echo_命令行

echo脚本 bat脚本echo_字符串_02

例:
命令: echo 1 & echo 2 & echo 3
可以写成:
(
echo 1
echo 2
echo 3
)
上面两种写法效果一样,这两种写法都被视为是一条命令行。
注意:这种多条命令被视为一条命令行时,如果其中有变量,就涉及到变量延迟的问题

例子

 

39. ! 感叹号  19.变量延迟

40. 

  

 

参数 /L