发挥bat的作用

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,然后查看,通常要用到如下的命令:

[plain] view plaincopyprint?

  1. D:\>adb shell tcpdump -p -s 0 -i any -w /sdcard/capture.pcap
  2. D:\>adb pull /sdcard/capture.pcap .

然后再用Wireshark去查看这个文件。如果一个一个的去敲的话,容易写错,通常要试几次才能成功。但是如果写一个BAT脚本的话:

[plain] view plaincopyprint?

  1. ::tcpdump.bat
  2. @echo off
  3. set dir=/sdcard
  4. set file=capture.pcap
  5. adb shell rm -r %dir%/%file%
  6. adb shell tcpdump -p -s 0 -i any -w %dir%/%file%
  7. @echo on
  8. ::gettcpdump.bat
  9. @echo off
  10. set dir=/sdcard
  11. set file=capture.pcap
  12. set wireshark="C:\Program Files\Wireshark\Wireshark.exe"
  13. del /q %file%
  14. adb remount
  15. adb pull %dir%/%file% .
  16. %wireshark% %file%
  17. @echo on

第一个脚本tcpdump.bat是抓取,第二个脚本是查看所抓取的数据,我每次只需运行这二个命令就可以轻松的查看:

[plain] view plaincopyprint?

  1. D:\>tcpdump
  2. Press Ctrl-C to stop capturing
  3. D:\>gettcpdump

之后Wireshark就会把所抓取的数据打开,直接看就行了。

3. 哪里可以用到BAT

任何需要重复做的事情都可以尝试用脚本来完成。比如,每天的版本更新,拷贝文件,每天都使用的命令等等。如前面所说的,只要某些事情你超过第二次做,或者每天都做几十次,就应该考虑用BAT。或者,某些命令很复杂,也要使用BAT,即使把二个简单命令合成一个BAT也是值得的。比如,调试的时候要查看手机内的数据,就可以用脚本来完成:

[plain] view plaincopyprint?

  1. ::getmmsdb.bat
  2. @echo off
  3. set datadir=/data/data/com.android.providers.telephony/databases
  4. set mmsdb=mmssms.db
  5. del /q %mmsdb%
  6. adb remount
  7. adb pull %datadir%/%mmsdb% .
  8. sqlite3 %mmsdb%
  9. @echo on

因为BAT中可以写任何可以在CMD命令行中运行的命令,另外,很多应用程序也提供了命令版本,比如WinRAR,如果你需要从某个地方拷贝东西并解压,就可以用BAT:

[plain] view plaincopyprint?

  1. ::copyversion.bat
  2. @echo off
  3. del /q stable.rar
  4. set winrar="C:\Program Files\WinRAR\WinRAR.exe"
  5. copy /y \\192.168.0.1\version\release\stable.rar .
  6. %winrar% x stable.rar
  7. @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就是传递给命令的参数,也就是要命令所执行的对象。如:

[plain] view plaincopyprint?

  1. del /f /q /s tmp

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

[plain] view plaincopyprint?

  1. 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命令来定义一个变量,然后用二个百分号来引用这个变量,所引用的地方全用所定义的值来完全替换,如:

[plain] view plaincopyprint?

  1. D:\>set logfile="D:\logs\log.txt"
  2. D:\>echo %logfile%
  3. 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文件,用如下脚本:

[plain] view plaincopyprint?

  1. ::openxls.bat
  2. @echo off
  3. set excel="C:\Program Files\Microsoft Office\Office12\EXCEL.EXE"
  4. %excel% "D:\documents\status.xlsx"
  5. %excel% "E:\report\report.xlsx"
  6. @echo on

这样会有问题,运行到打开第一个文件时会停在那里,除非你关掉status.xlsx否则,它会阻塞在那里,第二个文件不会执行到。
解决方法就是为每一个会阻塞的命令开启一个新的进程,用start命令:

