批处理bat学习总结

目录

脚本命令:

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就取的前三个字母。

脚本命令:

1、@

它的作用是让执行窗口中不显示它后面这一行的命令本身(多么绕口的一句话!)。

呵呵,通俗一点说,行首有了它的话,这一行的命令就不显示了。在例五中,首行的@echo off中,@的作用就是让脚本在执行时不显示后面的echo off部分。这下懂了吧?还是不太懂?没关系,看完echo命令简介,自然就懂了。
 

2、echo

用法一:可以用它来显示信息!

    echo命令状态(off或on)

    echo  off 表示在批处理文件执行过程中,只显示结果,而不显示执行的命令:

    在执行echo off之前,批处理的每一条命令都会在命令行中显示,而执行了echo off之后,则只显示执行的结果。

    echo  on 的作用很明显与echo off相反

用法二:可以直接编辑文本文件。例六:

echo aaaaaaaaaaa > temp.txt
echo bbbbbbbbbbb >> temp.txt

以上脚本内容的编辑方法是,直接是命令行输入,每行一回车。最后就会在当前目录下生成一个 temp.txt的文件,直接执行就会得到结果。

3、::

注释命令,在批处理脚本中和rem命令等效。后面的内容在执行时不显示,也不起任何作用。

4、pause

暂停:是让当前程序进程暂停一下,并显示一行信息:请按任意键继续. . .

5、: 和 goto

这2个命令分不开,少了哪个都会出错。

goto 是跳转命令,: 是一个标签。

当,程序运行到 goto 时,自动跳转到 : 定义的部分去执行了。 

……

goto end

……

:end

6、% 暂时搁置。。。。。。。。因为for循环

1%  2%  3% 脚本就自动用用你的三个参数依次

1)%0  %1  %2 %3....%9 %* 

set a=123 rem定义一个变量a 赋值为123

echo %a%  显示出变量a的值(如果不加% %系统会把a当字符处理了,不会当成变量的)

批处理bat学习总结_第1张图片

%0 批处理文件本身,包括完整的路径和扩展名,可以调用批处理自身,以达到批处理本身循环的目的,也可以复制文件自身等等。

%1 第一个参数

%9 第九个参数
%* 从第一个参数开始的所有参数  ???待补充

2) %是个ESCAPE字符,通常将之译为转义字符。

也就是说%不仅仅将与其相关的特定字符串转义并替换为特定字符串,而且自身也会被“脱逸”。而且类似于C语言中的转义字符"\",双%会转义并脱逸为单%,四%则脱为双%。

 

3) for循环中  》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

为什么批处理中用两个 %%,其实是编译器编译的时候要屏蔽一个%

%A 用在命令行中,如果你写到bat文件中,变量就要改写成%%A ,不然就会报错。

在早期的DOS版本中,%在命令行中不被视为转义字符,所以不会被转义和脱逸,所以当时无法在命令行直接引用环境变量。而使用for时,只需要一个%供for进行转义和脱逸就够了。在以后的命令解释器版本中,加入了命令行转义的支持(主要是环境变量的支持),但命令行for使用单%的传统仍然保留了下来。

  而 cmd中的变量延迟替换是属于特殊的情况,但不违背以上的转义原则,只是for中的环境变量不再是常量了。

 

4) %cd% 与 %~dp0 当前目录

  • %cd%代表的是当前工作目录(current working directory,variable);
  • %~dp0代表的是当前批处理文件所在完整目录(the batch file's directory,fixed)。多个bat 文件执行时需要用到。

%cd%代表的是当前工作目录

a.bat 执行 b.bat  并执行 run.exe   如下:

现在e.batf.bat不在同一个盘符了,从e.bat切换当前工作目录到f.bat直接使用cd是不行的,必须要使用:

 

cd /d "%~dp0"

这个地方容易疏忽,切记不要犯错。

// directory structure

// c:

// -program

//  -f.bat

// d:

// -e.bat

// plan A

// change the current working directory

// e.bat

cd "%~dp0"

call "c:\program\f.bat"

// f.bat

cd "%~dp0"

"%cd%\run.exe"

从目前我们的使用情况来看,尽量使用%~dp0,不建议使用%cd%,有其他需求除外。

批处理bat学习总结_第2张图片

7、if

1)  判断 

if "%1"=="" goto usage

if "%1"=="/?" goto usage

