学习batch
一些详细例子见:D:\Github\Storage\batch\study.bat
1、百度百科
批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理,通常被认为是一种简化的脚本语言,它应用于DOS和Windows系统中。批处理文件的扩展名为bat 。目前比较常见的批处理包含两类:DOS批处理和PS批处理。PS批处理是基于微软的强大的PowerShell的,用来批量处理一些任务的脚本;而DOS批处理则是基于DOS命令的,用来自动地批量地执行DOS命令以实现特定操作的脚本。更复杂的情况,需要使用if、for、goto等命令控制程式的运行过程,如同C、Basic等高级语言一样。如果需要实现更复杂的应用,利用外部程式是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件。批处理程序虽然是在命令行环境中运行,但不仅仅能使用命令行软件,任何当前系统下可运行的程序都可以放在批处理文件中运行。 有些人认为批处理语言的含义要比上面的描述更广泛,还包括许多软件自带的批处理语言,如 Microsoft Office、Visual Studio、Adobe Photoshop 所内置的批处理语言的功能,用户可通过它们让相应的软件执行自动化操作(例如调整某个资料夹所有 PSD 图档的解析度)。 而这类批处理语言也大多提供把一系列操作录制为批处理文件的功能,这样用户不必写程式就能得到批处理程序。
批处理文件具有.bat或者.cmd的扩展名。
2、注释和暂停命令
::和rem还是有区别的,当关闭回显时,rem和::后的内容都不会显示。但是当打开回显时,rem后的内容会显示出来,然而::后的内容仍然不会显示。
暂停命令。运行 Pause 命令时,将显示下面的消息:
Press any key to continue. . .(或:请按任意键继续. . .)
3、没有理解的一句话
在批处理文件的开头,通常有: @echo off 原因是"@"可以将本行的命令关闭回显,搭配"echo off"就可以不显示"echo off"的回显了。
回显,就是显示正在执行的批处理命令及执行的结果等。
通过百度百科回显这一词终于明白了。
D:\Github\Storage\batch>Rem 输出hello world
D:\Github\Storage\batch>echo hello world
hello world
D:\Github\Storage\batch>set /p "input=>"
>well good
D:\Github\Storage\batch>echo 您输入的是well good
您输入的是well good
D:\Github\Storage\batch>pause
请按任意键继续. . .
hello world
>well good
您输入的是well good
请按任意键继续. . .
4、删除文件夹命令
rmdir /s/q test 其中: /s 是代表删除所有子目录跟其中的档案。 /q 是不要它在删除档案或目录时,不再问我 Yes or No 的动作。
5、各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
5-1、%0
类似于C++程序main函数中argv变量数组,类比可以知道,argv[0]表示exe程序的文件名,argv[1]表示启动程序的第1个参数,后面依次类推。而在批处理程序中%0表示这个批处理程序的文件名,%1表示调用这个批处理时传入的第1个参数,%2表示调用这个批处理时传入的第2个参数,最大可以到%9。
5-2、%i
不是批处理文件中的变量,只能用于cmd命令行下的for循环中,在命令行中for循环的语法是for %variable in (set) do command [command-parameters],其中的variable只能是单字母或者非特殊含义的字符。
5-3、%ii
也是for循环中特有的,与%i相对,属于批处理程序的用法。variable同样只能是单个字母或者普通字符,至于为什么同样含义的变量在批处理中要多加一个%,至今也没有找到官方的说法,查找MSDN也没有发现说明。 区别:
在cmd窗口中:for %I in (command1) do command2
在批处理文件中:for %%I in (command1) do command2
即,一个是在dos窗口的用法,一个是bat脚本里面的用法,实际效果一样。
5-4、var(set命令)
和Lua、Python等语言中的变量长得挺像,实际上变量的这种形式很“短暂”,一般只能出现在给变量赋值的时候,也就是set语句之后,作为左值接受赋值时,或者在等号右测可评估的表达式中。
5-5、!var!
这是最后一种常见的变量形式,同时也是一种不太好理解的形式,需要记住一点,这种变量与延迟环境变量扩展有关,如果没开启延迟环境变量扩展,那么!var!就是一个普通的包含5个字母的字符串,如果开启了延迟环境变量扩展,那么它就是变量var的实际值,可能说到这有的人会产生疑惑,引用变量var的值不是使用%var%吗?那么在开启延迟环境变量扩展的情况下,%var%和!var!有什么区别呢? 看到结果的时候是不是再次怀疑了世界,在打印变量var1之前明明重新赋值了120,为什么打印出来还是110呢?其实这是批处理脚本执行机制导致的,它会按行执行,在执行之前会先预处理,当执行set var1=110之后,变量var1变成了110,在执行set var1=120&echo %var1%之前先预处理,将变量%var1%替换成了110,然后语句变成了set var1=120&echo 110,所以就得到了我们上面测试的结果。
想要解决这个问题就需要开启延迟环境变量扩展,语句为setlocal enabledelayedexpansion,然后将引用变量的形式由%var1%改为!var1!即可。
这回输出的结果符合预期了,开启了延迟环境变量扩展之后,!var!形式的变量在用之前才会评估确切的值,这是一个知识点,也是一个易错点,特别是在for循环中要格外注意,因为for循环语句的循环体括号中,所有的操作被看成是同一行,所以经常会用到延迟环境变量扩展。
6、for循环语句
跳格键:一般都在主键盘区最左侧的Tab键。
Tab键是tabulator(制表键)的缩写,由此可以看出,它的最原始用处是用于绘制表格,准确地讲,是用来绘制没有线条的表格——因为早期的电脑不像现在的图形界面可以用鼠标来绘制,通常都是用键盘控制字符的对齐,为了使各个列都可以很方便的对齐,在制表时,就需要频繁地使用到这个键,这也是它的名称的由来。
- for、in和do是for语句的关键字,它们三个缺一不可;
- %%I是for语句中对形式变量的引用,即使变量l在do后的语句中没有参与语句的执行,也是必须出现的;
- in之后,do之前的括号不能省略;
- command1表示字符串或变量,command2表示字符串、变量或命令语句;
- for语句的形式变量I,可以换成26个字母中的任意一个,这些字母会区分大小写,也就是说,%%I和%%i会被认为不是同一个变量;形式变量I还可以换成其他的字符,但是,为了不与批处理中的%0~%9这10个形式变量发生冲突,请不要随意把%%I替换为%%0~%%9中的任意一个;
- in和do之间的command1表示的字符串或变量可以是一个,也可以是多个,每一个字符串或变量,我们称之为一个元素,每个元素之间,用空格键、跳格键、逗号、分号或等号分隔;
1)搜索当前目录下有哪些文件?
@echo off
for %%i in (*.*) do echo "%%i"
pause
2)搜索当前目录下所有的文本文件?
@echo off
for %%i in (*.txt) do echo "%%i"
pause
参数说明
关于:for命令可以带参数或不带参数,带参数时支持以下参数:/d /l /r /f。
- 参数 /d (参数只能显示当前目录下的目录名字)
- 参数 /R (搜索指定路径及所有子目录中与set相符合的所有文件)
- 参数 /L (该集表示以增量形式从开始到结束的一个数字序列。可以使用负的 Step)
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,3,5,7,9
- 参数 /F (使用文件解析来处理命令输出、字符串及文件内容。) 详细见:C:\Windows\System32\cmd.exe\study_for.bat
7、参数的大小写区别
参数和变量没有大小写区别,经过上面的说明后可能只有for循环中变量会有大小写区别。
C:\Users\User>CD /D D:
D:\>CD /d c:
C:\Users\User>cd /d d:
D:\>