目录
脚本命令:
1、@
2、echo
用法一:可以用它来显示信息!
用法二:可以直接编辑文本文件。例六:
3、::
4、pause
5、: 和 goto
6、% 暂时搁置。。。。。。。。因为for循环
1)%0 %1 %2 %3....%9 %*
2) %是个ESCAPE字符,通常将之译为转义字符。
3) for循环中 》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
4) %cd% 与 %~dp0 当前目录
7、if
1) 判断
2)存在判断
3)结果判断 errorlevel (1 ping 失败,0 ping 成功)
8、call
9、find
1)find "要查找的字符串" 要查找的文件,
2)大小写区分 添加 /i 不区分大小写
3)监测是否还有特定字符串 /v
4)统计某个字符串的行总共有多少 /c
5)在每行的行首显示行号 /n
6)find支持管道符号 | 多重过滤
7) 转义符号
8)find仅仅针对位于同一行上的字符串,不能查找跨行的字符块。
10、for、set、shift
11、for 详解
for语句的基本用法
12、延时 sleep timout
1)方法一
2)方法二
3)方法三 (验证失败,,,待核验)优点:时间精确,CPU占用低
13、del
14、choice
15、BAT批处理中的字符串处理详解(字符串截取)
批处理的本质,是一堆DOS命令按一定顺序排列而形成的集合。批处理,也称为批处理脚本,英文译为BATCH,批处理文件后缀BAT就取的前三个字母。
它的作用是让执行窗口中不显示它后面这一行的命令本身(多么绕口的一句话!)。
呵呵,通俗一点说,行首有了它的话,这一行的命令就不显示了。在例五中,首行的@echo off中,@的作用就是让脚本在执行时不显示后面的echo off部分。这下懂了吧?还是不太懂?没关系,看完echo命令简介,自然就懂了。
echo命令状态(off或on)
echo off 表示在批处理文件执行过程中,只显示结果,而不显示执行的命令:
在执行echo off之前,批处理的每一条命令都会在命令行中显示,而执行了echo off之后,则只显示执行的结果。
echo on 的作用很明显与echo off相反
echo aaaaaaaaaaa > temp.txt
echo bbbbbbbbbbb >> temp.txt
以上脚本内容的编辑方法是,直接是命令行输入,每行一回车。最后就会在当前目录下生成一个 temp.txt的文件,直接执行就会得到结果。
注释命令,在批处理脚本中和rem命令等效。后面的内容在执行时不显示,也不起任何作用。
暂停:是让当前程序进程暂停一下,并显示一行信息:请按任意键继续. . .
这2个命令分不开,少了哪个都会出错。
goto 是跳转命令,: 是一个标签。
当,程序运行到 goto 时,自动跳转到 : 定义的部分去执行了。
……
goto end
……
:end
1% 2% 3% 脚本就自动用用你的三个参数依次
set a=123 rem定义一个变量a 赋值为123
echo %a% 显示出变量a的值(如果不加% %系统会把a当字符处理了,不会当成变量的)
%0 批处理文件本身,包括完整的路径和扩展名,可以调用批处理自身,以达到批处理本身循环的目的,也可以复制文件自身等等。
%1 第一个参数
%9 第九个参数
%* 从第一个参数开始的所有参数 ???待补充
也就是说%不仅仅将与其相关的特定字符串转义并替换为特定字符串,而且自身也会被“脱逸”。而且类似于C语言中的转义字符"\",双%会转义并脱逸为单%,四%则脱为双%。
为什么批处理中用两个 %%,其实是编译器编译的时候要屏蔽一个%
%A 用在命令行中,如果你写到bat文件中,变量就要改写成%%A ,不然就会报错。
在早期的DOS版本中,%在命令行中不被视为转义字符,所以不会被转义和脱逸,所以当时无法在命令行直接引用环境变量。而使用for时,只需要一个%供for进行转义和脱逸就够了。在以后的命令解释器版本中,加入了命令行转义的支持(主要是环境变量的支持),但命令行for使用单%的传统仍然保留了下来。
而 cmd中的变量延迟替换是属于特殊的情况,但不违背以上的转义原则,只是for中的环境变量不再是常量了。
%cd% 与 %~dp0
当前目录%cd%
代表的是当前工作目录(current working directory,variable);%~dp0
代表的是当前批处理文件所在完整目录(the batch file's directory,fixed)。多个bat 文件执行时需要用到。%cd%
代表的是当前工作目录
a.bat 执行 b.bat 并执行 run.exe 如下:
现在e.bat
和f.bat
不在同一个盘符了,从e.bat
切换当前工作目录到f.bat
直接使用cd是不行的,必须要使用:
|
|
这个地方容易疏忽,切记不要犯错。
|
从目前我们的使用情况来看,尽量使用%~dp0
,不建议使用%cd%
,有其他需求除外。
if "%1"=="" goto usage
if "%1"=="/?" goto usage
if "%1"=="help" goto usage
if exist C:\Progra~1\Tencent\AD.gif del C:\Progra~1\Tencent\AD.gif
如果存在那些gif文件,就删除这些文件。
if not exist C:\Progra~1\Tencent\AD.gif exit
如果不存在那些gif文件则退出脚本。
实操:
if exist "%~dp0\temp123.apk" del "%~dp0\temp123.apk"
ERRORLEVEL是它的一个参数,翻译过来就是“错误返回码”的意思,它的作用是判断前一条命令的错误返回值,然后和定义的字符值进行比较,再决定进行什么动作.
IF %ERRORLEVEL% LEQ 1 goto okay
这里的LEQ表示“小于等于”,全部的比较参数如下:
EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
我的测试样例:
@echo off
: p
ping www.baidu.cn
IF ERRORLEVEL 1 goto aa
IF ERRORLEVEL 0 goto bb
:aa
echo 正在重启软件服务...
echo ping 失败。。。。。。
goto p
:bb
echo 继续ping中。。。
goto p
call命令用来从一个批处理脚本中调用另一个批处理脚本。
同一个目录下3个 .bat 文件。
在这里,"要查找的字符串"这个内容是必不可少的,引号也是必须的。
例如:find "bathome" d:\test.txt,表示在D盘根目录下的文本文件test.txt中查找含有 bathome 这一字符串的所有行。
find的结果将会有两种情况:
1、当文件中包含要查找的字符串时,将返回这个字符串所在位置的整行内容,具体格式为:第一行是"---------- ×××" (×××表示被查找的文件名,不包括引号对),第二行开始才出现包含字符串的整行内容;
2、当文件中没有出现要查找的字符串时,find的结果仅仅返回"---------- ×××" 这一行内容(×××表示被查找的文件名,不包括引号对)。
find /i "Abc" test.txt 表示不区分大小写,find "Abc" test.txt则严格区分字符大小写。
检测哪些行不含有特定的字符串
在字符串abcdef中,检测是否存在字符串abc:
echo abcdef|find "abc"
find "abc" test.txt|find "xyz",它表示在test.txt中查找同时存在字符串abc和字符串xyz的行
@echo off
find "adg" temp.txt | find "123" | find "456"
在前面,我们说过,在 find "要查找的字符串" 要查找的文件 这条命令语句中,引号是必须的,要是我们要查找的内容就是双引号本身,那又该怎么办?
答案很简单:把双引号本身先用双引号转义,再放到双引号对中,写成 find """" test.txt 的格式,如果要查找两个连续的双引号,则应该写成 find """""" test.txt。
与findstr命令相比,find的功能确实有限得多,仅仅因为不支持正则表达式这一点,就有不少人把它视为鸡肋,从而遭到无情的抛弃。
然而,find并非一无是处,凭借自己的独门绝技,在与findstr的竞争中,它挣得了一席之地。
这些独门绝技是什么呢?(感谢BatCoder的提醒和zqz0012005的补充)
1、统计含指定字符串的总行数。find /c "abc" test.txt可以统计test.txt中含有字符串abc的总行数,而findstr则没有直接提供该功能,需要配合for语句才能实现;
2、find可以读取Unicode格式的文本,而findstr则不行;
3、find可以过滤某些特殊字符,而findstr则不行,比如,我们在使用fsutil fsinfo drives语句查询磁盘分区的时候,如果想让盘符分行显示而不是显示在同一行上的时候(这在用for语句提取盘符的时候很有用),find可以大显身手,而findstr只能干瞪眼了,具体语句为: fsutil fsinfo drives|find /v ""
@echo off
for /? > for.txt
set /? > set.txt
shift /? >shift.txt
exit
执行后在当前路径下就生成for.txt、set.txt和shift.txt三个文件,里面分别记录了for命令、set命令和shift命令的帮助信息。
另一篇详解:
https://mp.csdn.net/postedit/86135229
在批处理中,for是最为强大的命令语句,它的出现,使得解析文本内容、遍历文件路径、数值递增/递减等操作成为可能;配合if、call、 goto等流程控制语句,更是可以实现脚本复杂的自动化、智能化操作;合理使用for语句,还能使代码大为简化,免除各位编写大量重复语句之苦。
正如色彩缤纷的七彩光芒是由红绿蓝三原色构成的一样,最复杂的for语句,也有其基本形态,它的模样是这样的:
在cmd窗口中:
FOR %variable IN (set) DO command [command-parameters]
在批处理文件中:
FOR %%variable IN (set) DO command [command-parameters]
具体例子:
For %i in (1 2 3) do @echo %i
https://jingyan.baidu.com/article/4b07be3c907e6f48b280f36d.html
延时单位秒
timeout /T 10
/T timeout 指定等候的秒数。有效范围从 -1 到 99999 秒。
/NOBREAK 忽略按键并等待指定的时间。 按键无效
timeout /T 10 /NOBREAK
使用vbs的sleep方法来实现延时(等待)。优点:能在旧系统中(例如xp)使用,且延时精度较高(1毫秒)缺点:代码行数较多,3行。
@echo off
echo wscript.sleep 5000>sleep.vbs
start /wait sleep.vbs
start gdh.txt
del /f /s /q sleep.vbs
@echo off
choice /t 5 /d y /n >nul
start gdh.txt
del /f /s /q *.TxT 除了有隐藏属性和系统属性的txt文件外
F 强制删除只读文件
S 从所有子目录删除指定文件
Q 安静模式删除全局通配符时,不要求确认A 根据属性选择要删除的文件
属性说明r 只读a 存档s 系统
h 隐藏前缀表明非
D:\batProduct>rd /?
删除一个目录。
RMDIR [/S] [/Q] [drive:]path
RD [/S] [/Q] [drive:]path
/S 除目录本身外,还将删除指定目录下的所有子目录和
文件。用于删除目录树。
/Q 安静模式,带 /S 删除目录树时不要求确认
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。"
D:\>choice
[Y,N]?Y
https://www.jb51.net/article/52744.htm
@echo off
rem 根据当前日期获取,年月日串
set yyyy=%date:~,4%
set mm=%date:~5,2%
set day=%date:~8,2%
set "YYYYmmdd=%yyyy%%mm%%day%"
:: 去掉右空格
:: Code by JM 2006-11-28 CMD@XP
:: 出处:http://www.cn-dos.net/forum/viewthread.php?tid=25172
:intercept
if "%YYYYmmdd:~-1%"==" " set "YYYYmmdd=%YYYYmmdd:~0,-1%"&goto intercept
echo "YYYYmmdd--%YYYYmmdd%over"
rem 根据当前时间获取,时分秒串
set hh=%time:~0,2%
set mi=%time:~3,2%
set ss=%time:~6,2%
set "hhmiss=%hh%%mi%%ss%"
set "hhmiss=%hhmiss: =0%"
echo "time%Time%over"
echo hhmiss%hhmiss%over
rem 把时间串中的:替换为0
set "hhmiss=%hhmiss::=0%"
rem 把时间串中的空格替换为0
set "hhmiss=%hhmiss: =0%"
rem 根据日期时间生成文件名称,中间以HH区分日期和时间部分
set "filename=%YYYYmmdd%HH%hhmiss%.rar"
echo %filename%
pause
未完待续。。。
参考文章:
https://www.cnblogs.com/DswCnblog/p/5435300.html
https://baike.baidu.com/item/%E6%89%B9%E5%A4%84%E7%90%86/1448600?fr=aladdin#5_2
https://baike.baidu.com/item/%E6%89%B9%E5%A4%84%E7%90%86/1448600?fr=aladdin
https://zhidao.baidu.com/question/349459603.html
https://www.jb51.net/article/7525.htm
https://jingyan.baidu.com/article/dca1fa6f1ac0aaf1a5405246.html
https://zhidao.baidu.com/question/283705425.html
https://www.jb51.net/article/105325.htm
https://www.w3cschool.cn/dosmlxxsc1/wvqyr9.html