深入浅出Windows BATCH

1.什么是Windows BATCH

BATCH也就是批处理文件,有时简称为BAT,是Windows平台上的一种可运行脚本,与*nix(Linux和Unix)上的Shell脚本和其它的脚本(Perl,Python)等是一样的,实质上就是一个文本文件,可是用特定的软件去解释的时候,就变成了可运行脚本。在Windows上,可运行脚本就是BATCH文件,也叫批处理文件,这是从DOS时代遗留下来的名字,意思就是把非常多命令放到一起来运行。它的扩展名是*.bat,双击便可直接运行,在命令行(CMD或叫做命令提示符)以下也能够当作一个命令来运行。由于这是Windows支持的东西,所以仅仅能在Windows平台使用。(特殊情况除外,不要钻牛角尖,没意思的)。比方著名的Windows垃圾清理小工具就是一个BAT批处理文件。

2. 为什么须要BAT

归根结底是为了提高工作效率。这个解释起来比較费劲,由于在GUI大行其道的今天,再提命令行,非常多人会不熟悉,或者觉得这是倒退。可是众多关于提高工作效率的书籍都会提到命令行能够大大的提高效率,由于命令能够方便的直接写路径,而不用在文件浏览器中一层一层的打开,和命令行能够把命令组合起来,也就是把不同的命令组合起来来完毕一个任务,而不用打开多个GUI窗体来做(甚至非常多时候GUI窗体都是无法完毕的)。对于这点*nix的程序员们应该最有体会,真正的*nix高手是不会离开命令行的。他们的工作仅仅需打开一个Terminal(命令行),编辑用Vim,其它全都用命令行的工具来完毕,甚至他们都不用鼠标!
Windows的CMD没有*nix的Terminal那么强大,所以全然在其内做开发有点不切实际,尽管有非常多工具能够让CMD变得强大些,可是还是无法达到*nix那样的地步,由于它们从根本上就是走的不同的路线*nix是为了开发者准备的,而Windows是为了普通大众准备的。
再说的详细一点就是为了DRY和Automation,也就是说让计算机帮你完毕一些机械反复性的工作任务(对于DRY和Automation能够參考《The Productive Programmer》和《Pragmatic Programmer》)。由于BAT能够组合命令,所以某个操作须要超过一个命令,或者參数较多时,或者路径较长时,就能够把它写成BAT,变成一个简单的命令,一次二个可能没感觉,可是当天天都用时,就省去了大量的Typing。举个样例,比方我要常常性的在手机上抓取Tcpdump,然后查看,通常要用到例如以下的命令:

D:\>adb shell tcpdump -p -s 0 -i any -w /sdcard/capture.pcap
D:\>adb pull /sdcard/capture.pcap .
然后再用Wireshark去查看这个文件。假设一个一个的去敲的话,easy写错,通常要试几次才干成功。可是假设写一个BAT脚本的话:
::tcpdump.bat
@echo off
set dir=/sdcard
set file=capture.pcap
adb shell rm -r %dir%/%file%
adb shell tcpdump -p -s 0 -i any -w %dir%/%file%
@echo on
::gettcpdump.bat
@echo off
set dir=/sdcard
set file=capture.pcap
set wireshark="C:\Program Files\Wireshark\Wireshark.exe"
del /q %file%
adb remount
adb pull %dir%/%file% .
%wireshark% %file%
@echo on
第一个脚本tcpdump.bat是抓取,第二个脚本是查看所抓取的数据,我每次仅仅需执行这二个命令就能够轻松的查看:
D:\>tcpdump
Press Ctrl-C to stop capturing
D:\>gettcpdump
之后Wireshark就会把所抓取的数据打开,直接看即可了。

3. 哪里能够用到BAT

不论什么须要反复做的事情都能够尝试用脚本来完毕。比方,每天的版本号更新,复制文件,每天都使用的命令等等。如前面所说的,仅仅要某些事情你超过第二次做,或者每天都做几十次,就应该考虑用BAT。或者,某些命令非常复杂,也要使用BAT,即使把二个简单命令合成一个BAT也是值得的。比方,调试的时候要查看手机内的数据,就能够用脚本来完毕:

