批处理各符号的功能:
1.
echo有两个状态一个是on 一个是off默认的是on 它的功能是显示当前文件的路径,如果不写on 或者是off的时候,默认情况下
1.
echo有两个状态一个是on 一个是off默认的是on 它的功能是显示当前文件的路径,如果不写on 或者是off的时候,默认情况下
是打开的即显当前文件的路径,加上off后,所有路径都不显示,但是echo off这行还能显出来,要让这行也消失的话就在它们前面
加一个@即@echo off,另外echo命令的另一种用法,可以直接编辑文本文件,例如:
echo netstat -an >a.bat结晶果是在当前目录下生成一个a.bat的文件,双击直接执行这个文件时,就会执行netstat -an这个命令
echo netstat -an >a.bat结晶果是在当前目录下生成一个a.bat的文件,双击直接执行这个文件时,就会执行netstat -an这个命令
。
2.
> 这个字符的意思是将">"前面的内容传递并且覆盖">"后面的内容,它所起的作用是将运行的回显结果传递到后面的范围.
例如:ipconfig.txt中的内容是1113333,执行ipconfig /all >ipconfig.txt即将ipconfig /all的内容覆盖原有的1113333。与这个
> 这个字符的意思是将">"前面的内容传递并且覆盖">"后面的内容,它所起的作用是将运行的回显结果传递到后面的范围.
例如:ipconfig.txt中的内容是1113333,执行ipconfig /all >ipconfig.txt即将ipconfig /all的内容覆盖原有的1113333。与这个
符号相似的还有>>它的功能不是覆盖而追加,即将运行后的内容加到原来的1113333后。
3.
| 这是一个管道传输命令,意思是将上一命令执行的结果传到下一个命令去处理
例如:
dir c:\|find "txt"
以上命令是:查找C:\所有,并发现TXT字符串。
| 这是一个管道传输命令,意思是将上一命令执行的结果传到下一个命令去处理
例如:
dir c:\|find "txt"
以上命令是:查找C:\所有,并发现TXT字符串。
||
Usage:第一条命令 || 第二条命令 [|| 第三条命令...]
用这种方法可以同时执行多条命令,当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令
;(只要正确后面的就不执行)
4.
^ 是对特殊符号"<",">","&"的前导字符,在命令中他将以上3个符号的特殊功能去掉,仅仅只把他们当成符号而不使用他们的特殊
^ 是对特殊符号"<",">","&"的前导字符,在命令中他将以上3个符号的特殊功能去掉,仅仅只把他们当成符号而不使用他们的特殊
意义。
例如:
C:\>echo ipconfig.txt ^>ipconfig
例如:
C:\>echo ipconfig.txt ^>ipconfig
结果为:ipconfig.txt >ipconfig没有追加只是显示出来而已
5.
& 这个符号允许在一行中使用2个以上不同的命令,当第一个命令执行失败了,也不影响后边的命令执行
& 这个符号允许在一行中使用2个以上不同的命令,当第一个命令执行失败了,也不影响后边的命令执行
例如:C:\>dir d:/p & dir e: /p & dir c: /p
结果是先后执行
结果是先后执行
6.
&& 这个命令和上边的类似,但区别是,第一个命令失败时,后边的命令也不会执行
例如:C:\>dir w:/p && dir e: /p && dir c: /p 由于电脑上没有w盘所以显示结果为:系统找不到指定的路径。这样以来,后面的
&& 这个命令和上边的类似,但区别是,第一个命令失败时,后边的命令也不会执行
例如:C:\>dir w:/p && dir e: /p && dir c: /p 由于电脑上没有w盘所以显示结果为:系统找不到指定的路径。这样以来,后面的
两个盘就不执行啦。(当第n个命令失败时此命令后面的命令将不再执行,也就是说一直执行到失败为止)
7.
"" 双引号允许在字符串中包含空格,进入一个特殊目录可以用如下方法
7.
"" 双引号允许在字符串中包含空格,进入一个特殊目录可以用如下方法
cd "program files"
cd progra~1
cd pro*
cd progra~1
cd pro*
以上三种方法都可以进入program files这个目录
8.
, 逗号相当于空格,在某些情况下“,”可以用来当做空格使
, 逗号相当于空格,在某些情况下“,”可以用来当做空格使
比如
dir,c:\
9.
; 分号,当命令相同时,可以将不同目标用;来隔离,但执行效果不变,如执行过程中发生错误,则只返回错误报告,但程序还是
; 分号,当命令相同时,可以将不同目标用;来隔离,但执行效果不变,如执行过程中发生错误,则只返回错误报告,但程序还是
会执行。
比如:
dir c:\;d:\e:\;f:\
以上命令相当于
dir c:\
dir d:\
dir e:\
dir f:\
但是前面执行的盘不存在的话,后面的命令将不会执行。
dir d:\
dir e:\
dir f:\
但是前面执行的盘不存在的话,后面的命令将不会执行。
例如:C:\>dir w:;d: /p;e: /p
结果为:系统找不到指定的路径。
结果为:系统找不到指定的路径。
10.在echo的后面加一个点,所起到的作用是显示一空行。
以下范例显示的批处理程序包含前后各有一个空行的三行消息:
@echo off
echo.
echo This batch program
echo formats and checks
echo new disks
echo.
echo.
echo This batch program
echo formats and checks
echo new disks
echo.
如果想让打开的批处理命令的标题栏有名字的话可以用到title这个参数
title filename
">nul 2>nul"可以屏蔽一切屏幕的输出,例如:dir >nul 2>nul这样屏幕上什么都不会输出,也就是没有结果。
1>nul 表示将正确执行目录树的信息禁止输出,2>nul 表示将执行过程中的错误信息禁止输出。
断开网络连接方法有两种:一种是rasphone /h adsl,另一种是rasdial adsl /d
11.goto一般和:是联用的goto跳转的地方入口就是":"。goto命令的另一种用法一:提前结束程序。在程序中间使用goto命令跳转到
某一标签,而这一标签的内容却定义为退出。如:
……
goto end
……
:end
……
goto end
……
:end
dir中有些命令是要牢记的
dir d: /s /p /b (/a这后面还有一些参数像h,r,d,s/d)具体的可以看帮助
%userprofile%在写批处理时这个相当于C:\Documents and Settings\Administrator
在结束关键进程的时候,要先结束explorer.exe这个进程,最好用系统自带的工具taskkill这个关explorer.exe的时候任何杀毒软件
都没有提示,但是如果换成了用ntsd关的话,卡巴斯基会报毒,而且这时的explorer会在关闭的一下后马上自启动,而taskkill就会
一直关着直到等你开启为止。
在使用for 的时候当用到 /d时,那是因为set中有* ?这两个通配符
shift
1.可替代参数的编号是%o-%9,如果要在一个命令行上使用超过10个可以被代换的参数,则可使用SHIFT命令来突破此限制。
2.每当执行sHIFT一次,命令行上的所有参数将向左移动一位。%1的内容将为%2的内容所取代…,%9内容则由新的参数取代。
3.%o表示批处理文件本身的名称,永远不变,所以每次执行时可以在批处理文件使用一次shift就向右移动一位,例如:
2.每当执行sHIFT一次,命令行上的所有参数将向左移动一位。%1的内容将为%2的内容所取代…,%9内容则由新的参数取代。
3.%o表示批处理文件本身的名称,永远不变,所以每次执行时可以在批处理文件使用一次shift就向右移动一位,例如:
a.bat的内容:
@echo %1 %2 %3 %4 %5 %6 %7 %8 %9
shift
@echo %1 %2 %3 %4 %5 %6 %7 %8 %9
shift
@echo %1 %2 %3 %4 %5 %6 %7 %8 %9
pause
shift
@echo %1 %2 %3 %4 %5 %6 %7 %8 %9
shift
@echo %1 %2 %3 %4 %5 %6 %7 %8 %9
pause
运行
c:\>a 1 2 3 4 5 6 7 8 9 10 11(其后有11个参数)
1 2 3 4 5 6 7 8 9 (取到最前面9个参数)
c:\>shift (移位)
2 3 4 5 6 7 8 9 10 11(取到另外9个参数)
c:\>shift (移位)
3 4 5 6 7 8 9 10 (取到另外9个参数)
c:\>a 1 2 3 4 5 6 7 8 9 10 11(其后有11个参数)
1 2 3 4 5 6 7 8 9 (取到最前面9个参数)
c:\>shift (移位)
2 3 4 5 6 7 8 9 10 11(取到另外9个参数)
c:\>shift (移位)
3 4 5 6 7 8 9 10 (取到另外9个参数)
在批处理中del /f /s /q可以删除指定目录下的任何文件,但是不能删除文件夹,rd /s /q不但可以删除指定目录下的文件夹而且还
可以删除目录下的所有文件,以前总是以为rd只能删除文件夹,现在才知道用这个命令还以删除文件夹
@echo off @echo off
:top :top
if (%1)==() goto end if (%1)==()goto end
shift shift
echo still running echo still running
goto top goto top
:end :end
看到了吧!两个程序就是第三行的goto前面不一样,第一个有一个空格,而第二个没有,就是这个空格所产生的结果就不一样,第一
个结果是三行still running,而第二个结果是一个无限制的循环,一直不停的显示still running,所以写程序的时候一定要注意
errorlevel
若一个程序或DOS命令执行成功,则返回的E只RORLEVEL的值为o,否则为1至255之间AscII值的任意整数,其值只占一个字节约内存
空间,值得注意的是IF语句中检验的ERRORLEVEL值是大于或等于而不是等于,例如语句IF ERRORLEVEL 5检验的是ERRORLEVEL>=5而
不是ERRORLEVEL=5,因此对于5至255之间的任何整数,此语句检验结果都是真值。
在变量延迟时要用到setlocal EnableDelayedExpansion
例如:
@echo off
setlocal EnableDelayedExpansion
.......
然后写要用的代码
需要注意的是,一旦启用了变量延迟,就要用!号把变量括起来,而不能用%号。
echo !n!
显示变量n的值
显示变量n的值
例如:
@echo off &SETLOCAL ENABLEDELAYEDEXPANSION
set mm=gril&echo !mm!
pause
@echo off &SETLOCAL ENABLEDELAYEDEXPANSION
set mm=gril&echo !mm!
pause
ping 在批处理中有延时的作用,开始的时候不知道怎么用,后来才发现,每ping一次的时间是一秒,所以写成ping /n 10 127.1或者
是ping /n 10 localhost效果是一样的,都能起来延时十秒的作用
set
SET /A expression
环境变量替换已如下增强:
%PATH:str1=str2%
%PATH:~10,5%
%PATH:~-10%
%PATH:~0,-2%
环境变量替换已如下增强:
%PATH:str1=str2%
%PATH:~10,5%
%PATH:~-10%
%PATH:~0,-2%
%PATH:str1=str2%这个操作就是把变量%PATH%的里的str1全部用str2替换
例如:
@echo off
set a= bbs.verybat.cn
echo 替换前的值: "%a%"
set var=%a: =qq%
echo 替换后的值: "%var%"
pause
@echo off
set a= bbs.verybat.cn
echo 替换前的值: "%a%"
set var=%a: =qq%
echo 替换后的值: "%var%"
pause
结果是:替换前的值: " bbs.verybat.cn" 很明显吧,那个空格被qq给代替啦^-^
替换后的值: "qqbbs.verybat.cn"
请按任意键继续. . .
替换后的值: "qqbbs.verybat.cn"
请按任意键继续. . .
@echo off
set a=bbs.verybat.cn
echo 替换前的值: "%a%"
set var=%a:.=伤脑筋%
echo 替换后的值: "%var%"
pause
解释set var=%a:.=伤脑筋%
set命令 var变量名 字a是要进行字符替换的变量的值,"."为要替换的值,
"伤脑筋"为替换后的值!
执行后就会把变量%a%里面的"."全部替换为"伤脑筋"
这就是set的替换字符的很好的功能!先讲到这
set命令 var变量名 字a是要进行字符替换的变量的值,"."为要替换的值,
"伤脑筋"为替换后的值!
执行后就会把变量%a%里面的"."全部替换为"伤脑筋"
这就是set的替换字符的很好的功能!先讲到这
%PATH:~10,5%
@echo off
set a=bbs.verybat.cn
set var=%a:~1,2%
echo %var%
pause
set a=bbs.verybat.cn
set var=%a:~1,2%
echo %var%
pause
执行后,我们会发现只显示了"bs"两个字母,我们的变量%a%的值不是为bbs.verybat.cn吗
怎么只显示了第2个字母和第3个字母"bs",分析一结果我们就可以很容易看出
%PATH:~10,5%就是显示变量PATH里指定几位的值!
分析set var=%a:~1,2%
set命令 var变量值 a要进行字符操作的变量 "1"从变量"a"第几位下一位开始显示 "2"显示几位
和起来就是把变量a的值从第一位开始,把后两位赋予给变量var
怎么只显示了第2个字母和第3个字母"bs",分析一结果我们就可以很容易看出
%PATH:~10,5%就是显示变量PATH里指定几位的值!
分析set var=%a:~1,2%
set命令 var变量值 a要进行字符操作的变量 "1"从变量"a"第几位下一位开始显示 "2"显示几位
和起来就是把变量a的值从第一位开始,把后两位赋予给变量var
%PATH:~-10% 例子
@echo off
set a=bbs.verybat.cn
set var=%a:~-3%
echo %var%
pause
set a=bbs.verybat.cn
set var=%a:~-3%
echo %var%
pause
这个的意思是从右往左取三位,把取到的部分给了var ,如果把负号去掉,就成了从左往右去掉三位把剩下的部分给了var
%PATH:~0,-2% 例子
@echo off
set a=bbs.verybat.cn
set var=%a:~4,-3%
echo %var%
pause
set a=bbs.verybat.cn
set var=%a:~4,-3%
echo %var%
pause
结果是verybat,这段代码的意思是,从右去掉三位,把左剩余的部分,从第四位的下一位开始显示,把显示的内容给了var
如果改成set var=%a:~3,-3%结果就是.verybat
延迟和set的综合应用:
@echo off
setlocal enabledelayedexpansion
title I Love Greatwall
set love=I Love Greatwall Forever
setlocal enabledelayedexpansion
title I Love Greatwall
set love=I Love Greatwall Forever
for /l %%i in (1,1,24) do (cls
echo. !love:~0,%%i!
ping/n 1 127.1>nul 2>nul)
pause
echo. !love:~0,%%i!
ping/n 1 127.1>nul 2>nul)
pause
我觉得这段代码很意思,do里面的命令主要是分三块但是这三块不能在同一行,分三行写.因为它们是不同的命令,要想写在一行的
话要加&,写好后为for /l %%i in (1,1,24) do (cls &echo. !love:~0,%%i! &ping/n 1 127.1>nul 2>nul)
for
在DOs提示符下可直接使用FOR语句,用法的区别在于必须把%%variable写成%variable
关于FOR语句的使用方法,归纳如下:
(1)为了在各种DOS版本下都能运行,%%vart6le的变量必须为单个字符,应避
免使用%%o一%%9作为变量。
(2)FOR%%variaNeIN tnle s就)command%%variable其中File set必须放在
括号内,文件的个数没有限制,只要不超过D05命令行127个字符的限制即可,文件之
间用空格或逗号作为分隔符分开,文件名可以使用通配符。
(3)FoR语句中后面的变量有时可省略,如:
FOR%%a IN(*.BAK)D0 DIR
(4)FOR语句的结尾如果执行另一个批处理程序,执行结束后,不再返回FOR语
(1)为了在各种DOS版本下都能运行,%%vart6le的变量必须为单个字符,应避
免使用%%o一%%9作为变量。
(2)FOR%%variaNeIN tnle s就)command%%variable其中File set必须放在
括号内,文件的个数没有限制,只要不超过D05命令行127个字符的限制即可,文件之
间用空格或逗号作为分隔符分开,文件名可以使用通配符。
(3)FoR语句中后面的变量有时可省略,如:
FOR%%a IN(*.BAK)D0 DIR
(4)FOR语句的结尾如果执行另一个批处理程序,执行结束后,不再返回FOR语
FOR /D %%variable IN (set) DO command /D参数只能显示当前目录下的目录名字
@echo off
for /d %%i in (*) do @echo %%i
pause
把他保存放在C盘根目录执行,就会把C盘目录下的全部目录名字打印出来,而文件名字一个也不显示!
for /d %%i in (*) do @echo %%i
pause
把他保存放在C盘根目录执行,就会把C盘目录下的全部目录名字打印出来,而文件名字一个也不显示!
@echo off
for /d %%i in (???) do @echo %%i
pause
这样的话如果你当前目录下有目录名字只有1-3个字母的,就会显示出来,没有就不显示了
for /d %%i in (???) do @echo %%i
pause
这样的话如果你当前目录下有目录名字只有1-3个字母的,就会显示出来,没有就不显示了
这里解释下*号和?号的作用,*号表示任意N个字符,而?号只表示任意一个字符
FOR /R [[drive:]path] %%variable IN (set) DO command
它可以把当前或者你指定路径下的文件名字全部读取,注意是文件名字
@echo off
for /r c:\ %%i in (*.exe) do @echo %%i
pause
for /r c:\ %%i in (*.exe) do @echo %%i
pause
把C盘根目录,和每个目录的子目录下面全部的EXE文件都列出来了
@echo off
for /r %%i in (*.exe) do @echo %%i
pause
以当前目录为搜索路径,显示当前目录的全部EXE文件列出来!
for /L %% Variable in (Start#,Step#,End#) do Command
@echo off
for /l %%i in (1,1,5) do start cmd
pause
for /l %%i in (1,1,5) do start cmd
pause
看上面的start step end就知道是什么意思了吧,开始,结束,步阶,按一步一个的话,就会总有六个cmd跳出来五个
设置默认的控制台前景和背景颜色。
设置默认的控制台前景和背景颜色。
for /F "ParsingKeywords" %% Variable in (FileNameSet) do Command
"ParsingKeywords"
它表示4个参数
eol=c - 指一个行注释字符的结尾(就一个)
skip=n - 指在文件开始时忽略的行数。
delims=xxx - 指分隔符集。这个替换了空格和跳格键的
默认分隔符集。
tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代
的 for 本身。这会导致额外变量名称的分配。m-n
格式为一个范围。通过 nth 符号指定 mth。如果
符号字符串中的最后一个字符星号,
那么额外的变量将在最后一个符号解析之后
分配并接受行的保留文本。
usebackq - 指定新语法已在下类情况中使用:
在作为命令执行一个后引号的字符串并且一个单
引号字符为文字字符串命令并允许在 filenameset
中使用双引号扩起文件名称。
例如:新建一个文件名字为test.txt
内容为:
;哈哈
你好!相信自己一定会成功……
Never Say Die
好啦就这样吧
它表示4个参数
eol=c - 指一个行注释字符的结尾(就一个)
skip=n - 指在文件开始时忽略的行数。
delims=xxx - 指分隔符集。这个替换了空格和跳格键的
默认分隔符集。
tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代
的 for 本身。这会导致额外变量名称的分配。m-n
格式为一个范围。通过 nth 符号指定 mth。如果
符号字符串中的最后一个字符星号,
那么额外的变量将在最后一个符号解析之后
分配并接受行的保留文本。
usebackq - 指定新语法已在下类情况中使用:
在作为命令执行一个后引号的字符串并且一个单
引号字符为文字字符串命令并允许在 filenameset
中使用双引号扩起文件名称。
例如:新建一个文件名字为test.txt
内容为:
;哈哈
你好!相信自己一定会成功……
Never Say Die
好啦就这样吧
@echo off
FOR /F "eol=; tokens=1 delims= " %%i in (test.txt) do @echo %%i
pause
FOR /F "eol=; tokens=1 delims= " %%i in (test.txt) do @echo %%i
pause
你好!相信自己一定会成功……
Never
好啦就这样吧
Never
好啦就这样吧
这个命令会读取在当前目录下名为test.txt文件中的内容,然后将每一行的内容赋值给变量%%i,然后忽略掉以;号开头的行,并且以空
格做为分隔符号,打印第每行以空各做分隔符号的第一列
又例如:
@echo off
for /f "tokens=3 delims=- " %%a in ('date /t') do @echo %%a
pause
@echo off
for /f "tokens=3 delims=- " %%a in ('date /t') do @echo %%a
pause
date /t的结果是:2007-08-22 星期三
所以批处理的结果为:22
所以批处理的结果为:22
@echo off
for /f "tokens=2,3,4 delims=-" %%a in ('date /t') do @echo %%c-%%a-%%b
pause
for /f "tokens=2,3,4 delims=-" %%a in ('date /t') do @echo %%c-%%a-%%b
pause
结果为:-08-22 星期三
总结:以上两个的结果都是从date /t中以"-"为分隔符,从左往右依次取第三列(这就是第一个的结果22),第二,三,四列(这就是
第二个的结果-08-22 星期三),这个for以后的用处还很大.
FOR的变量全部列出来:凡是 %~ 开头的操作符,都是文件名的分离操作
~I - 删除任何引号("),扩展 %I
这个变量的作用就如他的说明,删除引号!
我们来看这个例子:
我们来看这个例子:
首先我们在桌面建立一个名字为temp.txt文本文件,在里面输入这些内容
"1111
2222"
"3333"
44"44
然后在建立个BAT文件代码如下:
"1111
2222"
"3333"
44"44
然后在建立个BAT文件代码如下:
FOR /F "delims=" %%i IN (temp.txt) DO @echo %%~i
pause
pause
执行后,我们看CMD的回显如下:
1111
2222"
3333
44"44
和之前temp.txt中的内容对比一下,我们会发现第一行和第三行的引号都消失了,这就是删除引号~i的作用了!
删除引号规则如下(BAT兄补充!)
1、若字符串首尾同时存在引号,则删除首尾的引号;
2、若字符串尾不存在引号,则删除字符串首的引号;
3、如果字符串中间存在引号,或者只在尾部存在引号,则不删除
1111
2222"
3333
44"44
和之前temp.txt中的内容对比一下,我们会发现第一行和第三行的引号都消失了,这就是删除引号~i的作用了!
删除引号规则如下(BAT兄补充!)
1、若字符串首尾同时存在引号,则删除首尾的引号;
2、若字符串尾不存在引号,则删除字符串首的引号;
3、如果字符串中间存在引号,或者只在尾部存在引号,则不删除
%~fI - 将 %I 扩展到一个完全合格的路径名
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~fi
pause
pause
执行后显示内容如下
C:\Documents and Settings\Administrator\桌面\test.bat
C:\Documents and Settings\Administrator\桌面\test.vbs
当我把代码中的 %%~fi直接改成%%i
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%i
pause
C:\Documents and Settings\Administrator\桌面\test.bat
C:\Documents and Settings\Administrator\桌面\test.vbs
当我把代码中的 %%~fi直接改成%%i
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%i
pause
执行后就会显示这些内容
test.bat
test.vbs
test.bat
test.vbs
%~dI - 仅将 %I 扩展到一个驱动器号
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~di
pause
执行后我CMD里显示如下
C:
C:
%%~di作用是,如果变量%%i的内容是一个文件或者目录名,那么%%~di就会把%%i这文件或者目录所在的盘符号打印出来!
pause
执行后我CMD里显示如下
C:
C:
%%~di作用是,如果变量%%i的内容是一个文件或者目录名,那么%%~di就会把%%i这文件或者目录所在的盘符号打印出来!
%~pI - 仅将 %I 扩展到一个路径
这个用法和上面一样,他只打印路径不打印文件名字
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~pi
pause
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~pi
pause
\Documents and Settings\Administrator\桌面\
%~nI - 仅将 %I 扩展到一个文件名
只打印文件名字
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~ni
pause
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~ni
pause
test
%~xI - 仅将 %I 扩展到一个文件扩展名
只打印文件的扩展名
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~xi
pause
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~xi
pause
.vbs
.bat
.txt
.txt
.txt
.bat
.txt
.txt
.txt
%~sI - 扩展的路径只含有短名
打印绝对短文件名
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~si
pause
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~si
pause
C:\DOCUME~1\ADMINI~1\桌面\a.vbs
C:\DOCUME~1\ADMINI~1\桌面\a2.bat
C:\DOCUME~1\ADMINI~1\桌面\q.txt
C:\DOCUME~1\ADMINI~1\桌面\test.txt
C:\DOCUME~1\ADMINI~1\桌面\_讨论_~1.TXT
C:\DOCUME~1\ADMINI~1\桌面\常用工具
C:\DOCUME~1\ADMINI~1\桌面\a2.bat
C:\DOCUME~1\ADMINI~1\桌面\q.txt
C:\DOCUME~1\ADMINI~1\桌面\test.txt
C:\DOCUME~1\ADMINI~1\桌面\_讨论_~1.TXT
C:\DOCUME~1\ADMINI~1\桌面\常用工具
%~aI - 将 %I 扩展到文件的文件属性
打印文件的属性
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~ai
pause
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~ai
pause
--a------
--a------
--a------
--a------
--a------
dr-------
--a------
--a------
--a------
--a------
dr-------
%~tI - 将 %I 扩展到文件的日期/时间
打印文件建立的日期
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~ti
pause
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~ti
pause
2007-08-21 12:30
2007-08-22 18:40
2007-08-22 12:31
2007-08-22 17:58
2007-08-19 23:23
2007-08-16 14:28
2007-08-22 18:40
2007-08-22 12:31
2007-08-22 17:58
2007-08-19 23:23
2007-08-16 14:28
%~zI - 将 %I 扩展到文件的大小
打印文件的大小
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~zi
pause
FOR /F "delims==" %%i IN ('dir /b') DO @echo %%~zi
pause
76
439
558
64
34614
0
最后一个不是个文件而是一个文件夹,所以显示为0,其实不为0的
439
558
64
34614
0
最后一个不是个文件而是一个文件夹,所以显示为0,其实不为0的
%~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩展
到找到的第一个完全合格的名称。如果环境变量名
未被定义,或者没有找到文件,此组合键会扩展到
空字符串
到找到的第一个完全合格的名称。如果环境变量名
未被定义,或者没有找到文件,此组合键会扩展到
空字符串
我们先在桌面建立一个temp.txt文件,里面写上这些内容
c:\windows
c:\windows\system32
c:\windows\teett
c:\windows
c:\windows\system32
c:\windows\teett
然后在把这些代码保存为批处理,放在桌面.
FOR /F "delims==" %%i IN (temp.txt) DO @echo %%~$PATH:i
pause
FOR /F "delims==" %%i IN (temp.txt) DO @echo %%~$PATH:i
pause
执行后CMD显示如下内容
c:\WINDOWS
c:\WINDOWS\system32
ECHO 处于打开状态。
c:\WINDOWS
c:\WINDOWS\system32
ECHO 处于打开状态。
为什么会这样呢,还有一行c:\windows\teett呢?
我们直接在CMD里输入echo %path% 会显示C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem
%%~$PATH:i也就是在文本里寻找匹配这个PATH变量值的内容,如果里面的内容和PATH变量相同,就打印出来
如果不相同,就显示一个空行!
我们直接在CMD里输入echo %path% 会显示C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem
%%~$PATH:i也就是在文本里寻找匹配这个PATH变量值的内容,如果里面的内容和PATH变量相同,就打印出来
如果不相同,就显示一个空行!
COLOR [attr]
attr 指定控制台输出的颜色属性
颜色属性由两个十六进制数字指定 -- 第一个为背景,第二个则为
前景。每个数字可以为以下任何值之一:
前景。每个数字可以为以下任何值之一:
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 A = 淡绿色
3 = 湖蓝色 B = 淡浅绿色
4 = 红色 C = 淡红色
5 = 紫色 D = 淡紫色
6 = 黄色 E = 淡黄色
7 = 白色 F = 亮白色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 A = 淡绿色
3 = 湖蓝色 B = 淡浅绿色
4 = 红色 C = 淡红色
5 = 紫色 D = 淡紫色
6 = 黄色 E = 淡黄色
7 = 白色 F = 亮白色
如果没有给定任何参数,该命令会将颜色还原到 CMD.EXE 启动时
的颜色。这个值来自当前控制台窗口、/T 开关或
DefaultColor 注册表值。
的颜色。这个值来自当前控制台窗口、/T 开关或
DefaultColor 注册表值。
如果用相同的前景和背景颜色来执行 COLOR 命令,COLOR 命令
echo test>test\x.txt 这句的意思是在test文件夹下往x.txt中写入test
FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]
/V 显示所有未包含指定字符串的行。
/C 仅显示包含字符串的行数。
/N 显示行号。
/I 搜索字符串时忽略大小写。
/OFF[LINE] 不要跳过具有脱机属性集的文件。
"string" 指定要搜索的文字串,
[drive:][path]filename
指定要搜索的文件。
/C 仅显示包含字符串的行数。
/N 显示行号。
/I 搜索字符串时忽略大小写。
/OFF[LINE] 不要跳过具有脱机属性集的文件。
"string" 指定要搜索的文字串,
[drive:][path]filename
指定要搜索的文件。
REG ADD KeyName [/v ValueName | /ve] [/t Type] [/s Separator] [/d Data]
KeyName [\\Machine\]FullKey
远程机器的机器名 - 忽略默认到当前机器。
远程机器上只有 HKLM 和 HKU。
FullKey ROOTKEY\SubKey
ROOTKEY [ HKLM | HKCU | HKCR | HKU | HKCC ]
SubKey 所选 ROOTKEY 下注册表项的完整名
远程机器的机器名 - 忽略默认到当前机器。
远程机器上只有 HKLM 和 HKU。
FullKey ROOTKEY\SubKey
ROOTKEY [ HKLM | HKCU | HKCR | HKU | HKCC ]
SubKey 所选 ROOTKEY 下注册表项的完整名
/v 所选项之下要添加的值名
/ve 为注册表项添加空白值名<无名称>
/t RegKey 数据类型
[ REG_SZ | REG_MULTI_SZ | REG_DWORD_BIG_ENDIAN |
REG_DWORD | REG_BINARY | REG_DWORD_LITTLE_ENDIAN |
REG_NONE | REG_EXPAND_SZ ]
如果忽略,则采用 REG_SZ
[ REG_SZ | REG_MULTI_SZ | REG_DWORD_BIG_ENDIAN |
REG_DWORD | REG_BINARY | REG_DWORD_LITTLE_ENDIAN |
REG_NONE | REG_EXPAND_SZ ]
如果忽略,则采用 REG_SZ
/s 指定一个在 REG_MULTI_SZ 数据字符串中
用作分隔符的字符
如果忽略,则将 "\0" 用作分隔符
用作分隔符的字符
如果忽略,则将 "\0" 用作分隔符
/d 要分配给添加的注册表 ValueName 的数据
/f 不用提示就强行改写现有注册表项
例如:
REG ADD
\\ABC\HKLM\Software\MyCo
添加远程机器 ABC 上的一个注册表项 HKLM\Software\MyCo
添加远程机器 ABC 上的一个注册表项 HKLM\Software\MyCo
REG ADD HKLM\Software\MyCo /v Data /t REG_BINARY /d fe340ead
添加一个值(名称: Data,类型: REG_BINARY,数据: fe340ead)
添加一个值(名称: Data,类型: REG_BINARY,数据: fe340ead)
REG ADD HKLM\Software\MyCo /v MRU /t REG_MULTI_SZ /d fax\0mail
添加一个值(名称: MRU,类型: REG_MUTLI_SZ,数据: fax\0mail\0\0)
添加一个值(名称: MRU,类型: REG_MUTLI_SZ,数据: fax\0mail\0\0)
REG ADD HKLM\Software\MyCo /v Path /t REG_EXPAND_SZ /d %%systemroot%%
添加一个值(名称: Path,类型: REG_EXPAND_SZ,数据: %systemroot%)
注意: 在扩充字符串中使用双百分比符号( %% )
添加一个值(名称: Path,类型: REG_EXPAND_SZ,数据: %systemroot%)
注意: 在扩充字符串中使用双百分比符号( %% )
设置屏幕每行显示字符数和每屏的行数 例如∶ MODE CONt COLS=80 LINES=25
如果要在批处理中生成一个空的文本文件可以这样写
type nul>a.txt
find的参数:
/C 仅显示包含字符串的行数。
/N 显示行号。
/I 搜索字符串时忽略大小写。
这三个是常用的
/C 仅显示包含字符串的行数。
/N 显示行号。
/I 搜索字符串时忽略大小写。
这三个是常用的
if和else必须在一行之上,比较运算符有
大于 gtr
大于等于 geq
等于 equ或者==
小于等于 leq
小于 lss
else和if必须在一行之上,如果有else部分的话,else前面的command部分必须用()括起来。
FINDSTR正则表达式的基本用法
1.findstr . 2.txt 或 Findstr "." 2.txt
从文件2.txt中查找任意字符,不包括空字符或空行
====================
从文件2.txt中查找任意字符,不包括空字符或空行
====================
2.findstr .* 2.txt 或 findstr ".*" 2.txt
从文件2.txt中查找任意字符包括空行和空字符
====================
从文件2.txt中查找任意字符包括空行和空字符
====================
3.findstr "[0-9]" 2.txt
从文件2.txt中查找包括数字0-9的字符串或行
====================
从文件2.txt中查找包括数字0-9的字符串或行
====================
4.findstr "[a-zA-Z]" 2.txt
从文件2.txt中查找包括任意字符的字符串或行
====================
从文件2.txt中查找包括任意字符的字符串或行
====================
5.findstr "[abcezy]" 2.txt
从文件2.txt中查找包括a b c e z y字母的字符串或行
====================
从文件2.txt中查找包括a b c e z y字母的字符串或行
====================
6.findstr "[a-fl-z]" 2.txt
从文件2.txt中查找小写字符a-f l-z的字符串,但不包含g h I j k这几个字母。
====================
从文件2.txt中查找小写字符a-f l-z的字符串,但不包含g h I j k这几个字母。
====================
7.findstr "M[abc][hig]Y" 2.txt
从文件2.txt中可以匹配 MahY , MbiY, MahY等…..
====================
从文件2.txt中可以匹配 MahY , MbiY, MahY等…..
====================
8. ^和$符号的应用
^ 表示行首,"^step"仅匹配 "step hello world"中的第一个单词
$ 表示行尾,"step$"仅匹配 "hello world step"中最后一个单词
====================
^ 表示行首,"^step"仅匹配 "step hello world"中的第一个单词
$ 表示行尾,"step$"仅匹配 "hello world step"中最后一个单词
====================
9.finstr "[^0-9]" 2.txt
如果是纯数字的字符串或者行便过滤掉,例如2323423423 这样的字符串,如果是345hh888这样的形式就不成了。
====================
如果是纯数字的字符串或者行便过滤掉,例如2323423423 这样的字符串,如果是345hh888这样的形式就不成了。
====================
10.findstr "[^a-z]" 2.txt
同上,如果是纯字母的字符串或者行便过滤掉,例如 sdlfjlkjlksjdklfjlskdf这样的字符,如果是sdfksjdkf99999这样的形式,掺
同上,如果是纯字母的字符串或者行便过滤掉,例如 sdlfjlkjlksjdklfjlskdf这样的字符,如果是sdfksjdkf99999这样的形式,掺
杂着数字就不成了
====================
====================
11.*号的作用
前面已经说过了 ".*"表示搜索的条件是任意字符,*号在正则表达式中的作用不是任何字符,而是表示左侧字符或者表达式的重复次
前面已经说过了 ".*"表示搜索的条件是任意字符,*号在正则表达式中的作用不是任何字符,而是表示左侧字符或者表达式的重复次
数,*号表示重复的次数为零次或者多次。
====================
====================
12.findstr "^[0-9]*$" 2.txt
这个是匹配找到的纯数字,例如 234234234234,如果是2133234kkjl234就被过滤掉了。
Findstr "^[a-z]*$" 2.txt
这个是匹配找到的纯字母,例如 sdfsdfsdfsdf,如果是213sldjfkljsdlk就被过滤掉了
如果在搜索条件里没有*号,也就是说不重复左侧的搜索条件,也就是[0-9] [a-z]那只能匹配字符串的第一个字符也只有这一个字符
这个是匹配找到的纯数字,例如 234234234234,如果是2133234kkjl234就被过滤掉了。
Findstr "^[a-z]*$" 2.txt
这个是匹配找到的纯字母,例如 sdfsdfsdfsdf,如果是213sldjfkljsdlk就被过滤掉了
如果在搜索条件里没有*号,也就是说不重复左侧的搜索条件,也就是[0-9] [a-z]那只能匹配字符串的第一个字符也只有这一个字符
,因为有行首和行尾的限制,"^[0-9]$"第一个字符如果是数字就匹配,如果不是就过滤掉,如果字符串是 9 就匹配,如果是98或者
9j之类的就不可以了。
=====================
=====================
13. "\<…\>"这个表达式的作用
这个表示精确查找一个字符串,\<sss 表示字的开始位置,sss\>表示字的结束位置
echo hello world computer|findstr "\<computer\>"这样的形式
echo hello worldcomputer|findstr "\<computer\>" 这样的形式就不成了,他要找的是 "computer"这个字符串,所以不可以。
echo hello worldcomputer|findstr ".*computer\>"这样就可以匹配了
这个表示精确查找一个字符串,\<sss 表示字的开始位置,sss\>表示字的结束位置
echo hello world computer|findstr "\<computer\>"这样的形式
echo hello worldcomputer|findstr "\<computer\>" 这样的形式就不成了,他要找的是 "computer"这个字符串,所以不可以。
echo hello worldcomputer|findstr ".*computer\>"这样就可以匹配了
所学知识的应用:
@echo off
reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v 该休息啦.bat /t reg_sz >nul
@echo off
:start
for /f "delims=: tokens=2" %%i in ('systeminfo ^| findstr "系统启动时间"') do set a=%%i
set var=%a:~2,1%
if var geq 2 (goto alert) else goto start
:alert
echo msgbox "该休息啦">alert.vbs
call alert
del /f/q alert.vbs,time.txt
pause
reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v 该休息啦.bat /t reg_sz >nul
@echo off
:start
for /f "delims=: tokens=2" %%i in ('systeminfo ^| findstr "系统启动时间"') do set a=%%i
set var=%a:~2,1%
if var geq 2 (goto alert) else goto start
:alert
echo msgbox "该休息啦">alert.vbs
call alert
del /f/q alert.vbs,time.txt
pause
这个是我自己写的,其实也没有什么用就是把自己的东西串一下,从这段代码中我学到了不少东西,在if的时候一定记得要在else前
的command加括号,还有就是^的使用,看看上面,它就是显示它后面的符号,使它们失去功能,还有好多,呵呵,都在程序里啦。
还有就是pan断大小的使用
其中,比较运算符可以是:
还有就是pan断大小的使用
其中,比较运算符可以是:
equ - 等于
neq - 不等于
lss - 小于
leq - 小于或等于
gtr - 大于
geq - 大于或等于
neq - 不等于
lss - 小于
leq - 小于或等于
gtr - 大于
geq - 大于或等于
在一行上写上三个echo.相当于空三行echo.&echo.&echo.这是正确的格式,就是空三行
SET /P verybat= 请选择要进行的操作:
IF /I "%verybat:~0,1%"=="1" GOTO 1
IF /I "%verybat:~0,1%"=="2" GOTO 2
IF /I "%verybat:~0,1%"=="1" GOTO 1
IF /I "%verybat:~0,1%"=="2" GOTO 2
@echo off
echo 正在准备生成加密的jpg图片
echo 请将要加密的图片改名为1.jpg
echo 请将要密语保存为2.txt
echo 按任意键开始加密
pause
Copy 1.jpg/b + 2.txt/a 3.jpg
echo 加密结束
echo 程序将生成加密图片3.jpg
pause
以上是图片加密的代码,看看很简单的吧呵呵
用到了copy的参数
COPY [/D] [/V] [/N] [/Y | /-Y] [/Z] [/A | /B ] source [/A | /B]
[+ source [/A | /B] [+ ...]] [destination [/A | /B]]
echo 正在准备生成加密的jpg图片
echo 请将要加密的图片改名为1.jpg
echo 请将要密语保存为2.txt
echo 按任意键开始加密
pause
Copy 1.jpg/b + 2.txt/a 3.jpg
echo 加密结束
echo 程序将生成加密图片3.jpg
pause
以上是图片加密的代码,看看很简单的吧呵呵
用到了copy的参数
COPY [/D] [/V] [/N] [/Y | /-Y] [/Z] [/A | /B ] source [/A | /B]
[+ source [/A | /B] [+ ...]] [destination [/A | /B]]
source 指定要复制的文件。
/A 表示一个 ASCII 文本文件。
/B 表示一个二进位文件。
/D 允许解密要创建的目标文件
destination 为新文件指定目录和/或文件名。
/V 验证新文件写入是否正确。
/N 复制带有非 8dot3 名称的文件时,
尽可能使用短文件名。
/Y 不使用确认是否要改写现有目标文件
的提示。
/-Y 使用确认是否要改写现有目标文件
的提示。
/Z 用可重新启动模式复制已联网的文件。
/A 表示一个 ASCII 文本文件。
/B 表示一个二进位文件。
/D 允许解密要创建的目标文件
destination 为新文件指定目录和/或文件名。
/V 验证新文件写入是否正确。
/N 复制带有非 8dot3 名称的文件时,
尽可能使用短文件名。
/Y 不使用确认是否要改写现有目标文件
的提示。
/-Y 使用确认是否要改写现有目标文件
的提示。
/Z 用可重新启动模式复制已联网的文件。
命令行开关 /Y 可以在 COPYCMD 环境变量中预先设定。
这可能会被命令行上的 /-Y 替代。除非 COPY
命令是在一个批文件脚本中执行的,默认值应为
在改写时进行提示。
这可能会被命令行上的 /-Y 替代。除非 COPY
命令是在一个批文件脚本中执行的,默认值应为
在改写时进行提示。
要附加文件,请为目标指定一个文件,为源指定
数个文件(用通配符或 file1+file2+file3 格式)。
数个文件(用通配符或 file1+file2+file3 格式)。
这些东西是自己当初学习批处理时的总结,现在发表出来,共大家学习
本文转自sucre03 51CTO博客,原文链接:http://blog.51cto.com/sucre/353397,如需转载请自行联系原作者