批处理学习笔记。

来源:互联网 发布:玩吃鸡网络延迟 编辑:程序博客网 时间:2024/05/16 17:37

if/else嵌套写法

 

@echo Sample

@echo off

:x

set /p goto=请输入您的选择[12345]

goto :y

:y

echo %goto%

if %goto% GTR 2  (

   if %goto% GTR 4 (

      echo 大于4

   ) else (

     if %goto% == 4 (

        echo 等于4) else ( echo小于4 )

  )

 

) else (

      echo 小于3

)

 

goto :x

 

 

set 使用

 

DOS下的变量都会被设置到系统的变量中,通过系统属性就可以查看当前的环境变量。

 

[设置变量]
格式:set 变量名=变量值
详细:被设定的变量以%变量名%引用

如:set str=ok

就是将变量str的值设置成字符串“OK

注意:set str=ok>

这个在批处理运行过程中会出错,系统会提示:“命令语法不正确。”

原因是,因为变量str 中的值“ok>”的字符">"为一特殊字符,会被系统当成定向符处理,所以会运行出错,那如果确实要设置这样的变量str,值为 "ok>"怎么办呢?解决办法有二:将特殊字符转义,转义方法在该特殊字符前加一个“^”,如:set str=ok^> (这种方法比较少用,因为没有多少应用价值)

常见的解决办法,在set后面将整个表达式用引号括起来,如:set "str=>"

 

 [取消变量]
格式:set 变量名=
详细:取消后的变量若被引用%变量名%将为空

[展示变量]
格式:set 变量名
详细:展示以变量名开头的所有变量的值

[列出所有可用的变量]
格式:set

 

设定变量

Eg:

set  v = 100

 

上面是设置了一个常量变量值为100;可以通过set v语句进行查看。也可以通过set来查看,但通过set将会得到以v开头的变量名都列出来。

 

取消变量:

set  v=

 

set 的参数

 

/a

格式:set  /a 表达式

set/A参数就是让SET可以支持数学符号进行加减等一些数学运算!支持的数学运算包含(优先权递减):

()      分组

! ~     一元运算符

* / %   算数运算符

+ -     算数运算符

<< >>  逻辑移位

&     按位“与”

^     按位“异”

|     按位“或”

= *= /= %= += -=    赋值

&= ^= |= <<= >>=

,     表达式分隔符

 

 

示例:set /a 1+2*3 输出 7

[设置变量为表达式计算后的值]
set v=1+2
echo %v% ==>
输出1+2
————————————
set /a v=1+2
echo %v% ==>
输出3

 

 

 

xx.bat

@echo off

set /a vapp = 1+3*8

echo %vapp%

pause

 

 

 

有时候我们需要直接在原变量进行加减操作就可以用这种语法

set /a var+=1 这样的语法对应原始语法就是set /a var = %var% + 1

都是一样的结果。

对于"逻辑或取余操作符",我们需要把他们用双引号引起来,看例子

set /a var= 1 "&" 1 这样结果就显示出来了,其他逻辑或取余操作符用法

set /a var= 1 "+" 1 异运算

set /a var= 1 "%" 1 取模运算

set /a var= 2 "<<" 2 次方运算

set /a var= 4 ">>" 2 根号运算

 

 

[设置变量为用户输入的值]

/p

set /p的特殊应用(set /p=<nul相当于输出字符并不带回车,利用这个性质,可以做出比较漂亮的动画),用法示例:

复制代码代码如下:

@echo off

for /l %%i in (1 1 70) do (

set /p=O<nul

for /l %%a in (1 1 50) do ver>nul

)

pause>nul

 

注:代码中用到了一句for /l %%a in (1 1 50) do ver>nul,它的目的是利用for循环运行某一命令来达到延时的目的。

 

 

set /p a=输入一个值 ==>输出输入一个值  //注意 =号与变量中间不能有空格

echo %a% ==>显示用户输入的值

预定义的变量

下面是些已经被底层定义好可以直接使用的变量:不会出现在 SET显示的变量列表中

文件位置为D:\TS2MP4\study.bat