::getmmsdb.bat
@echo off
set datadir=/data/data/com.android.providers.telephony/databases
set mmsdb=mmssms.db
del /q %mmsdb%
adb remount
adb pull %datadir%/%mmsdb% .
sqlite3 %mmsdb%
@echo on
由于BAT中能够写不论什么能够在CMD命令行中执行的命令,另外,非常多应用程序也提供了命令版本号,比方WinRAR,假设你须要从某个地方拷贝东西并解压,就能够用BAT:
::copyversion.bat
@echo off
del /q stable.rar
set winrar="C:\Program Files\WinRAR\WinRAR.exe"
copy /y \\192.168.0.1\version\release\stable.rar .
%winrar% x stable.rar
@echo on
无论怎么样,这都比手动去做要来的方便。
另外就是*nix上面的非常多有用命令行程序都有了Windows的版本号,比方Subversion,它有一个版本号就是专门用于命令行的,所以把所安装的软件与内置的一些命令组合起来,能够创造出非常强大的Automation的工具。
另一点就是第三方工具的拓展,Windows本身的内置命令非常少,可是有第三方的工具来拓展它比方PowerShell等,加之这些工具,能够让程序猿的工具箱更加的丰富和强大。
事实上,这里最关键的地方不在BAT,或者你是否会写这种脚本,而是在于你是否能意识到BAT脚本能够替代手工。能够读一读《The Productive Programmer》和《Pragmatic Programmer》来获取点灵感。

4. 怎样使用BAT

BAT是一个可运行脚本,也就是说它跟一个*.exe可运行程序一样,仅仅要双击它就能够运行了。另外的方式就是通过CMD在命令行中启动它,但须要给出它的路径,也就是说要让解释程序能找到它,所以推荐的做法是把所写的BAT收集整理到一个目录中,然后把这个文件放到系统的环境变量PATH中去,这样就能够在不论什么的路径中使用了。
如,我的配置是这种,把全部的BAT放在D:\work\bin以下,然后把D:\work\bin加到Path变量中去。
加入环境变量的方法是右击"我的电脑"-->"属性"-->"高级"-->环境变量-->在用户变量中编辑Path(假设没有就新加一个)然后把D:\work\bin加入当中,与其它的路径用分号;分隔。之后就能够像执行内置命令一样来执行它了。(假设你有权限,也可改动系统变量)。

5. 怎样写BAT

0. 文件的编辑

它就是一个文本文件,所以用最简单的记事本就能够编辑。当然,你用其它的强大的工具也能够,比方假设用Vim编辑还能有语法高亮等VIP级待遇。不管用什么编辑器,一定要注意保存时一定把要文件的扩展名记为*.bat,否则就不再是可运行脚本了,大家都是程序员,你们懂得。
前面提到了,BAT事实上就是把CMD中的命令或其它可运行命令组合到一起,所以BAT的基石是命令,以下重点讲下命令。

1. 基本命令及其通用的规则

这里指的基本命令是指CMD命令中的的内置命令,也就是help命令所显示的命令,不包含在环境变量中的以及第三方的,那些是外部命令。
主要的命令有文件操作,目录操作,时间等等。比方:del, ren, rd, cd, copy, xcopy, time等等。

a. 命令的一般格式

与*nix系统的命令的一样,它的格式也都是
command [options] [arguments]
当中options是控制和改变命令的行为,每一个选项必须以/开头,后面跟选项,能够把多个选项连在一起写,也能够用空格格开,每一个选项也能够跟自己的參数。arguments就是传递给命令的參数,也就是要命令所运行的对象。如:

del /f /q /s tmp
这里/f /q /s就是三个选项/f意思是强制删除,/q是安静模式,也就是删除前不提示,/s是删除子文件夹;而tmp则是要删除的对象也就是del命令的參数。
dir /on tmp

这里的话/on是它的选项,当中/o是选项,意思是排序,而n是选项的參数,合起来就是按名字排序。
通常,一个命令都有缺省的选项和參数,也就是说你不指定,也会有。详细选项不同的命令会有不同的选项。
b. 一些通用的选项:

尽管不同的命令有着不同的參数,可是有一些共同的:

  • /?  显示帮助信息,全部的命令都有(跟*nix的-h一样)
  • /s  对于文件夹操作来讲是包含子文件夹(跟*nix的-r一样)
  • /q  安静模式,也就是某些操作不要提示,比方删除时,或覆盖文件时不要提示
c. 获取帮助

不可能记住全部的东西,所以每当遇到一个命令时就要获取其帮助信息。
help command

command /?
就能够看到command的帮助信息。而直接用help命令,则能够查看CMD命令行的帮助,也就是说它支持哪些内置命令。须要注意的是help仅仅能查看有哪些内置以及显示内置命令的帮助信息。对于那些在环境变量Path中的命令,它是无法获取帮助信息的,对于那些命令,仅仅能通过命令本身去找帮助信息。

2. 扩展命令

就是CMD命令行非内置的,存在于环境变量Path中的命令,这些命令使用起来跟内部命令无差别,都能够在CMD中直接调用。这些命令通常都是由第三方或操作系统提供,完毕某些特定领域的功能,比方C:\Windows\System和C:\Windows\System32下的非常多可运行程序,都可做为外部命令来使用,比方你在命令行中直接输入notepad然后按回车,记事本就会打开。以及安装的第三方程序如WinRAR等。
这些程序也许支持命令模式,也许不支持,这个要去參考程序的文档,另外,即使其支持命令行,选项和參数也要參考文档。

3. 凝视和@及echo off

在BAT中以二个冒号开头的一行为凝视,::仅仅能凝视一行,且必须在一行的开头
如:
:: This is a comment
:: copy a file to somewhere
@与echo off的作用一样,都是DOS 批处理的一个特殊标记符, 仅用于屏蔽命令行回显。当中@仅仅能影响当前行,而echo off是关闭,直到echo on把回行显示打开。二个主要在BAT脚本中运用,在命令行中直接用看不出不同。在BAT中每当运行一个命令时,都会在CMD命令中显示出这个命令,比方:
::mydir.bat
dir /on
这种脚本在执行时会是这种:
D:\>mydir
D:\>dir /on
(显示目录的内容)
为了在运行脚本时不显示当前命令,就要用到关闭回行显示功能@和echo off,所以差点儿每一个BAT都有这二行
@echo off
....
@echo on
在開始脚本前关闭回行显示,然后在结束时再打开。用@的目的是把关闭回行显示命令的回行显示也不要显示出来(抱歉,有点绕)。
为什么要关闭回行显示呢?由于回行显示会跟所运行命令的输出混全在一起,所以看起来非常不爽,特别是当BAT脚本的命令比較多时,所以要关闭它。

4. 管道

与*nix一样,BAT中也能够使用管道,能够使用管道来把命令组合起来,比方最常见的使用方式就是:
type logfile.txt | more
以分屏查看。

5. 变量的定义和使用

在BAT中用set命令来定义一个变量,然后用二个百分号来引用这个变量,所引用的地方全用所定义的值来全然替换,如:

D:\>set logfile="D:\logs\log.txt"
D:\>echo %logfile%
D:\logs\log.txt

6. 重定向

与*nix一样BAT也支持文件流重定向。

  • <    重定向输入流,最经常使用的方式是用文件取代标准输入
  • >    重定向输出流,最经常使用的方式是把程序运行结果放到文件里
  • >>   重定向输出流,加入模式,也就是说从文件尾部開始加入,最经常使用的地方是保存Log用

尽管Windows看起来与*nix相去甚远(特别是前几年),可是BAT里面有着跟*nix和SHELL类似的一些重要的特性(管道和重定向),所以BAT还是相当强大的,尽管不能跟SHELL比,可是至少能够帮助我们完毕非常多机械反复的工作。

7. 命令行參数

跟编程语言(C, C++, Java, Perl)和SHELL一样,BAT也支持命令行參数,也就是运行命令时所给的參数。在BAT中用%[1-9]来引用它们,如:
::mytype.bat
@echo off
type %1
type %2
那么在执行时,
C:\>mytype one.txt two.txt
当中%1就是one.txt,%2就是two.txt
跟C和C++语言一样,另一个%0能够用它就是脚本的名字。