[plain] view plaincopyprint?

  1. ::openxls.bat
  2. @echo off
  3. set excel="C:\Program Files\Microsoft Office\Office12\EXCEL.EXE"
  4. start %excel% "D:\documents\status.xlsx"
  5. start %excel% "E:\report\report.xlsx"
  6. @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,迅雷暴风影音等等。对于我来说这些都是流氓软件,特别是那些无法取消其开机自动运行的,会造成开机时很卡。
但是我们日常工作都需要开一些固定的软件,比如邮件客户端,Eclipse,打开某个特定的文件夹,打开某个特定的网页等等。这些正派的软件反倒没有“开机自动运行”选项,怎么办呢?这时BAT就派上大用场了,可以写一个叫做startup.bat,在里面把要运行的程序都写上,然后在Start Menu的Startup文件夹中建一个指向我们startup.bat的快捷方式:

[plain] view plaincopyprint?

  1. :: startup.bat
  2. @echo off
  3. "C:\WINDOWS\explorer.exe" "C:\Documents and Settings\User\桌面\alex"
  4. set ie="C:\Program Files\Internet Explorer\iexplore.exe"
  5. set mail="https://webmail.microsoft.com/"
  6. start %ie% %mail%
  7. start "C:\Program Files\Microsoft Office\Office12\EXCEL.EXE" "D:\documents\report.xlsx"
  8. start mstsc d:\work\rdps\linux.RDP
  9. start mstsc d:\work\rdps\windows.RDP
  10. ddms.bat
  11. clean.bat
  12. D:\eclipse-java-galileo-SR2-win32\eclipse.exe
  13. @echo on

每个工具都有其优势和不足,我们要做的就是用正确的工具去做正确的事,以期达到最高效的工作效率。虽然有Perl等更加强大的工具,虽然有PowerTools等拓展工具。但是当你有环境的限制的时候,比如由于工作环境的限制,你只有一个Windows系统,没有Perl或PowerTools时,你能用的就只有BAT了。这个时候就要发挥BAT的威力了,复杂的它做不了,但是简单的它还是能很好的胜任的。
脚本,强大也好,局限也罢,是为了帮助我们解决一些重复性的问题的。所以关键不在脚本,而是在于我们要发现日常工作中的重复性的劳动,然后用脚本来替代。切记,计算机的重复性远比人好,而且计算机就是被设计用来代替人类做一些机械重复的工作的,这是它的使命,让它完成它的使命吧!

转自:http://blog.csdn.net/hitlion2008/article/details/7467252

时间: 2024-10-20 18:27:26

发挥bat的作用的相关文章

样做SEO才可以发挥到最大作用

想必只要是做网站的人都希望知道,怎样做SEO才可以发挥到最大作用吧,怎样做网站的流量才可以达到自己想象的顶峰吧,下面笔者就简单谈谈相关问题. 一.SEO的最高境界:忘记SEO. SEO优化的最高境界就是忘记优化,所谓的忘记SEO,并不是不做SEO或是没SEO,而是要把SEO做得根本不留一点SEO的痕迹.不要让搜索引擎和客户一看就知道你做过SEO了,SEO应以用户体验为先.因为SEO主要针对的是搜索引擎,而网站主要针对的是用户,可搜索引擎蜘蛛也仍然是一个特殊的智能化的用户.因此,主要体现在以下几个

负载均衡技术在CDN中发挥着重要作用

转载地址:http://www.qicaispace.com/gonggao/server/page01/info07.asp CDN是一个经策略性部署的整体系统,能够帮助用户解决分布式存储.负载均衡.网络请求的重定向和内容管理等问题. 其目的是通过在现有的Internet中增加一层新的网络架构,将网站的内容发布到最接近用户的网络“边缘”,使用户可以就近取得所需的内容,解决 Internet网络拥塞状况,提高用户访问网站的响应速度.从技术上全面解决由于网络带宽小.用户访问量大.网点分布不均而产生

如何成为一家真正发挥大数据作用的 “数据驱动型公司”?