Study.bat中的内容

@echo off

echo 命令参数

pause

 

执行下面的命令:

%CD% – 扩展到当前目录字符串。

%DATE% – 用跟 DATE命令同样的格式扩展到当前日期。

%TIME% – 用跟 TIME命令同样的格式扩展到当前时间。

%RANDOM% – 扩展到 0 32767 之间的任意十进制数字(随机数)

%ERRORLEVEL% – 扩展到当前 ERRORLEVEL数值。

%CMDEXTVERSION% – 扩展到当前命令处理器扩展名版本号。

%CMDCMDLINE% – 扩展到调用命令处理器的原始命令行。

%0 bat的完整路径名如”C:Windowssystem32xxx.bat”

%1 bat参数1依次类推%2参数2…

 

Eg:

@echo off

echo %1 %2 A b

pause

%path% – 当前的环境变量。以分号隔开的路径列表,路径可包含空格,可以以结尾,可以以双引号包围之。

扩展变量

@ %i相关的变量(bat参数或者for循环的%i)
文件位置为D:\TS2MP4\study.bat

%0        获取当前bat所在的路径位置信息

%~dp0  获取当前bat所有的文件夹位置

%~nx0   获取当前执行的bat文件名带后缀

%~n0     获取当前执行的bat文件名不带后缀

%~x0     获取当前执行的bat的后缀名

@ %VAR%相关的变量
%VAR:str1=str2%   会将VAR中的str1替换为str2(str2如果为空则可以达到删除的效果,str1前可以加*,变量%ABC:*B=%C)
%VAR:~0,-2%         
会提取VAR 变量的所有字符,除了最后两个
%VAR:~2%              会提取VAR变量的除前两个的所有字符
%VAR:~-2%             会提取VAR变量的最后两个
%VAR:~2,5%           提取从第2个字符开始的5个字符

 

 

利用set截取字符

 

@echo off&color 1f&rem num=15 nums=30

mode con: cols=80 lines=35

set "var=1234567890"

set "num= "

set "nums= "

rem 第一屏舍弃

cls&echo 第一屏舍弃

echo\&echo %num% var=%var%&echo\

for /l %%i in (1 1 3) do call :dan %%i

echo\

for /l %%i in (0 1 1) do call :yi %%i

echo\

for /l %%i in (0 1 2) do call :_yi %%i

echo ~ 波浪号后面的数字:为正数表示舍弃变量的前位;

echo , 逗号后面的数字为正数表示取变量的舍弃以后的前几位;

echo , 逗号后面为负数表示舍弃变量的后几位

echo\&echo\&pause&color 1e

rem 第二屏取

cls&echo 第二屏取

echo\&echo %num% var=%var%&echo\

for /l %%i in (-1 -1 -3) do call :dan %%i

echo\

for /l %%i in (-4 -1 -6) do call :er %%i

echo\

call :_er -8

echo ~ 波浪号后面直接跟负数表示取变量的后几位

echo , 逗号后面的数字为正数表示取变量的舍弃以后的前几位;

echo , 逗号后面为负数表示舍弃变量的后几位

echo\&echo\&pause&color 1f

rem 第三屏替换删除

cls&echo 第三屏替换删除

set "var=abc:\123\ef:g\123\456"hij"789"klm\"

echo\&echo %num%var=%var%

echo\

call :san

echo = 号左边为要替换掉的字符,右边为需替换来的字符

echo = 号左边要替换掉的字符前面加个*,代表第一次出现的字符及其前面的所有字符

echo\

echo ========= 演示完毕 =========按任意键退出 ==========

pause>nul

exit

:dan

set shu=%1

if %shu% lss 0 (set aa=&set ji=最后) else set aa=舍弃&set ji=

if "%shu:~0,1%"=="-" set shu=%shu:~1%

set str1=%%var:~%1%%%num%

set str2=%aa%var%ji%%shu%%nums%

call set str3=%%var:~%1%%%num%

call echo %%str1:~0,15%% %%str2:~0,30%% %%str3:~0,15%%

goto :eof

:yi

