windowsShell脚本语法
windows Shell 脚本语法
扩展名是bat(在nt/2000/xp/2003下也可以是cmd)的⽂件就是批处理⽂件。
==== 注 =======================================
.bat是dos下的批处理⽂件
.cmd是nt内核命令⾏环境的另⼀种批处理⽂件
从 更⼴义的⾓度来看,unix的shell脚本以及其它甚⾄应⽤程序中由外壳进⾏解释执⾏的⽂本,都具有与批处理⽂件⼗分相似的作⽤,⽽且同样是由 专⽤解释器以⾏为单位解释执⾏,这种⽂本形式更通⽤的称谓是脚本语⾔。所以从某个程度分析,batch, unix shell, awk, basic, perl 等脚本语⾔都是⼀样的,只不过应⽤的范围和解释的平台各有不同⽽已。甚⾄有些应⽤程序仍然沿⽤批处理这⼀称呼,⽽其内容和扩展名与dos的批处理却⼜完全 不同。
===================================
⾸先批处理⽂件是⼀个⽂本⽂件,这个⽂件的每⼀⾏都是⼀条DOS命令(⼤部分时候就好象我们在DOS提⽰符下执⾏的命令⾏⼀样),你可以使⽤DOS下的Edit或者Windows的记事本(notepad)等任何⽂本⽂件编辑⼯具创建和修改批处理⽂件。
==== 注 ===================
批 处理⽂件中完全可以使⽤⾮dos命令,甚⾄可以使⽤不具有可执⾏特性的普通数据性⽂件,这缘于windows系统这个新型解释平台的涉⼊,使得批处理的应 ⽤越来越"边缘化"。所以我们讨论的批处理应该限定在dos环境或者命令⾏环境中,否则很多观念和设定都需要做⽐较⼤的变动。
========================
其 次,批处理⽂件是⼀种简单的程序,可以通过条件语句(if)和流程控制语句(goto)来控制命令运⾏的流程,在批处理中也可以使⽤循环语句(for)来 循环执⾏⼀条命令。当然,批处理⽂件的编程能⼒与等编程语句⽐起来是⼗分有限的,也是⼗分不规范的。批处理的程序语句就是⼀条条的DOS命令(包括 内部命令和外部命令),⽽批处理的能⼒主要取决于你所使⽤的命令。
==== 注 ==================
批 处理⽂件(batch file)也可以称之为批处理程序(batch program),这⼀点与编译型语⾔有所不同,就
来说,扩展名为c或者cpp的⽂件可以称之为c语⾔⽂件或者c语⾔源代码,但只有编译连接后的 exe⽂件才可以称之为c语⾔程序。因为批处理⽂件本⾝既具有⽂本的可读性,⼜具有程序的可执⾏性,这些称谓的界限是⽐较模糊的。
===========================
第 三,每个编写好的批处理⽂件都相当于⼀个DOS的外部命令,你可以把它所在的⽬录放到你的DOS搜索路径(path)中来使得它可以在任意位置运⾏。⼀个 良好的习惯是在硬盘上建⽴⼀个bat或者batch⽬录(例如C:/BATCH),然后将所有你编写的批处理⽂件放到该⽬录中,这样只要在path中设置 上c:/batch,你就可以在任意位置运⾏所有你编写的批处理程序。
==== 注 =====
纯以dos系统⽽⾔,可执 ⾏程序⼤约可以细分为五类,依照执⾏优先级由⾼到低排列分别是:DOSKEY宏命令(预先驻留内存),COMMAND.COM中的内部命令(根据内存的环 境随时进驻内存),以com为扩展名的可执⾏程序(由command 直接载⼊内存),以exe位扩展名的可执⾏程序(由command 重定位后载⼊内存),以bat位扩展名的批处理程序(由command 解释分析,根据其内容按优先级顺序调⽤第2,3,4,5种可执⾏程序,分析⼀⾏,执⾏⼀⾏,⽂件本⾝不载⼊内存)
============ 第 四,在DOS和Win9x/Me系统下,C:盘根⽬录下的AUTOEXEC.BAT批处理⽂件是⾃动运⾏批处理⽂件,每次系统启动时会⾃动运⾏该⽂件,你 可以将系统每次启动时都要运⾏的命令放⼊该⽂件中,例如设置搜索路径,调⼊⿏标驱动和磁盘缓存,设置系统环境变量等。下⾯是⼀个运⾏于Windows 98下的autoexec.bat的⽰例:
@ECHO OFF
PATH C:/WINDOWS;C:/WINDOWS/COMMAND;C:/UCDOS;C:/DOSTools;<br>
C:/SYSTOOLS;C:/WINTOOLS;C:/BATCH
LH SMARTDRV.EXE /X
LH DOSKEY.COM /insert
LH CTMOUSE.EXE
SET TEMP=D:/TEMP
SET TMP=D:/TEMP
==== 注 =====
AUTOEXEC.BAT为DOS系统的⾃动运⾏批处理⽂件,由COMMAND.COM启动时解释执⾏;
⽽在Win9x环境中,不仅增加⽀持了 DOSSTART.BAT, WINSTART.BAT 等许多其它⾃动运⾏的批处理⽂件,对AUTOEXEC.BAT 也增加了 .DOS .W40 .BAK .OLD .PWS 等许多变体以适应复杂的环境和多变的需求。
==== willsort 编注 =============
以 下关于命令的分类,有很多值得推敲的地⽅。常⽤命令中的@本不是命令,⽽dir、copy等也很常⽤的命令却没有列⼊,
⽽特殊命令中所有命令对我来说都是常⽤命令。建议将批处理所引⽤的命令分为内部命令、外部命令、第三⽅程序三类。⽽内部命令和外部命令中别有⼀类是专⽤于 或常⽤于批处理中的命令可称之为"批处理命令"。
以下摘录MS-DOS 6.22 帮助⽂档中关于"批处理命令"的⽂字,当然,其中有些概念和定义已经有些落后了。
批处理命令
批处理⽂件或批处理程序是⼀个包含若⼲MS-DOS命令的正⽂⽂件,扩展名为.BAT。当在命令提⽰符下敲⼊批处理程序的名称时,MS-DOS成组执⾏此批处理程序中的命令。
任何在命令提⽰符下可使⽤的命令都可⽤在批处理程序中。此外,下⾯MS-DOS命令是专门在批处理程序中使⽤的。
==========
常⽤命令
echo、@、call、pause、rem(⼩技巧:⽤::代替rem)是批处理⽂件最常⽤的⼏个命令,我们就从他们开始学起。
==== 注 ===========
⾸先, @ 不是⼀个命令, ⽽是DOS 批处理的⼀个特殊标记符, 仅⽤于屏蔽命令⾏回显. 下⾯是DOS命令⾏或批处理中可能会见到的⼀些特殊标记符:
CR(0D) 命令⾏结束符
Escape(1B) ANSI转义字符引导符
Space(20) 常⽤的参数界定符
Tab(09) ; = 不常⽤的参数界定符
+ COPY命令⽂件连接符
* ? ⽂件通配符
"" 字符串界定符
| 命令管道符
< > >> ⽂件重定向符
@ 命令⾏回显屏蔽符
/ 参数开关引导符
: 批处理标签引导符
% 批处理变量引导符
其次, :: 确实可以起到rem 的注释作⽤, ⽽且更简洁有效; 但有两点需要注意:
第⼀, 除了 :: 之外, 任何以 :开头的字符⾏, 在批处理中都被视作标号, ⽽直接忽略其后的所有内容, 只是为了与正常的标号相区别, 建议使⽤ goto 所⽆法识别的标号, 即在 :后紧跟⼀个⾮字母数字的⼀个特殊符号.
第 ⼆, 与rem 不同的是, ::后的字符⾏在执⾏时不会回显, ⽆论是否⽤echo on打开命令⾏回显状态, 因为命令解释器不认为他是⼀个有效的命令⾏, 就此点来看, rem 在某些场合下将⽐ :: 更为适⽤; 另外, rem 可以⽤于 config.sys ⽂件中.
=====================
echo 表⽰显⽰此命令后的字符
echo off 表⽰在此语句后所有运⾏的命令都不显⽰命令⾏本⾝
@与echo off相象,但它是加在每个命令⾏的最前⾯,表⽰运⾏时不显⽰这⼀⾏的命令⾏(只能影响当前⾏)。
call 调⽤另⼀个批处理⽂件(如果不⽤call⽽直接调⽤别的批处理⽂件,那么执⾏完那个批处理⽂件后将⽆法返回当前⽂件并执⾏当前⽂件的后续命令)。
pause 运⾏此句会暂停批处理的执⾏并在屏幕上显⽰Press any key 的提⽰,等待⽤户按任意键后继续
rem 表⽰此命令后的字符为解释⾏(注释),不执⾏,只是给⾃⼰今后参考⽤的(相当于程序中的注释)。
==== 注 =====
此处的描述较为混乱, 不如直接引⽤个命令的命令⾏帮助更为条理
-------------------------
ECHO
当程序运⾏时,显⽰或隐藏批处理程序中的正⽂。也可⽤于允许或禁⽌命令的回显。
在运⾏批处理程序时,MS-DOS⼀般在屏幕上显⽰(回显)批处理程序中的命令。
使⽤ECHO命令可关闭此功能。
语法
ECHO [ON|OFF]
若要⽤echo命令显⽰⼀条命令,可⽤下述语法:
echo [message]
参数
ON|OFF
指定是否允许命令的回显。若要显⽰当前的ECHO的设置,可使⽤不带参数的ECHO
命令。
message
指定让MS-DOS在屏幕上显⽰的正⽂。
-------------------
CALL
从⼀个批处理程序中调⽤另⼀个批处理程序,⽽不会引起第⼀个批处理的中⽌。
语法
CALL [drive:][path]filename [batch-parameters]
参数
[drive:][path]filename
指定要调⽤的批处理程序的名字及其存放处。⽂件名必须⽤.BAT作扩展名。
batch-parameters
指定批处理程序所需的命令⾏信息。
-------------------------------
PAUSE
暂停批处理程序的执⾏并显⽰⼀条消息,提⽰⽤户按任意键继续执⾏。只能在批处
理程序中使⽤该命令。
语法
PAUSE
REM
在批处理⽂件或CONFIG.SYS中加⼊注解。也可⽤REM命令来屏蔽命令(在CONFIG.SYS
中也可以⽤分号 ; 代替REM命令,但在批处理⽂件中则不能替代)。
语法
REM [string]
参数
string
指定要屏蔽的命令或要包含的注解。
=======================
例1:⽤edit编辑a.bat⽂件,输⼊下列内容后存盘为c:/a.bat,执⾏该批处理⽂件后可实现:将根⽬录中所有⽂件写⼊ a.txt 中,启动UCDOS,进⼊WPS等功能。
  批处理⽂件的内容为:        命令注释:
    @echo off           不显⽰后续命令⾏及当前命令⾏
    dir c:/*.* &       将c盘⽂件列表写⼊a.txt
    call c:/ucdos/ucdos.bat    调⽤ucdos
    echo 你好            显⽰"你好"
    pause              暂停,等待按键继续
    rem 准备运⾏wps        注释:准备运⾏wps
    cd ucdos            进⼊ucdos⽬录
    wps              运⾏wps 
批处理⽂件的参数
批处理⽂件还可以像C语⾔的函数⼀样使⽤参数(相当于DOS命令的命令⾏参数),这需要⽤到⼀个参数表⽰符"%"。
%[1-9]表⽰参数,参数是指在运⾏批处理⽂件时在⽂件名后加的以空格(或者Tab)分隔的字符串。变量可以从%0
到%9,%0表⽰批处理命令本⾝,其它参数字符串⽤%1到%9顺序表⽰。
例2:C:根⽬录下有⼀批处理⽂件名为f.bat,内容为:
@echo off
format %1
如果执⾏C:/>f a:
那么在执⾏f.bat时,%1就表⽰a:,这样format %1就相当于format a:,于是上⾯的命令运⾏时实际执⾏的是format a:
例3:C:根⽬录下⼀批处理⽂件名为t.bat,内容为:
@echo off
type %1
type %2
那么运⾏C:/> b.txt
%1 : 表⽰a.txt
%2 : 表⽰b.txt
于是上⾯的命令将顺序地显⽰a.txt和b.txt⽂件的内容。
==== 注 ===============
参 数在批处理中也作为变量处理, 所以同样使⽤百分号作为引导符, 其后跟0-9中的⼀个数字构成参数引⽤符. 引⽤符和参数之间 (例如上⽂中的 %1 与 a: ) 的关系类似于变量指针与变量值的关系. 当我们要引⽤第⼗⼀个或更多个参数时, 就必须移动DOS 的参数起始指针. shift 命令正充当了这个移动指针的
⾓⾊, 它将参数的起始指针移动到下⼀个参数, 类似C 语⾔中的指针操作. 图⽰如下:
初始状态, cmd 为命令名, 可以⽤ %0 引⽤
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10
^ ^ ^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | | | |
%0 %1 %2 %3 %4 %5 %6 %7 %8 %9
经过1次shift后, cmd 将⽆法被引⽤
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10
^ ^ ^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | | | |
%0 %1 %2 %3 %4 %5 %6 %7 %8 %9
经过2次shift后, arg1也被废弃, %9指向为空, 没有引⽤意义
cmd arg1 arg2 arg3 arg4 arg5 arg6 arg7 arg8 arg9 arg10
^ ^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | | |
%0 %1 %2 %3 %4 %5 %6 %7 %8
遗憾的是, win9x 和DOS下均不⽀持 shift 的逆操作. 只有在 nt 内核命令⾏环境下, shift 才⽀持 /n 参数, 可以以第⼀参数为基准返复移动起始指针.
=================
特殊命令
if goto choice for是批处理⽂件中⽐较⾼级的命令,如果这⼏个你⽤得很熟练,你就是批处理⽂件的专家啦。
⼀、if 是条件语句,⽤来判断是否符合规定的条件,从⽽决定执⾏不同的命令。 有三种格式:
1、if [not] "参数" == "字符串" 待执⾏的命令
参数如果等于(not表⽰不等,下同)指定的字符串,则条件成⽴,运⾏命令,否则运⾏下⼀句。
例:if "%1"=="a" format a:
====
if 的命令⾏帮助中关于此点的描述为:
IF [NOT] string1==string2 command
在此有以下⼏点需要注意:
1. 包含字符串的双引号不是语法所必须的, ⽽只是习惯上使⽤的⼀种"防空"字符
2. string1 未必是参数, 它也可以是环境变量, 循环变量以及其他字符串常量或变量
3. command 不是语法所必须的, string2 后跟⼀个空格就可以构成⼀个有效的命令⾏
=============================
2、if [not] exist [路径/]⽂件名 待执⾏的命令
如果有指定的⽂件,则条件成⽴,运⾏命令,否则运⾏下⼀句。
如: if exist c:/config.sys type c:/config.sys
表⽰如果存在c:/config.sys⽂件,则显⽰它的内容。shell代码

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。