在本章节中,我想试着描述.分享一下大数据在公司商业运营情境当中所扮演的角色. 大数据的能力是从何处而来? 首先,我想先花一点时间来谈谈有关数据的价值,数据所发挥的作用,它是从何处而来的. 我认为「企业专家中心「(Centre Of Excellence) 这个部门非常之重要,它作为最前沿的公司职能部门,负责将数据的角色引入到公司,并将其功能放大化.它的主要职能就是对跨部门的工作进行协调,具体包括了下面这几项内容: 1. 对企业的技术架构进行维护和升级 2. 决定应该收集什么样的数据,从哪个部门来

Alluxio/Tachyon如何发挥lineage的作用?

在Spark的RDD中引入过lineage这一概念.指的是RDD之间的依赖.而Alluxio则使用lineage来表示文件之间的依赖.在代码层面,指的是fileID之间的依赖. 代码中的注释指出: * A lineage tracks the dependencies imposed by a job, including the input files the job depends on,* and the output files the job generates.内部数据结构: @No

让Redis在你的系统中发挥更大作用

Redis在很多方面与其他数据库解决方案不同:它使用内存提供主存储支持,而仅使用硬盘做持久性的存储:它的数据模型非常独特,用的是单线程.另一个大区别在于,你可以在开发环境中使用Redis的功能,但却不需要转到Redis. 转向Redis当然也是可取的,许多开发者从一开始就把Redis作为首选数据库:但设想如果你的开发环境已经搭建好,应用已经在上面运行了,那么更换数据库框架显然不那么容易.另外在一些需要大容量数据集的应用,Redis也并不适合,因为它的数据集不会超过系统可用的内存.所以如果你有大数

几点建议,让Redis在你的系统中发挥更大作用

Redis在很多方面与其他数据库解决方案不同:它使用内存提供主存储支持,而仅使用硬盘做持久性的存储:它的数据模型非常独特,用的是单线程.另一个大区别在于,你可以在开发环境中使用Redis的功能,但却不需要转到Redis. Redis在很多方面与其他数据库解决方案不同:它使用内存提供主存储支持,而仅使用硬盘做持久性的存储:它的数据模型非常独特,用的是单线程.另一个大区别在于,你可以在开发环境中使用Redis的功能,但却不需要转到Redis. 转向Redis当然也是可取的,许多开发者从一开始就把Re

如何发挥企业网站的作用,提升企业形象

如果一个企业能够在同行中脱颖而出的话,它必然拥有一个设计精美的企业网站.企业网站及时企业的第二张"脸".试问有谁会不喜欢一张干干净净,漂漂亮亮的"脸"呢?所以,所以充分发挥企业网站的优势,帮助企业塑造良好的形象.下面零起飞(07FLY)建站给大家诠释一下: 第一.重视网站布局和质量 现在很多公司都比较注重公司环境的好坏,公司的设备是否先进,却往往忽略了对自身网站的建设.很多公司的网站就仅是流于形式,没有过多的作用.实际上,网站是一个能够很好展示公司形象的平台,通过网

IT——把控发挥本质作用

IT.公司为什么要成立这个部门,在所有部门中IT所在的位置.自己所在的位置.不管是做事,还是思维角度,都会围绕自己的中心目的,让自己变得做事有主题,发展有方向.接下来说下自己这两天的总结. 所有盈利团队的组成,市场.产品.管理三大件. 如何让IT发挥最大的作用,就是要追朔IT这个部门为什么会成立的原因.缩减企业成本,变相提高效益 IT又改如何服务好其他部门了? 以上是一个小的总结.当然也是每个公司最基本的建设,如果按照上图 ,其实IT东西确实不多,但是服务于企业的方式是多样化的,围绕的本质是唯一

【转】BAT 延迟变量

延迟环境变量在bat里是重中之重,虽然前面说过,熟练应用for才算会写批处理,但如果不懂延迟环境变量的话,那么你就只能写出简单的批处理,而for语句也不能发挥最大的作用. 延迟环境变量在cmd下默认是关闭的,如果要使用延迟环境变量,可以用以下两种方法开启: 1.      cmd下开启/关闭延迟环境变量 在cmd下开启或延迟环境变量用/v参数: cmd /v:on //开启延迟环境变量 cmd /v:off //关闭延迟环境变量 2.      批处理中开启/关闭延迟环境变量 在批处理中开启或关