set shu=%1

if %shu% lss 0 (set aa=&set ji=最后) else set aa=舍弃&set ji=

for /l %%i in (1 1 3) do (

set str1=%%var:~%1,%%i%%%num%

set str2=%aa%var%ji%%shu%位之后取%%i%nums%

call set str3=%%var:~%1,%%i%%%num%

call echo %%str1:~0,15%% %%str2:~0,26%% %%str3:~0,15%%

if %%i==3 echo\

)

goto :eof

:_yi

for /l %%i in (-1 -1 -3) do (

set str1=%%var:~%1,%%i%%%num%

set str2=舍弃var的前%1位和%%i%nums%

call set str3=%%var:~%1,%%i%%%num%

call echo %%str1:~0,15%% %%str2:~0,28%% %%str3:~0,15%%

if %%i==-3 echo\

)

goto :eof

:er

set sss=%1

set sss=%sss:~1%

for /l %%i in (1 1 3) do (

set str1=%%var:~%1,%%i%%%num%

set str2=var的倒数%sss%位开始取%%i%nums%

call set str3=%%var:~%1,%%i%%%num%

call echo %%str1:~0,15%% %%str2:~0,24%% %%str3:~0,15%%

if %%i==3 echo\

)

goto :eof

:_er

set sss=%1

set sss=%sss:~1%

for /l %%i in (-1 -1 -3) do (

set str1=%%var:~%1,%%i%%%num%

set str2=var的倒数%sss%位开始并舍弃最后%%i%nums%

call set str3=%%var:~%1,%%i%%%num%

call echo %%str1:~0,15%% %%str2:~0,20%% %%str3:~0,15%%

if %%i==-3 echo\

)

goto :eof

:san

set str1=%%var:"=%%%num%

set str2=删除var中的所有^"%num%

set str3=%var:"=%%nums%

call echo %%str1:~0,13%% %%str2:~0,23%% %%str3:~0,30%%

set str1=%%var:\=%%%num%

set str2=删除var中的所有\%num%

set str3=%var:\=%%nums%

call echo %%str1:~0,13%% %%str2:~0,23%% %%str3:~0,30%%

set str1=%%var::=%%%num%

set str2=删除var中的所有:%num%

set str3=%var::=%%nums%

call echo %%str1:~0,13%% %%str2:~0,23%% %%str3:~0,30%%

echo\

set str1=%%var:"=%%%num%

set str2=替换var中的所有^"号为好字%num%

set str3=%var:"=%%nums%

call echo %%str1:~0,12%% %%str2:~0,20%% %%str3:~0,30%%

set str1=%%var:\=%%%num%

set str2=替换var中的所有\号为好字%num%

set str3=%var:\=%%nums%

call echo %%str1:~0,12%% %%str2:~0,20%% %%str3:~0,30%%

set str1=%%var::=%%%num%

set str2=替换var中的所有:号为好字%num%

set str3=%var::=%%nums%

call echo %%str1:~0,12%% %%str2:~0,20%% %%str3:~0,30%%

echo\

set str1=%%var:*"=%%%num%

set str3=%var:*"=%%nums%

echo 删除var中的第一次出现的^"号及其前面的所有字符

call echo %%str1:~0,15%% %%str3:~0,30%%

echo.

set str1=%%var:*\=%%%num%

set str3=%var:*\=%%nums%

echo 删除var中的第一次出现的\号及其前面的所有字符

call echo %%str1:~0,15%% %%str3:~0,30%%

echo.

set str1=%%var:*:=%%%num%

set str3=%var:*:=%%nums%

echo 删除var中的第一次出现的:号及其前面的所有字符

call echo %%str1:~0,15%% %%str3:~0,30%%

echo\

set str1=%%var:*"=ppp%%%num%

set str3=%var:*"=ppp%%nums%

echo 替换var中的第一次出现的^"号及其前面的所有字符为ppp

call echo %%str1:~0,15%% %%str3:~0,30%%

echo.

set str1=%%var:*\=ppp%%%num%

set str3=%var:*\=ppp%%nums%