if "%1"=="help" goto usage

2)存在判断

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"

3)结果判断 errorlevel  (1 ping 失败,0 ping 成功)

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

批处理bat学习总结_第3张图片

 

8、call

call命令用来从一个批处理脚本中调用另一个批处理脚本。

同一个目录下3个 .bat 文件。

批处理bat学习总结_第4张图片

 

9、find

1)find "要查找的字符串" 要查找的文件

在这里,"要查找的字符串"这个内容是必不可少的,引号也是必须的

例如:find "bathome" d:\test.txt,表示在D盘根目录下的文本文件test.txt中查找含有 bathome 这一字符串的所有行。

批处理bat学习总结_第5张图片

 

批处理bat学习总结_第6张图片

find的结果将会有两种情况:

  1、当文件中包含要查找的字符串时,将返回这个字符串所在位置的整行内容,具体格式为:第一行是"---------- ×××" (×××表示被查找的文件名,不包括引号对),第二行开始才出现包含字符串的整行内容;
  2、当文件中没有出现要查找的字符串时,find的结果仅仅返回"---------- ×××" 这一行内容(×××表示被查找的文件名,不包括引号对)。

2)大小写区分   添加 /i 不区分大小写

find /i "Abc" test.txt 表示不区分大小写,find "Abc" test.txt则严格区分字符大小写。

3)监测是否还有特定字符串  /v

检测哪些行不含有特定的字符串

批处理bat学习总结_第7张图片

4)统计某个字符串的行总共有多少  /c

批处理bat学习总结_第8张图片

 

5)在每行的行首显示行号 /n

批处理bat学习总结_第9张图片

6)find支持管道符号 |  多重过滤

在字符串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"

7) 转义符号 

在前面,我们说过,在 find "要查找的字符串" 要查找的文件 这条命令语句中,引号是必须的,要是我们要查找的内容就是双引号本身,那又该怎么办?

  答案很简单:把双引号本身先用双引号转义,再放到双引号对中,写成 find """" test.txt 的格式,如果要查找两个连续的双引号,则应该写成 find """""" test.txt。

 

8)find仅仅针对位于同一行上的字符串,不能查找跨行的字符块。

与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 ""

 

10、for、set、shift

@echo off

for /? > for.txt

set /? > set.txt

shift /? >shift.txt

exit

执行后在当前路径下就生成for.txt、set.txt和shift.txt三个文件,里面分别记录了for命令、set命令和shift命令的帮助信息。

 

11、for 详解

另一篇详解:

https://mp.csdn.net/postedit/86135229

在批处理中,for是最为强大的命令语句,它的出现,使得解析文本内容、遍历文件路径、数值递增/递减等操作成为可能;配合if、call、 goto等流程控制语句,更是可以实现脚本复杂的自动化、智能化操作;合理使用for语句,还能使代码大为简化,免除各位编写大量重复语句之苦。

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

批处理bat学习总结_第10张图片

12、延时 sleep timout

https://jingyan.baidu.com/article/4b07be3c907e6f48b280f36d.html

1)方法一

延时单位秒

timeout /T 10  

/T timeout 指定等候的秒数。有效范围从 -1 到 99999 秒。

/NOBREAK 忽略按键并等待指定的时间。 按键无效

timeout /T 10 /NOBREAK

2)方法二

使用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

3)方法三 (验证失败,,,待核验)优点:时间精确,CPU占用低

@echo off
choice /t 5 /d y /n >nul
start gdh.txt

13、del   rd

del /f /s /q *.TxT        除了有隐藏属性和系统属性的txt文件外

F 强制删除只读文件

S 从所有子目录删除指定文件

Q 安静模式删除全局通配符时,不要求确认A 根据属性选择要删除的文件

属性说明r 只读a 存档s 系统

h 隐藏前缀表明非

 

rd

D:\batProduct>rd /?
删除一个目录。

RMDIR [/S] [/Q] [drive:]path
RD [/S] [/Q] [drive:]path

    /S      除目录本身外,还将删除指定目录下的所有子目录和
            文件。用于删除目录树。

    /Q      安静模式,带 /S 删除目录树时不要求确认

 

14、choice

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

15、BAT批处理中的字符串处理详解(字符串截取)

https://www.jb51.net/article/52744.htm

16、获取时间生成文件

@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

你可能感兴趣的:(脚本)