在windows条下有时候需要批量执行一些内容,比如开机后常用软件的批量打开等,使用bat能够方便快捷的解决类似问题。所以,今天下决心来了解下bat脚本语法及逻辑,希望能用到更多的场景中去,目的是:能用工具解决的,尽量不用人工处理。
简单的说,批处理的作用就是自动的连续执行多条命令。
2、这里先讲一个最简单的应用:在启动wps软件时,每次都必须执行(>前面内容表示DOS提示符):
bat (批处理文件类型):批处理文件,在DOS和Windows(任意)系统中使用,.bat文件是可执行文件,由一系列命令构成,其中可以包含对其他程序的调用。
这个文件的每一行都是一条DOS命令(大部分时候就好像我们在DOS提示符下执行的命令行一样),你可以使用DOS下的Edit或者Windows的记事本(notepad)等任何文本文件编辑工具创建和修改批处理文件。
批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理,通常被认为是一种简化的脚本语言,它应用于DOS和Windows系统中。批处理文件的扩展名为bat
或cmd。目前比较常见的批处理包含两类:DOS批处理和PS批处理。PS批处理是基于强大的图片编辑软件Photoshop的,用来批量处理图片的脚本;而DOS批处理则是基于DOS命令的,用来自动地批量地执行DOS命令以实现特定操作的脚本。更复杂的情况,需要使用if、for、goto等命令控制程式的运行过程,如同C、Basic等高级语言一样。如果需要实现更复杂的应用,利用外部程式是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件。批处理程序虽然是在命令行环境中运行,但不仅仅能使用命令行软件,任何当前系统下可运行的程序都可以放在批处理文件中运行。
批处理中的变量基本上是万能的,可以储存各种各样的数据,不过用来计算时你会发现变量类型转为了int,数值的极端范围为[-,],如果不拿来计算的话,似乎数万位也是可以的
批处理的变量命名没有什么限制,不过建议命名还是遵守标准的命名方法,不然像这样的代码是很蛋疼的。
正是因为变量的名称是可以自由调配的:数字、字母、甚至汉字都可以变成变量名样。
3、变量的扩展(使用变量)
扩展,你可以理解为显示出这个的值,如果你想要使用这个变量的值一般情况下都要扩展
扩展方式:%变量%或!变量!
其中!变量!是延迟扩展,需要加上SetLocal EnableDelayedExpansion语句才能够实现,延迟扩展对于新手来说是一个很难理解的东西,就这么说吧,当你的变量在一个语句的内部受到了改变,而在这个改变之后又要输出,那么你必须要延迟扩展,这个牵扯到了奇奇怪怪的预处理机制,不详解了。
用连接符号连起来的语句,if,for和它们后面括号内的内容都是属于一个语句
参数在批处理的表达是%0,%1,%2....%9 ,以及全部参数%*(不包括%0)
%0的初始量是批处理本身路径,类似%~f0
一般你只能取前九个参数,除非你使用%*
shift命令允许你获取后面的参数
shift 会使%0变成%1,%1变成%2……%9变成原来的第10个参数(不推荐)
一般使用shift /1,将会从%1开始替换,保留原%0
注意:call标签时参数也是可用的,而且当返回时参数将变回原来的
1、ECHO,显示及关闭回显,输出信息及空行。
@echo on :打开回显,显示执行脚本的命令内容。
echo:后面不接内容,表示输出空行。
2、PAUSE,暂停批处理程序,并显示以下消息:请按任意键继续. . .
此命令不再做描述,如标题所示。
此命令不再做描述,如标题所示。
在批处理文件或 CONFIG.SYS 里加上注解或说明。
这个命令同样没什么好说的,用法就是rem 注释
PS:其实可以用"::"代替"REM",可以提高执行速度,不过REM的兼容性更好,我还是建议大家用rem注释
1)给变量赋值(撤销)
上面的例子中,一个是给变量赋值,一个是撤销变量的值
2)等待用户输入数据(开关/P)
3)计算(开关/A)
4)显示当前已定义变量
1)IF的第一种用法,比较字符串
通过set /p和if可以实现一个简单的密码判断,当然这个密码判断可以很轻易地被破解,仔细动脑筋想一想,该怎么破解呢.
不过这个密码判断尚有不足之处,假如我们什么都不输入直接回车,便会提示错误,那该怎么办呢?很简单,只要加上双引号(其它的符号也行)就行了=>if "%PW%"=="bat"
2)IF的第二种用法,比较数字
3)IF的第三种用法,检测文件(夹)是否存在
4)IF的第四种用法,检测变量是否被定义
标签必须单独一行,并且以冒号打头。
如果命令扩展名被启用,GOTO 会如下改变:
GOTO 命令现在接受目标标签 :EOF,这个标签将控制转移到当前批脚本文件的结尾。不定义就退出批脚本文件,这是一个容易的办法。有关能使该功能有用的 CALL 命令的扩展名描述,请键入CALL /?。label是什么?这可不是命令label,它指的是标签,标签是啥?见例子。
这是一个更加完整的密码判断,仔细阅读并执行这行代码,现在你知道标签是什么了吗,没错,那个:yes就是标签了!
关掉回显以后你有没有发现什么?没错,标签所在的那一行没有被执行,这就是为什么::比rem更快的原因了,但是标签不能被使用在一个语句的内部,主要就是被括号括起来的语句(是的,被括号括起来的语句被看作一个整体),因此::的兼容性没有rem那么好
附:"::"其实就是不规范的标签名...
这段代码会显示当前文件夹下所有的sql文件
如果集仅为一个单点(.)字符,则枚举该目录树。
枚举显示F:\Store\工作 目录下的所有目录及文件夹,包括子文件夹里的。
delims是个啥玩意儿?其实这就是分割符的设定,默认以空格为分隔符,你可以将分隔符设置成其他的,你的文本就不会被分割了,delims同样支持多个分隔符,格式delims=第一个分隔符,第二个分隔符,第三个分隔符。
啊哈,还有一个skip和eol,skip表示忽略前几行,比如skip=10表示忽略这个文本的前十行,我这个文本只有4行,如果你加上skip=10的话就什么都不会输出了
eol表示忽略以某个符号开头的行,比如eol=A,当某一行的开头是A的时候,这一行就不会被处理,不过支持设置一个符号
2 文件共享冲突阻止备份完成
4 由于致命的错误使备份操作中止
2 用户通过ctrl-c中止比较操作
3 由于致命的错误使比较操作中止
2 用户通过ctrl-c结束拷贝操作
3 因致命的处理错误使盘拷贝中止
4 预置错误阻止拷贝操作
3 用户通过ctrl-c中止格式化处理
4 因致命的处理错误使格式化中止
2 用户通过ctrl-c中止拷贝操作
4 预置错误阻止文件拷贝操作
5 拷贝过程中写盘错误
开启了echo off能够起到隐藏命令的效果,而@同样能起到这个效果,只不过需要在每条命令前面都加一个...
可以把一个命令写成多行哦
复制上面的命令,执行结果是什么?这就是分行符的作用
当我们试图输出一个&的时候,我们会发现输出不了...因为它被当成分行符处理了
这时就要请出转义符^了,它可以剥夺后面第一个符号的特殊地位,变为普通符号(这其实是一个很神奇的功能,之所以神奇...赘不详述)
另外,当存在a变量(前面set /p a=或set a=给a赋值了)想要输出%a%,一是可以用转义符^,还可以:
这样既可将两个百分号识别为一个,起到了转义的作用
还有些特殊情况不需要转义:
用引号括起来可以起到一定的转义的作用,包括set "a=a的值"等
但特别特殊的情况比如获取%1时存在转义符很难处理,没办法正常引用
3)*,?-通配符
啥叫通配符?举个例子吧,*.jpg表示所有的jpg,*表示所有文件.现在你明白了吗? 那"?"有什么用,*可以为任意字符,但?只表示一个字符,比如?.jpg只表示文件名只有一个的jpg文件,比如1.jpg,比.jpg什么
括起来的语句是一个整体
> 创建一个文件
@ 前缀字符.表示执行时本行在cmd里面不显示, 可以使用 echo off关闭显示
, 和空格一样的缺省分隔符号.
; 注释,表示后面为注释
& Usage:第一条命令 & 第二条命令 [& 第三条命令...] 用这种方法可以同时执行多条命令,而不管命令是否执行成功
&& Usage:第一条命令 && 第二条命令 [&& 第三条命令...]当碰到执行出错的命令后将不执行后面的命令,如果一直没有出错则一直执行完所有命令;
|| Usage:第一条命令 || 第二条命令 [|| 第三条命令...]当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令;
eol=c - 指一个行注释字符的结尾(就一个)
skip=n - 指在文件开始时忽略的行数。
delims=xxx - 指分隔符集。这个替换了空格和跳格键的默认分隔符集。
选择开关/i则不区分字符串大小写;选择not项,则对判断结果进行逻辑非。