echo 替换var中的第一次出现的\号及其前面的所有字符为ppp

call echo %%str1:~0,15%% %%str3:~0,30%%

echo.

set str1=%%var:*:=ppp%%%num%

set str3=%var:*:=ppp%%nums%

echo 替换var中的第一次出现的:号及其前面的所有字符为ppp

call echo %%str1:~0,15%% %%str3:~0,30%%

echo\

goto :eof

 

 

for

 

格式:FOR [参数] %%变量名 IN (相关文件或命令)   DO 执行的命令   

  作用:对一个或一组文件,字符串或命令结果中的每一个对象执行特定命令,达到我们想要的结果。   

  注意:在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable,而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.   

  关于:for命令可以带参数或不带参数,带参数时支持以下参数:/d /l /r /f   

  下面分别解释一下   

  

  ===   

  零:无参数时:   

  ---   

  FOR %variable IN (set) DO command [command-parameters]   

  %variable  指定一个单一字母可替换的参数。   

  (set)      指定一个或一组文件。可以使用通配符。   

  command    指定对每个文件执行的命令。   

  command-parameters   

  为特定命令指定参数或命令行开关。   

  

  TTT示例:   

  for %%i in (t*.*) do echo %%i --显示当前目录下与t*.*相匹配的文件(只显示文件名,不显示路径)    

  for %%i in (d:\mydocuments\*.doc) do @echo %%i --显示d:\mydocuments\目录下与*.doc相匹配的文件   

  

  ===   

  一、参数 /d (参数只能显示当前目录下的目录名字)   

  ---   

  格式:FOR /D %variable IN (set) DO command [command-parameters]   

  这个参数主要用于目录搜索,不会搜索文件,/D 参数只能显示当前目录下的目录名字。(TTT特别说明:只会搜索指定目录下的目录,不会搜索再下一级的目录。)   

  

  TTT示例:   

  for /d %%i in (c:\*) do echo %%i  --显示c盘根目录下的所有目录   

  for /d %%i in (???) do echo %%i  --显示当前目录下名字只有1-3个字母的目录   

  

  ===   

  二、参数 /R (搜索指定路径及所有子目录中与set相符合的所有文件)   

  ---   

  格式:FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]   

  此命令会搜索指定路径及所有子目录中与set相符合的所有文件,注意是指定路径及所有子目录。   

  

  1set中的文件名如果含有通配符(?或*),则列举/R参数指定的目录及其下面的所用子目录中与set相符合的所有文件,无相符文件的目录则不列举。   

  2、如果set中为具体文件名,不含通配符,则枚举该目录树(即列举该目录及其下面的所有子目录)(并在后面加上具体的文件名),而不管set中的指定文件是否存在。   

  例:for /r c:\ %%i in (*.exe) do echo %%i --C盘根目录,和每个目录的子目录下面全部的EXE文件都列出来了!!!!   

  

  TTT示例:   

  for /r c:\ %%i in (boot.ini) do echo %%i --枚举了c盘所有目录   

  for /r d:\backup %%i in (1) do echo %%i  --枚举d\backup目录   

  for /r c:\ %%i in (boot.ini) do if exist %%i echo %%i  --很好的搜索命令,列举boot.ini存在的目录   

  

  ===   

  三、参数 /L (该集表示以增量形式从开始到结束的一个数字序列。可以使用负的 Step)   

  ---   

  格式:FOR /L %variable IN (start,step,end) DO command [command-parameters]   

  该集表示以增量形式从开始到结束的一个数字序列。可以使用负的 Step   

  

  TTT示例:   

  for /l %%i in (1,1,5) do @echo %%i  --输出1 2 3 4 5   

  for /l %%i in (1,2,10) do @echo %%i  --输出1,35,79    

  for /l %%i in (100,-20,1) do @echo %%i  --输出100,80,60,40,20   

  for /l %%i in (1,1,5) do start cmd  --打开5CMD窗口   

  for /l %%i in (1,1,5) do md %%i  --建立从1~55个文件夹   

  for /l %%i in (1,1,5) do rd /q %%i  --删除从1~55个文件夹

 

 

