首页 公司介绍 公司文化 服务项目 收费标准 合同样本 产品展示 技术动态 联系方式
服务项目
联系方式
电话:020-87518715
商务QQ:2385004338
商务QQ:2295422440
E-mail:services@pzhysny.com
地址:广州市天河区龙口西路100号中明大厦1601
批处理Batch
作者: 发布时间:2017-10-26 阅读:602

 批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理,通常被认为是一种简化的脚本语言,它应用于DOS和Windows系统中。批处理文件的扩展名为bat 。目前比较常见的批处理包含两类:DOS批处理和PS批处理。PS批处理是基于强大的图片编辑软件Photoshop的,用来批量处理图片的脚本;而DOS批处理则是基于DOS命令的,用来自动地批量地执行DOS命令以实现特定操作的脚本。更复杂的情况,需要使用if、for、goto等命令控制程式的运行过程,如同C、Basic等高级语言一样。如果需要实现更复杂的应用,利用外部程式是必要的,这包括系统本身提供的外部命令和第三方提供的工具或者软件。批处理程序虽然是在命令行环境中运行,但不仅仅能使用命令行软件,任何当前系统下可运行的程序都可以放在批处理文件中运行。

有些人认为批处理语言的含义要比上面的描述更广泛,还包括许多软件自带的批处理语言,如 Microsoft Office、Visual Studio、Adobe Photoshop 所内置的批处理语言的功能,用户可通过它们让相应的软件执行自动化操作(例如调整某个资料夹所有 PSD 图档的解析度)。 而这类批处理语言也大多提供把一系列操作录制为批处理文件的功能,这样用户不必写程式就能得到批处理程序。
批处理系统(batch processing system)中,一个作业可以长时间地占用cpu。而分时系统中,一个作业只能在一个时间片(Time Slice,一般取100ms)的时间内使用cpu。
批处不是严格意义上的操作系统,虽然可用Monitor监督,可用汇编语言开发,但也只是操作系统的原型。
所谓批处理(batch processing )就是将作业按照它们的性质分组(或分批),然后再成组(或成批)地提交给计算机系统,由计算机自动完成后再输出结果,从而减少作业建立和结束过程中的时间浪费。根据在内存中允许存放的作业数,批处理系统又分为单道批处理系统和多道批处理系统。早期的批处理系统属于单道批处理系统,其目的是减少作业间转换时的人工操作,从而减少CPU的等待时间。它的特征是内存中只允许存放一个作业,即当前正在运行的作业才能驻留内存,作业的执行顺序是先进先出,即按顺序执行。
由于在单道批处理系统中,一个作业单独进入内存并独占系统资源,直到运行结束后下一个作业才能进入内存,当作业进行I/O操作时,CPU只能处于等待状态,因此,CPU利用率较低,尤其是对于I/O操作时间较长的作业。为了提高CPU的利用率,在单道批处理系统的基础上引入了多道程序设计(multiprogramming)技术,这就形成了多道批处理系统,即在内存中可同时存在若干道作业,作业执行的次序与进入内存的次序无严格的对应关系,因为这些作业是通过一定的作业调度算法来使用CPU的,一个作业在等待I/O处理时,CPU调度另外一个作业运行,因此CPU的利用率显著地提高了。
现在的批处理系统主要指多道批处理系统,它通常用在以科学计算为主的大中型计算机上,由于多道程序能交替使用CPU,提高了CPU及其他系统资源的利用率,同时也提高了系统的效率。多道批处理系统的缺点是延长了作业的周转时间,用户不能进行直接干预,缺少交互性,不利于程序的开发与调试。
批处理系统的特点:
多道-在内存中同时存放多个作业,使之同时处于运行状态,这些作业共享CPU和外部设备等资源。
成批-用户和他的作业之间没有交互性。用户自己不能干预自己的作业的运行,发现作业错误不能及时改正。
批处理系统的目的是提高系统吞吐量和资源的利用率。
多道处理系统的优点是由于系统资源为多个作业所共享,其工作方式是作业之间自动调度执行。并在运行过程中用户不干预自己的作业,从而大大提高了系统资源的利用率和作业吞吐量。其缺点是无交互性,用户一旦提交作业就失去了对其运行的控制能力,而且是批处理的,作业周转时间长,用户使用不方便。
echo 命令
打开回显或关闭请求回显功能,或显示消息。如果没有任何参数,echo
批处理与联机处理
批处理与联机处理
命令将显示当前回显设置。
语法
echo [{on|off}] [message]
Sample:@echo off / echo hello world
在实际应用中我们会把这条命令和重定向符号(也称为管道符号,一般用> >> ^)结合来实现输入一些命令到特定的文件中。
rem 命令
注释命令,类似于在C语言中的/*--------*/,它并不会被执行,只是起一个注释的作用,只有在编辑批处理时才会被看到,主要用于方便修改。
:: 也具有rem的功能
但::和rem还是有区别的,当关闭回显时,rem和::后的内容都不会显示。
顺序批处理
顺序批处理
但是当打开回显时,rem
后的内容会显示出来,然而::后的内容仍然不会显示。
Rem [注释内容]
示例:Rem 你好。
pause 命令
暂停命令。运行 Pause 命令时,将显示下面的消息:
Press any key to continue. . .(或:请按任意键继续. . .)
示例:
@echo off
:begin
copy G:*.* d:\back
echo 请插入另一张光盘...
pause
goto begin
在这个例子中,驱动器 G 中磁盘上的所有文件均复制到d:\back中。显示的注释提示您将另一张光盘
盘放入驱动器 G 时,pause 命令会使程序挂起,以便您更换光盘,然后按任意键继续处理。
call 命令
从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。call
批处理功能界面
批处理功能界面
命令接受用作调用目标的
标签。如果在脚本或批处理文件外使用 Call,它将不会在命令行起作用。
语法
call [路径文件名] [标签]]
参数
[Drive:}[Path] FileName
指定要调用的批处理程序的位置和名称。
start 命令
调用外部程序,所有的DOS命令和命令行程序都可以由start命令来调用。
如:startcalc.exe即可打开Windows的计算器。
常用参数:
MIN 开始时窗口最小化
SEPARATE 在分开的空间内开始 16 位 Windows 程序
HIGH 在 HIGH 优先级类别开始应用程序
REALTIME 在 REALTIME 优先级类别开始应用程序
WAIT 启动应用程序并等候它结束
parameters 这些为传送到命令/程序的参数
执行的应用程序是 32-位 GUI 应用程序时,CMD.EXE 不等应用程序
常见批处理案例
常见批处理案例
终止就返回命令提示。如果在命令
脚本内执行,该新行为则不会发生。
goto 命令
跳转命令。程序指针跳转到指定的标签,从标签后的第一条命令开始继续执行批处理程序。
语法:goto label (label是参数,指定所要转向的批处理程序中的行。)
示例:
:1
start
goto 1
运行以上这段命令,就会打开很多个窗口(用来整人相当不错)。这段命令的意思是,先用start命令打开窗口,再用goto 1命令转到1标签,即第一行后面的命令。注意标签名字前面要加上英文的冒号。
标签的名字可以随便起,但是最好是有意义的字母啦,字母前加个:
选择批处理
选择批处理
用来表示这个字母是标签,goto
命令就是根据这个:来寻找下一步跳到到那里。最好有一些说明这样别人看起来才会理解你的意图啊。
set 命令
显示、设置或删除变量。
显示变量:set 或 set s 前者显示批处理当前已定义的所有变量及其值,后者显示所有以s开头的变量及值。
设置和调用变量:例如set aa=abcd,就是把aa定义为abcd。如果要调用这个变量,就把aa两边加上个百分号。
例如:
set aa=abcd
echo %aa%
pause
运行这段命令就会显示“abcd”。
删除变量:set aa= 此句命令即可删除变量aa。若变量aa已被定义,则删除变量aa;若aa尚未定义,则此句命令无实质意义。
需要说明的是,批处理中的变量是不区分类型的,不需要像C语言中的变量那样还要区分int、float、char等。比如执行set aa=345后,变量aa的值既可以被视为数字345,也可以被视为字符串345。
set命令具有扩展功能,如用作交互输入、字符串处理、数值计算等,属于高级命令范畴。
学习有关批处理的一些比较琐碎、但又比较有价值的一些知识,运用这些知识后,才有条件更好的实现的批处理的功能,并能使批处理摆脱黑白世界而显得更加多姿多彩。
一环境变量
所谓“环境变量”,实际上就是C语言里面的“变量”的意思。批处理的变量可以分为两类,由系统定义的系统变量和由用户根据需要自定义的用户变量。
【 1.系统变量】
批处理的一些变量是由操作系统事先定义好的,可以适用于任何批处理,我们称这些特殊的变量为“系统变量”。系统变量有很多个,包括硬件类、操作系统类、文件路径类、系统时间类等。要查看所有的系统变量,请新打开一个cmd窗口,输入set回车即可。对几个比较常用的变量解释如下:
ComputerName 计算机名,即右键我的电脑--属性--计算机名 选项卡中的“完整的计算机名称”
ComSpeccmd.exe完整路径名
HomeDrive系统分区盘符,一般都是C盘,故而HomeDrive=C:
Path可执行文件默认搜索路径。这个东东非常重要!待会儿单独讲解…
ProgramFiles 就是系统的Program Files的路径啦,一般都是C:\Program Files,这就是安装软件时默认的安装路径了
Prompt 个性化设置cmd提示符的必备武器!不过,我没怎么用过~
SystemDrive 包含系统根目录的分区,其实就是HomeDrive了
SystemRoot 系统根目录路径,一般都是C:\WINDOWS
Temp、Tmp 文件、程序等可使用的临时目录,默认是C:\WINDOWS\Temp或Tmp。几乎所有的程序在运行时都会在这个目录里面“临时”写入文件。一般情况下,程序写入的临时文件都应该被该程序删除,可惜的是,大部分的程序都很健忘,导致这个文件夹占据的空间越来越大,自然也就使我们的系统增肥喽。所以,我们要把它修改到其他分区,并且时时的清理里面的临时文件。
UserName 当前用户名,即所登陆的账户名
UserProfile 当前用户的配置目录,一般都是C:\Documents and Settings\%UserName%。默认情况下,我们的桌面就是这个目录下面的“桌面”文件夹;我的文档就是这个目录下面的“My Documents”文件夹。所以啦,往桌面上或我的文档里面放东西就是放到这个文件夹下面了,也就是放到C盘了,重装系统时要覆盖C盘内容的,所以桌面上或我的文档里面的东西当然就会Gone with the Wind了~解决方法有两个,一是保持良好的习惯,不把重要文件放到这两个地方;二是,修改默认设置,将这两个文件夹都移到其他分区。
WinDir操作系统路径,其实就是SystemRoot了
二用户变量
编写批处理程序时,用户根据需要自己定义的变量称之为用户变量。用户变量类似于C语言里面的变量,仅仅在定义该变量的程序中有效。
用户变量由set命令定义,这是批处理中非常非常重要的一个操作,从而使set命令成为批处理里面使用频率最高的几个命令之一。关于set命令的使用,参考set /?,本教程也会在后面对其进行讲解。
【 3.变量引用 】
前面的几节课里面,我们已经看到了如何引用变量,即直接用变量名操作变量,通过"%"或"!"来获取变量的值。其中,只有在for语句里面重复对同一变量多次赋值时才需要使用"!",并且在使用"!"调用变量时,要首先“启用延迟环境变量扩充”,启动命令为:SetLocal EnableDelayedExpansion。另外需要说明的是,“启用延迟环境变量扩充”后,所有的"!"都将被视为“取变量值”的特殊符号,即使用"^!"也不能输出符号"!"。若要输出"!",则需要“停用延迟环境变量扩充”,命令为:SetLocal DisableDelayedExpansion
三参数
跟C语言类似,在调用函数或其他批处理时可能需要传递参数。批处理的参数传递分为直接和间接两种传递参数的方法。
【 1.直接传递 】
直接传递参数,即在使用call命令时,不使用任何参数,在子函数或子批处理里面直接对主函数(也称父批处理)里面的变量进行修改。这跟汇编语言里面的参数传递方式类似。
直接传递参数举例:
===============================================
@echo off
setlocal enabledelayedexpansion
set var=aCdehiM,?mnrstW y
echo %var%
call :deal
setlocal disabledelayedexpansion
set var=%var:?=!%
echo %var%
pause>nul
exit
:deal
set tm=!var!
set var=
for %%i in (6,3,11,11,16,15,1,4,11,5,12,13,9,0,12,7,15,14,5,10,2,16,18,8) do (
set var=!var!!tm:~%%i,1!
goto :eof
===============================================
可以发现,当我们把变量var作为参数赋予子函数:deal后,子函数对var的值进行了修改;当子函数返回后,主函数里面的var的值就已经是子函数里面var被修改后的值了。
该例子中,使用了本节课前面讲到的setlocal enabledelayedexpansion和setlocal disabledelayedexpansion,前者保证了var在for循环里面能够根据我们的意愿进行处理,后者保证了能够正确输出符号"!"。另外例子中还使用了命令set,利用set对字符串进行了处理。还有一个地方使用了语句goto :eof,该语句相当于C语言里面的return或汇编语言里面的RET,即子程序返回命令。需要说明的是,当子函数本身就在批处理文件的末尾的话,我们是可以省略这句话的,比如将此例的goto :eof删除是不会产生任何影响的。
【 2.间接传递 】
间接传递参数,即在使用call命令时,在其后面添加参数,形如call {[:label][ChildBatch]} Parameter1 Parameter2 ... ParameterN。这跟C语言里面传递参数的格式类似。不同于C语言,批处理中的子函数不需要定义形参,更不需要指定参数的个数。传递过来的参数,在子函数或子批处理里面是以%1~%9的形式表示的,即%1~%9分别表示传递过来的第1~9个参数。
===============================================
@echo off
call :deal aaa bbb "c c" ddd eee
pause>nul
exit
:deal
echo %%0 = %0
echo %%1 = %1
echo %%2 = %2
echo %%3 = %3
echo %%4 = %4
echo %%5 = %5
===============================================
通过这个例子就可以清晰的看到%n参数表示法的用法。参数列表中包含空格的依旧要用双引号(")引起来;另外,也可以看到,%0已经变成了子函数的标号了,而不是父批处理的文件名全称。
【 3.区别 】
这两种参数传递方法本质上是没有区别的,形式上,直接传递直接对原变量进行操作,丢失了原变量的值;间接传递则通过%n对原变量进行了简单的备份,并且通用性更强,即不限定原变量的名称。另外,使用%n还有一个非常大的好处,就是可以通过%~*i来加强处理变量的能力。关于%~*i,详细内容参见for /?。
针对二者的差别,可以根据情况决定使用哪种传递方式:
--1.作为参数的变量名固定、且在子函数中不需要对其进行备份的情况下,使用直接传递法;
--2.若将子函数作为一个通用的程序模块,以适应于对不同变量的处理,或者作为参数的变量不需要备份时,使用间接传递法。
具体使用哪种方法,还需根据实际情况或使用习惯进行选择。
四返回值
有些命令在执行之后将会返回一定的错误值(errorlevel),可以通过errorlevel的值判断命令执行的状况。这点类似于C语言里面的exit(num),num就是错误代码。
获取返回值errorlevel的方法就是,在执行命令后,立马调用返回值errorlevel,如echo %errorlevel%或者if %errorlevel%==1等命令。
errorlevel举例:
===============================================
@echo off
reg add HKCU /v try /f>nul
reg delete HKCU /v try /f
if errorlevel 0 (echo删除成功!) else (echo 删除失败!)
reg delete HKCU /v try /f
if %errorlevel%==0 (echo 删除成功!) else (echo 删除失败!)
pause>nul
===============================================
上面例子中,由于第一成功的删除了注册表,导致第二次因为找不到注册表而宣告失败。同时我们也看到了errorlevel的使用方法,即if errorlevel 0和if %errorlevel%==0是一样的。也许你注意到了,里面还有个笑脸呢~O(∩_∩)O哈哈~这就是ASCII码啦,后面跟你讲啊…
一般情况下,程序或命令成功执行时,返回的errorlevel是0,错误时返回1或更高的值。当然,有些命令是没有返回值的,这点需要注意。
嗯,有没有想起前面有个类似的东西啊?对了,那就是||和&&;了,这两个符号就是根据errorlevel的值来进行逻辑判断的。
五ASCII码
前面的例子中,我们已经使用过一次ASCII码了,也就是那个笑脸。ASCII码是图形化的符号,可以用来点缀我们的批处理的。
在cmd窗口中我们可以通过任意一个字符的ASCII码来输入该字符,比如Ctrl+G、Ctrl+N等,字母a-z对应ASCII码的97-122。对于ASCII码大于26的字符,可以通过这个方法来输入:按住Alt键不松,通过小键盘输入ASCII码的十进制值,松开Alt键即可。
ArcGIS中的批处理
可别告诉我您不知道什么是批处理,当面对一大堆需要重复操作的数据时,往往让我们感到头大,这时候我们会想到批处理[1]  ,那ArcGIS给大家提供了哪些批处理的方法呢,让我们拭目以待。
假设我们需要给道路建立缓冲区,设计到的工具为Buffer。
第一种情况,一个图层中不同要素建立不同大小的缓冲区
不同类型的道路,我们需要建立不同大小的缓冲区,比如,一级道路建立10米的缓冲区,二级道路建立15米的缓冲区,三级道建立20米的缓冲区。
步骤:
1、 首先应该保证你的道路数据里面有一个属性字段是用来存储Buffer宽度信息的。
2、 应用Buffer工具,在对应的参数位置选择相应字段即可。
第二种情况,不同的图层建立不同大小的缓冲区
假设还有其他不同的数据,不仅仅是道路,这些图层都需要建立缓冲区。
步骤:
1、 找到Buffer工具,右键,选择Batch,打开批处理面板。从该面板上我们可以发现,参数与我们打开Buffer的参数是一样的,这个时候是不是可以考虑在EXCEL中批量编辑好,然后复制过来呢
2、 在Excel中编辑需要的数据。
3、 将在Excel中编辑的数据复制到Buffer的批处理面板中来。此处需要注意,如果要复制10行数据,需要在批处理面板中先选中10行,右键单击,选择“paste”。
4、 点击OK即可。
如果想要每个图层中每种类型的数据的缓冲区宽度都不一样,该怎样处理的?这个留给您来尝试吧,原理很简单,就是找到参数位置,写上对应的字段即可。
第三种情况,Python实现批处理
如果您觉得上面的方法比较麻烦,而且要求也比较严格,您可以考虑应用Python来处理。
步骤:
1、 编写代码
import arcpy,os
inFCs = arcpy.GetParameterAsText(0)
outWS = arcpy.GetParameterAsText(1)
dist = arcpy.GetParameterAsText(2)
inFCs = inFCs.split(";")
for inFC in inFCs:
fileName =os.path.split(inFC)[1]
arcpy.Buffer_analysis(inFC,outWS + "\\" + fileName, str(dist) + "meter")
上面这段代码,要求用户自己设置输入数据、输出数据、缓冲区宽度(单位为米)。这里输出缓冲区数据的名称和输入数据的名称一样,如果不想要这样,可以进一步修改代码。
 
 

打印本页 || 关闭窗口
博狗bodog 版权所有
Copyright © 2010-2020 Powered by picusIT 蜀icp备11007773号-8