8. start命令

在*nix的SHELL中能够用command &的形式来在后台执行一个命令,也就是用一个新进程来执行命令,而不堵塞以下的命令。有些时候这个非常实用,比方你想用BAT打开几个XLSX文件,用例如以下脚本:

::openxls.bat
@echo off
set excel="C:\Program Files\Microsoft Office\Office12\EXCEL.EXE"
%excel% "D:\documents\status.xlsx"
%excel% "E:\report\report.xlsx"
@echo on
这样会有问题,执行到打开第一个文件时会停在那里,除非你关掉status.xlsx否则,它会堵塞在那里,第二个文件不会执行到。
解决方法就是为每个会堵塞的命令开启一个新的进程,用start命令:
::openxls.bat
@echo off
set excel="C:\Program Files\Microsoft Office\Office12\EXCEL.EXE"
start %excel% "D:\documents\status.xlsx"
start %excel% "E:\report\report.xlsx"
@echo on
这种话,二个文件都会被打开。

9. BAT的不足之处

前面都在说BAT怎样强大,可是毕竟Windows没有像*nix那样给予命令行的强大支持,它跟SHELL相比还差的非常远,在运行命令和文件操作方面可能没什么大区别,可是在某些方面它还非常弱:

a. 输入的处理

尽管能够用<来重定向输入流,可是它对输入的处理非常弱,特别的它没的读取的命令(SHELL中的read),它也不能按行读入文件。所以当涉及到文件处理时,它就显得力不从心了。

b. 文本处理的能力

如上一条说,非常多时候能须要从一个文本文件读取内容,然后对其做一些处理。这点上面BAT非常弱,跟SHELL是没法比的。由于SHELL本身有灵活的读取函数,能够按行读,也能够把一行按不同的单词来读,再加上其本身有字串处理函数,还有就是*nix有丰富的字串处理命令如grep, sed, ed, awk等等。当然,如今这些东西也都有了Windows的版本号。可是用BAT来处理文件还是一个相当麻烦的事。
对于文本处理,最好是能用Perl等程序性的脚本来写,它在处理输入,读取和处理,以及正則表達式上都有非常好的支持。

10. 开机自己主动执行

某些软件会有内部选项以达到开机自己主动执行,甚至它总是开机自己主动执行,比方著名的QQ,迅雷暴风影音等等。对于我来说这些都是流氓软件,特别是那些无法取消其开机自己主动执行的,会造成开机时非常卡。
可是我们日常工作都须要开一些固定的软件,比方邮件client,Eclipse,打开某个特定的目录,打开某个特定的网页等等。这些正派的软件反倒没有“开机自己主动执行”选项,怎么办呢?这时BAT就派上大用场了,能够写一个叫做startup.bat,在里面把要执行的程序都写上,然后在Start Menu的Startup目录中建一个指向我们startup.bat的快捷方式:

:: startup.bat
@echo off
"C:\WINDOWS\explorer.exe" "C:\Documents and Settings\User\桌面\alex"

set ie="C:\Program Files\Internet Explorer\iexplore.exe"
set mail="https://webmail.microsoft.com/"
start %ie% %mail%

start "C:\Program Files\Microsoft Office\Office12\EXCEL.EXE" "D:\documents\report.xlsx"

start mstsc d:\work\rdps\linux.RDP
start mstsc d:\work\rdps\windows.RDP

ddms.bat
clean.bat

D:\eclipse-java-galileo-SR2-win32\eclipse.exe
@echo on
每一个工具都有其优势和不足,我们要做的就是用正确的工具去做正确的事,以期达到最高效的工作效率。尽管有Perl等更加强大的工具,尽管有PowerTools等拓展工具。可是当你有环境的限制的时候,比方因为工作环境的限制,你仅仅有一个Windows系统,没有Perl或PowerTools时,你能用的就仅仅有BAT了。这个时候就要发挥BAT的威力了,复杂的它做不了,可是简单的它还是能非常好的胜任的。
脚本,强大也好,局限也罢,是为了帮助我们解决一些反复性的问题的。所以关键不在脚本,而是在于我们要发现日常工作中的反复性的劳动,然后用脚本来替代。切记,计算机的反复性远比人好,并且计算机就是被设计用来取代人类做一些机械反复的工作的,这是它的使命,让它完毕它的使命吧!