FOR /F ["options"] %%i IN (file) DO command

FOR /F ["options"] %%i IN ("string") DO command

FOR /F ["options"] %%i IN ('command') DO command

这个可能是最常用的,也是最强的命令,主要用来处理文件和一些命令的输出结果。

file代表一个或多个文件

string 代表字符串

command代表命令

["options"] 可选

对于FOR /F %%i IN (file) DO command

 

 

for 命令 /f参数通俗讲解
for /f 参数最为复杂,难懂和常用.
在刚学时确实费了我不少脑筋,下面就我个人的理解,给新手们通俗的讲讲,也好让新手少走些弯路.
格式:
::
例一: 复制内容到剪贴板
代码:

for /f "skip=1 tokens=1,2* delims= " %%a in (a.txt) do echo %%a %%b %%c
pause

先从引号内的东西讲起,很多新手对这些难以理解,因为 for /?翻译的简直是一塌糊涂.
skip=
tokens=
delims=
这三项是用的最多的,根据需要.可以不用,可以一起使用,也可以只使用一个或两个.
但是不管使用几个都要用引号将它们扩起来.当然不使用时,自然就不需要引号了.
skip=
for
循环文本内容是以行为单位,从上至下进行的,skip=1意识就是跳过文本的第一行,即不循环第一行
那么skip=2 自然就是跳过前两行了,依次类推.........
delims=
先讲这句
delims=后面的字符的意识是,将文本每一行的内容以delims=后面的字符分割成若干列.
假设a.txt某一行的内容是 111,222.333 444/555
我们用下面的语句
::例二:复制内容到剪贴板
代码:

for /f "tokens=1-5 delims=,./ " %%a in (a.txt) do echo %%a %%b %%c %%d %%e
pause

显示结果是 111 222 333 444 555
解释:
意识就是把111,222.333 444/555,./和空格(不分先后)分成了5.注意代码中/"后面有个空格,
使用中要注意空格要放到最后,"delims=,. /"这样就不行了.
那如果我们不使用逗号来分割会如何呢?: "delims=./ "那么就会分割成111,222 333 444 555
看出区别了吗?delims=后面可以是多个字符,可以是空格,也可以什么都没有.
什么都没有代表什么呢?就是不以任何东西为分割符,也是整行的内容了.
因为for默认是以,;和空格作分割符的,
所以一般要取得整行内容通常会用"delims="这样的形式来取消for的默认分割符.
tokens=
tokens=1-5
1-5
很好理解就15,前面我们用delims=后面的字符为分割符,将文本内容分成了多列,那么你需要的是哪些列呢?
tokens=可以很好帮你提取到.
还是以例二为例:
通过dilims=,./ 将文本分成了111 222 333 444 555五列.
注意代码中前面有个%%a 这里的%%a就是代表第一列,第二列就是%%b,第三列就是%%c依此类推.....
那么我们如果把echo %%a %%b %%c %%d %%e 改为 echo %%e %%d %%c %%b %%a会如何呢?
当然.会显示 555 444 333 222 111
如果是:echo %%b %%d 又会显示什么呢?不用我说了吧!
若是第一个%%a把它改为%%i也是一样,那么第二列就是%%j...%%k...依此类推....
明白了?就是按英文字母的顺序依此类推的.
这里我们用的是tokens=1-5但是在例一中,我们用的是tokens=1,2*有什么区别呢?
其实差不多-号代表从几至几而逗号代表单一的, tokens=1,5就是代表第一列和第五列,而不是15.
*
号代表剩下的所有的列.:tokens=1,2*代表%%a为第一列,%%b为第二列,%%c代表后面所有的列.
for /f
不但可以循环文本内容还可以循环字符窜,:
::
例三: 复制内容到剪贴板
代码:

for /f "tokens=1-3 delims=,./ " %%a in ("111,222.333 444/555") do echo %%a %%b %%c
pause

只要将()里的字符串用引号扩起来,for就会把它当字符串来循环,而不是文本.

 

 

 

原创粉丝点击