脚本往往是用来批处理等一些简单的操作等等,因此脚本的编写往往比较简单;这里介绍Window环境下的脚本:Batch(批处理),可以用于嵌入式批处理一些中间文件 或者 是用来做一些平常处理的快捷操作
一、脚本知识
批处理(Batch),也称为批处理脚本。批处理就是对某对象进行批量的处理,通常被认为是一种简化的脚本语言,它应用于DOS和Windows系统中。批处理文件的扩展名为bat 。
脚本(Script):是一种批处理文件的延伸,是一种纯文本保存的程序。
简介:脚本简单地说就是一条条的文字命令,这些文字命令是可以看到的(如可以用记事本打开查看、编辑),脚本程序在执行时,是由系统的一个解释器,将其一条条的翻译成机器可识别的指令,并按程序顺序执行。因为脚本在执行时多了一道翻译的过程,所以它比二进制程序执行效率要稍低一些。
常见的脚本语言有:Scala、JavaScript,VBScript,ActionScript,MAX Script,ASP,JSP,PHP,SQL,Perl,Shell,python,Ruby,JavaFX,Lua,AutoIt等。
Makefile:类似shell脚本;Linux的编译程序通过make命令,编译大文件(需要批量处理文件),则需用到Makefile文件
1.1 题外话
一个C/C++文件要经过预处理(preprocesing)、编译(compilation)、汇编(assembly)、链接(linking) 等四步才能变成可执行文件(实际还是机器码)。在日常交流中通常使用“编译”统称这四个步骤。
.s
文件、.S
文件和.o
文件的区别
.s
:汇编语言源程序;操作: 汇编
在后期阶段不会再进行预处理操作了,所以我们不能在其内写上预处理语句..S
:汇编语言源程序;操作: 预处理 + 汇编
会进行预处理、汇编等操作,所以我们可以在这里面加入预处理的命令。编译器在编译汇编大 S 文件之前会进行预处理操作..o
文件:只编译不链接形成.o文件.
里面包含了对各个函数的入口标记,描述,当程序要执行时还需要链接(link).链接就是把多个.o文件链成一个可执行文件。如 GCC 编译器就可以指定 -c选项进行输出。打开是乱码。.dis
文件:反汇编文件
.s
文件一般是 .c
文件经过汇编器处理后的输出。 如 GCC 编译器就可以指定 -S
选项进行输出,且是经过预处理器处理后的了。
例如:gcc -S test.c
—–生成.s结尾的文件,打开为汇编代码
例如:gcc -c test.c
—–结果生成.o文件.
二、常见批处理指令
这里只介绍一些小白入门的bat指令,不会太过深入,只是用来简化用电脑时的平常处理;Ps:cmd命令是不区分大小写的
2.1 rem 和 ::
REM
,为注释命令,一般用来给程序加上注解,该命令后的内容不被执行,但能回显;::
,为注释命令,但后面字符行在执行时不会回显
2.2 echo 和 @
这里编写一个.bat
文件作为举例:
1 | @echo off |
- 如上面源码所示
- 修改文件内容,将其中的@ 符号去掉
- 继续修改文件内容,将第一条命令注释掉(::)
总结:@echo off表示执行了这条命令后关闭所有命令(包括本身这条命令)的回显。echo off
命令则表示关闭其他所有命令(不包括本身这条命令)的回显;@
的作用就是关闭紧跟其后的一条命令的回显
2.3 pause
如果你自己编写的.bat文件,双击打开,出现闪退;原因:执行速度很快,执行完之后,自行关闭;
解决办法:在最后面一行加上 pause
pause
,停止系统命令的执行并显示下面的内容;最常见的就是:请按任意键继续. . .
不显示请按任意键继续. . .
的方法:pause >nul
显示其他提示语的方法:echo 其他提示语 & pause >nul
2.4 title
title
,用于设置cmd窗口的标题title 新标题
可以看到cmd窗口的标题栏变了
2.5 mode
mode
,配置系统设备
这里就不详细讲解,有兴趣的话,可以直接help mode
查看;下面举一个控制窗口大小的例子:
1 | @echo off |
2.6 start
批处理中调用外部程序的命令(该外部程序在新窗口中运行,批处理程序继续往下执行,不理会外部程序的运行状况),如果直接运行外部程序则必须等外部程序完成后才继续执行剩下的指令
例:
- 调用图形界面打开D盘
start explorer d:</code>
- 启动一个新的cmd窗口并在其内执行命令
start cmd /k echo Hello, World!
2.7 cd
同一分区切换:cd [盘符][路径]
不同分区切换:cd /d [盘符][路径]
Ps: 可以用 echo %cd%
查看当前路径
2.8 dir
dir
:获取某个文件夹下所有的文件名及扩展;详细的命令用help
查看,下面举常见例子
dir /a
显示当前目录中的文件和子目录,包括隐藏文件和系统文件dir c: /a:d
显示 C 盘当前目录中的目录dir c: /a:-d
显示 C 盘根目录中的文件dir c:" /b/p
/b只显示文件名,/p分页显示c:\dir /s /q /a *.exe
dir *.exe /s
查找当前目录(包括子目录)下所有的exe文件c:\dir /q /a *.exe
查找当前目录下以a开头的exe文件
2.9 del
要知道区别,就要看DEL命令参数
del d:"test.txt
删除指定文件,不能是隐藏、系统、只读文件del /q/a/f d:"temp"*.*
删除 d:”temp 文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录del /q/a/f/s d:"temp"*.*
删除 d:”temp 及子文件夹里面的所有文件,包括隐藏、只读、系统文件,不包括子目录
3.0 详细的CMD命令
另外详细的CMD命令,可以看这位博主的Windows CMD命令大全
三、批处理中的系统变量
%ALLUSERSPROFILE%
本地 返回“所有用户”配置文件的位置。%APPDATA%
本地 返回默认情况下应用程序存储数据的位置。%CD%
本地 返回当前目录字符串。%CMDCMDLINE%
本地 返回用来启动当前的 Cmd.exe 的准确命令行。%CMDEXTVERSION%
系统 返回当前的“命令处理程序扩展”的版本号。%COMPUTERNAME%
系统 返回计算机的名称。%COMSPEC%
系统 返回命令行解释器可执行程序的准确路径。%DATE%
系统 返回当前日期。使用与 date /t 命令相同的格式。由 Cmd.exe 生成。有关date 命令的详细信息,请参阅 Date。%ERRORLEVEL%
系统 返回上一条命令的错误代码。通常用非零值表示错误。%HOMEDRIVE%
系统 返回连接到用户主目录的本地工作站驱动器号。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。%HOMEPATH%
系统 返回用户主目录的完整路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。%HOMESHARE%
系统 返回用户的共享主目录的网络路径。基于主目录值而设置。用户主目录是在“本地用户和组”中指定的。%LOGONSERVER%
本地 返回验证当前登录会话的域控制器的名称。%NUMBER_OF_PROCESSORS%
系统 指定安装在计算机上的处理器的数目。%OS%
系统 返回操作系统名称。Windows 2000 显示其操作系统为 Windows_NT。%PATH%
系统 指定可执行文件的搜索路径。%PATHEXT%
系统 返回操作系统认为可执行的文件扩展名的列表。%PROCESSOR_ARCHITECTURE%
系统 返回处理器的芯片体系结构。值:x86 或 IA64 基于Itanium%PROCESSOR_IDENTFIER%
系统 返回处理器说明。%PROCESSOR_LEVEL%
系统 返回计算机上安装的处理器的型号。%PROCESSOR_REVISION%
系统 返回处理器的版本号。%PROMPT%
本地 返回当前解释程序的命令提示符设置。由 Cmd.exe 生成。%RANDOM%
系统 返回 0 到 32767 之间的任意十进制数字。由 Cmd.exe 生成。%SYSTEMDRIVE%
系统 返回包含 Windows server operating system 根目录(即系统根目录)的驱动器。%SYSTEMROOT%
系统 返回 Windows server operating system 根目录的位置。%TEMP%
和 %TMP%
系统和用户 返回对当前登录用户可用的应用程序所使用的默认临时目录。有些应用程序需要TEMP,而其他应用程序则需要 TMP。%TIME%
系统 返回当前时间。使用与 time /t 命令相同的格式。由 Cmd.exe 生成。有关time 命令的详细信息,请参阅 Time。%USERDOMAIN%
本地 返回包含用户帐户的域的名称。%USERNAME%
本地 返回当前登录的用户的名称。%USERPROFILE%
本地 返回当前用户的配置文件的位置。%WINDIR%
系统 返回操作系统目录的位置。
举例,如下:
第一种方法显示日期星期及时间精确到毫秒
1
2
3@echo off
echo %date%%time%
pause第二种方法显示日期及时间精确到秒
1
2
3@echo off
echo %date:~0,4%年%date:~5,2%月%date:~8,2%日%time:~0,8%
pause
四、常见的技巧和情况
4.1 不显示代码执行期间的各种提示信息
很多时候,为了使得屏幕上不出现无关的信息,我们需要屏蔽掉命令执行过程中产生的一些提示,有时候是屏蔽掉出错信息,有时候是为了屏蔽成功执行命令的信息,有时候两者都需要屏蔽,那么,我们可以把各种提示信息重定向到空设备中去,具体的代码是:
① 如果要屏蔽成功执行命令的信息,请在语句的最后加上代码 >nul。比如 copy a.txt d:\test>nul
② 如果要屏蔽出错信息,请在语句最后加上代码 2>nul,需要注意的是,数字2前必须带空格。比如,md test 2>nul,如果当前目录已经存在文件夹test,那么,执行这条语句将不会出现错误提示;
③ 如果要同时屏蔽正确执行代码后产生的提示和出错时的信息,请在语句最后加上代码 >nul 2>nul。比如,copy a.txt d:\test>nul 2>nul 这条语句,无论命令是否成功执行,都不会在屏幕上出现任何提示;
善用 nul 2>nul 句式,可以很方便地实现很多目的,比如创建文件夹的时候,无需先用if语句来检测是否已经存在某个目录,直接 md test 2>nul 即可,可以提高代码的执行效率。
4.2 del /a /f *.txt
单独的del命令并不能删除带隐藏或只读属性的文件,于是,很多人自然而然地想到先用 attrib 命令来先给将要删除的文件去掉各种属性。其实,操作过程大可不必如此繁琐,只须给del加上 /a /f 的参数就可以了。
4.3 批处理.bat 文件中输出中文乱码
原因:记事本新建的文件,编码不是 utf-8
解决方法:用【记事本】打开>【另存为】>【修改编码为:utf-8】
操作截图:
效果截图:
五、小白用法
其实说多也无用,毕竟平常实际用到的功能并不多,往往都是在需要实现某个具体的功能才会查询相关的指令进行应用
5.1 删除开发环境生成的中间缓存
1 | del *.bak /s |
1 | copy Objects\ExecutableFile.hex ExecutableFile.hex |
5.2 一键开启工作环境
1 | @echo off |