參考资料:这几篇文章介绍的比較具体
基本介绍
 ”石头札记 批处理文件“
这二个哥们写了非常多操作字串的BAT
 "DOS -string operations"
 "DOS - String Manipulation"

转载于:https://www.cnblogs.com/yxwkf/p/4075827.html

这是一个windows脚本调试器程序。 绿色:只需复制文件到同一目录下就可以了。 纯净:基本不使用注册表,只是在注册文件类型图标和文件关联时才使用了注册表。 无毒:绝对没有任何恶意代码,但是由于程序会自动产生临时的批处理文件,可能会被杀毒软件误报。 注意:如果不能启动,下载vcredist_x86.exe安装VC运行库,然后再试。 已经实现的功能: 设置断点; 在断点命中时在代码编辑器指示哪个断点被命中。 在断点命中时可以观察现场状态【变量、ErrorLevel、当前目录】; 如果批处理没有调用Exit退出,那么可以观察到批处理执行完的现场状态; 调试暂停时会自动打开/切换文件并滚动代码窗口,使当前断点可见; 可以预设批处理执行前的环境变量和当前目录。 工程管理,也就是管理批处理文件、断点、观察变量、初始环境变量、初始当前目录、批处理入口文件、批处理文件命令行参数的信息。 支持用户自定义界面,使用标签多文档界面和停靠栏。 双击.bdc文件,会启动windows脚本调试器。 附带使用手册和批处理指南。 准备实现的功能: 在断点命中时修改环境变量或者当前目录; 语法分析【代码着色、语法检查的基础】; 语法检查; 代码着色; 内置命令帮助; 不打算实现的功能: 我感觉批处理编程并不能提供多少智能提示,所以就不做了。 局限性: 代码编辑器暂时不支持中文,这个是最大的限制了,我会在下个版本解决这个问题; 只可以在批处理语句之前加断点,不可以在空行、标签行和右括号)开头的行加断点,不可以在非批处理代码处加断点; 不支持单步调试; 必须在调试之前加断点,在调试之后加的断点,只能在以后的调试会话中起作用。 启动批处理脚本只能接受10个参数,这个限制好像问题不大。 目前可能还有bug。 注意: 不要调试本程序所在目录下的那三个批处理程序,否则会出现无法预料的行为。为了保险,请把他们设为只读隐藏文件。 可以把halt.exe也设为只读隐藏文件。 我会持续改进本程序。 email: cdp97531@sina.com blog: http://hi.baidu.com/chendeping/home
这是一个windows脚本调试器程序。 纯净:基本不使用注册表,只是在注册文件类型图标和文件关联时才使用了注册表。 无毒:绝对没有任何恶意代码,但是由于程序会自动产生临时的批处理文件,可能会被杀毒软件误报。 注意:如果不能启动,下载vcredist_x86.exe安装VC运行库,然后再试。 已经实现的功能: 设置断点,并略微智能地判断是否可以中断; 在断点命中时在代码编辑器指示哪个断点被命中。 在断点命中时可以观察现场状态【变量、ErrorLevel、当前目录】; 如果批处理没有调用Exit退出,那么可以观察到批处理执行完的现场状态; 调试暂停时会自动打开/切换文件并滚动代码窗口,使当前断点可见; 可以预设批处理执行前的环境变量和当前目录。 工程管理,也就是管理批处理文件、断点、观察变量、初始环境变量、初始当前目录、批处理入口文件、 批处理文件命令行参数的信息。 支持用户自定义界面,使用标签多文档界面和停靠栏。 双击.bdc文件,会启动windows脚本调试器。 附带使用手册和批处理指南。 增加了命令行参考。 代码着色; 代码编辑器可以支持中文及其他语言。 准备实现的功能: 在断点命中时修改环境变量或者当前目录; 语法检查; 不打算实现的功能: 我感觉批处理编程并不能提供多少智能提示,所以就不做了。 局限性: 不支持单步调试; 必须在调试之前加断点,在调试之后加的断点,只能在以后的调试会话中起作用。 启动批处理脚本只能接受10个参数,这个限制好像问题不大。
本软件是调试Windows脚本的利器,可以极大地改善开发批处理脚本的效率和质量。 设置断点 在代码编辑器左边栏上点击就可以增加和删除断点。 只可以在批处理语句开头行之前加断点,不可以在批处理语句的续行加断点,不可以在空行、标签行和右括号)开头的行加断点,不可以在非批处理代码处【比如内嵌perl代码】加断点; 虽然程序做了初步的检查以防止你的疏忽大意,但是远远不够完善,需要你的一点点自主判断。 例如下面绿色的行可以下断点,红色的行不可以下断点。最后一行因为是一个批处理语句的续行,不是一个批处理语句的开头。 set name=value if "%name%"=="value" ( echo very good ) :alabel echo I have a dream, I want to ^ set a national record. 新建工程 启动Windows批处理调试器时,就存在一个工程。也可以通过File>new project菜单项新建工程。 打开工程 在资源浏览器双击.bdc文件,就会启动Windows批处理调试器。也可以通过File>open project菜单项打开工程。 保存工程 如果当前工程的某些属性存在变化,在新建工程、打开工程或者退出程序时,Windows批处理调试器会提示你是否保存当前工程。没有“工程另存为”选项。你可以通过复制.bdc文件来模拟这个功能。.bdc文件是JSON文本格式,可以用任何一个文本阅读器打开,不过推荐你在Windows批处理调试器中编辑,以免出错。 添加批处理文件 通过打开文件按钮或者拖拽方式打开批处理文件,就可以把批处理文件添加到当前工程。可以在Files窗格看到当前工程所有的批处理文件。 删除批处理文件 在Files窗格单击某个文件名左边的x单元格,会关闭该文件,同时把该文件从当前工程中删除【放心,该文件本身依然在磁盘上】,这个行为基本等同于删除该文件上的所有断点。 在MTI【多标签界面】关闭文件不会从工程中删除该文件,也就是说该文件上的断点依然存在,在调试时如果命中该断点,会打开该文件,并显示命中断点。 设置批处理脚本入口文件 在properties窗格的Entry File右边输入批处理脚本入口文件,需要是全路径,可以有空格,不可以用引号"括住文件名。这是调试必需设置。 也可以在Files窗格双击某个文件右边的S单元格来设置批处理入口文件。 设置批处理脚本参数 在properties窗格的Batch Arguments右边输入批处理脚本参数,和你在命令行上想要输入的一模一样就行了。 设置初始当前目录 在properties窗格的Current Directory右边输入初始当前目录,这个相当于你在执行批处理脚本前,在命令解释器中使用cd /d 改变当前目录。 设置初始环境变量 在properties窗格右击会添加一个空行,在空行左边可编辑单元格输入变量名,右边输入变量值。如果变量值为空,等于清除该变量。 单击变量左边的x会删除该变量。注意这和变量的值为空的情况不同。 设置观察环境变量 在watch窗格右击会添加一个空行,在左边可编辑单元格输入想要在断点命中时观察的变量名。 单击变量左边的x会删除该观察变量。 设置过滤变量名 断点命中时,在variables窗格上面的空行左边单元格输入,variables窗格会仅显示所有含有该过滤变量名的变量。 观察断点命中时的批处理状态 可以在variables窗格观察到所有变量的值,当前路径,以及errorlevel。 在variables窗格也可以观察到批处理执行完那一刻的状态,条件是你的批处理不是通过exit命令退出的,通过exit /b命令退出是可以的。 查找 增加了在文档中查找字符串的功能。 智能提示 增加了命令的智能提示功能,用户可以通过修改安装目录下的隐藏文件IntelliSense.txt来定制智能提示。 本次更新: 修复了有中文时,代码着色线程造成程序崩溃的错误。 增加了查找功能。 剔除了界面的中文字符,以使英文环境可以正常显示。 增加了命令的智能提示功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值