目录
0、写在前面
1、linux下.sh脚本编写
2、window下.bat脚本编写
-
注释命令 【rem 和 ::】
REM 该命令后的内容不被执行,但能回显。
:: 也可以起到rem 的注释作用, 但有两点需要注意:
第一, 任何以冒号:开头的字符行, 在批处理中都被视作标号, 而直接忽略其后的所有内容。
有效标号:冒号后紧跟一个以字母数字开头的字符串,goto语句可以识别。
无效标号:冒号后紧跟一个非字母数字的一个特殊符号,goto无法识别的标号,可以起到注释作用,所以 :: 常被用作注释符号,其实 :+ 也可起注释作用。
第 二, 与rem 不同的是, ::后的字符行在执行时不会回显, 无论是否用echo on打开命令行回显状态, 因为命令解释器不认为他是一个有效的命令行, 就此点来看, rem 在某些场合下将比 :: 更为适用; 另外, rem 可以用于 config.sys 文件中。行内注释格式:%注释内容% (不常用,慎用)
-
【echo 和 @】
@字符放在命令前将关闭该命令回显,无论此时echo是否为打开状态。
echo功能: 1.打开或关闭回显功能
2.显示当前echo设置状态 eg: echo
3.输出提示信息 eg: echo 信息内容
4.关闭dos命令提示符 eg: echo off
5.输出空行,即相当于输入一个回车 :eg: echo.(别忘记这个点)
6.建立新文件或增加文件内容 eg: echo 文件内容 > 文件名
echo 文件内容 >> 文件名
-
pause
在这里就是停止系统命令的执行并显示下面的内容。例:PAUSE 运行显示:请按任意键继续. . .
要显示其他提示语,可以这样用:
echo 其他提示语 & pause > nul
-
errorlevel 程序返回码
每个命令运行结束,可以用这个命令行格式查看返回码
用于判断刚才的命令是否执行成功
默认值为0,一般命令执行出错会设 errorlevel 为1
-
title 、color
title 设置cmd窗口的标题
title 新标题 #可以看到cmd窗口的标题栏变了color 设置默认的控制台前景和背景颜色。
color [attr] attr 指定控制台输出的颜色属性
颜色属性由两个十六进制数字指定 -- 第一个为背景,第二个则为前景。每个数字可以为以下任何值之一:
0 = 黑色 8 = 灰色
1 = 蓝色 9 = 淡蓝色
2 = 绿色 A = 淡绿色
3 = 湖蓝色 B = 淡浅绿色
4 = 红色 C = 淡红色
5 = 紫色 D = 淡紫色
6 = 黄色 E = 淡黄色
7 = 白色 F = 亮白色
例如: "COLOR fc" 在亮白色上产生亮红色
-
自定义变量(set)
@echo off set var=value echo %var% pause
var为变量名,=号右变的是要给变量的值
- 如果我们想让用户手工输入变量的值,而不是在代码里指定,可以用用set命令的/p参数
@echo off set /p var=请输入变量的值 echo %var% pause
var变量名 =号右边的是提示语,不是变量的值
变量的值由我们运行后自己用键盘输入!
-
系统变量
- %0 %1 %2 %3 %4 %5 ......一直到%9 还有一个%*
%0 这个有点特殊,有几层意思,先讲%1-%9的意思.
%1 返回批处理的第一个参数
%2 返回批处理的第二个参数
%3-%9依此推类例子:
- %0 这个不是返回参数的值了,他有两层意思!
第一层意思:返回批处理所在绝对路径
例子:@echo off
echo %0
pause保存为test.BAT放在桌面运行,会显示如下结果
"C:\Documents and Settings\Administrator\桌面\test.bat"
他把当前批处理执行的所在路经打印出来了,这就是返回批处理所在绝对路径的意思
第二层意思:无限循环执行BAT
例子:@echo off
net user
%0保存为BAT执行,他就会无限循环执行net user这条命令,直到你手动停止.
补充:其实%0就是第一参数%1前面那个参数,当然就是批处理文件名(包括路径)。
- 其他
%COMPUTERNAME% 系统 返回计算机的名称。
%COMSPEC% 系统 返回命令行解释器可执行程序的准确路径。
%DATE% 系统 返回当前日期。使用与 date /t 命令相同的格式。由 Cmd.exe 生成。有关
date 命令的详细信息,请参阅 Date。
%ERRORLEVEL% 系统 返回上一条命令的错误代码。通常用非零值表示错误。等等
-
goto 和:
GOTO会点编程的朋友就会知道这是跳转的意思。
在批处理中允许以“:XXX”来构建一个标号,然后用GOTO XXX跳转到标号:XXX处,然后执行标号后的命令。
例:@echo off :start set /a var+=1 echo %var% if %var% leq 3 GOTO start pause
-
if 、else条件语句
(1) if [NOT] ERRORLEVEL number
if ERRORLEVEL 这个句子必须放在某一个命令的后面,执行命令后由IF ERRORLEVEL 来判断命令的返回值。
Number的数字取值范围0~255,判断时值的排列顺序应该由大到小。返回的值大于等于指定的值时,条件成立
例:@echo off dir c: rem退出代码为>=1就跳至标题1处执行,>=0就跳至标题0处执行 IF ERRORLEVEL 1 goto 1 IF ERRORLEVEL 0 goto 0 Rem 上面的两行不可交换位置,否则失败了也显示成功。 :0 echo 命令执行成功! Rem 程序执行完毕跳至标题exit处退出 goto exit :1 echo 命令执行失败! Rem 程序执行完毕跳至标题exit处退出 goto exit :exit pause
(2) IF [NOT] string1==string2 command
string1和string2都为字符的数据,英文内字符的大小写将看作不同,这个条件中的等于号必须是两个(绝对相等的意思)条件相等后即执行后面的command
检测当前变量的值做出判断,为了防止字符串中含有空格,可用以下格式
if [NOT] {string1}=={string2} command
if [NOT] [string1]==[string2] command
if [NOT] "string1"=="string2" command
这种写法实际上将括号或引号当成字符串的一部分了,只要等号左右两边一致就行了,比如下面的写法就不行:
if {string1}==[string2] command(3) IF [NOT] EXIST filename command
EXIST filename为文件或目录存在的意思
注意:if else , else必须严格按照以下格式进行 else 需和if )在同一行,且两边需要空格
@echo off //关闭回显
set wml_path=%cd%\wml //设置变量
echo %wml_path%
if not exist %wml_path% (
mkdir wml
) else (
echo wml has exist!)
pause
增强用法:
增强用法:IF [/I] string1 compare-op string2 command
增强用法中加上/I就不区分大小写了!
增强用法中还有一些用来判断数字的符号:EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
-
for
基本格式:
for %%variable in (set) do commend [command-parameters]
%%variable 指定一个单一字母表示可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters 为特定命令指定参数或命令行开关。参数:FOR有4个参数 /d /l /r /f
- /d: 用于目录搜索
- /l: 也是和目录有关,他比 /d 强大
- /r: 集表示以增量形式从开始到结束的一个数字序列,的一个遍历
- /f: 迭代及文件解析
应用举例
- /d 目录搜索,不是文件搜索
@echo off for /d %%i in (c:\*) do echo %%i pause
会把C盘根目录下的全部目录名字打印出来
- /r 搜索指定目录树(即包括子目录)的符合通配符的所有文件
@echo off for /r c:\ %%i in (*.exe) do echo %%i pause
会把C盘根目录,和每个目录的子目录下面全部的EXE文件都列出来了!
- /l 遍历数字序列
@echo off for /l %%i in (1,1,5) do @echo %%i pause
他会打印从1 2 3 4 5 这样5个数字
- /f 迭代文件解析 (有点复杂)
格式:
- FOR /F ["options"] %%i IN (file) DO command
- FOR /F ["options"] %%i IN ("string") DO command
- FOR /F ["options"] %%i IN ('command') DO command
file代表一个或多个文件
string 代表字符串
command代表命令
["options"] 可选带引号的字符串"options"包括一个或多个
指定不同解析选项的关键字。这些关键字为:
eol=c - 指一个行注释字符的结尾(就一个)(备注:默认以使用;号为行首字符的为注释行)
skip=n - 指在文件开始时忽略的行数,(备注:最小为1,n可以大于文件的总行数,默认为1。)
delims=xxx - 指分隔符集。这个替换了空格和跳格键的默认分隔符集。
tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代
file为文件名,按照官方的说法是,for会依次将file中的文件打开,并且在进行到下一个文件之前将每个文件读取 到内存,按照每一行分成一个一个的元素,忽略空白的行
实例说明:
eol 忽略分号开头的行
tokens :分为三个字段 1,3 ,* ,所以需要三个变量:%i,%就,%k (i,j,k还必须按照字母顺序)
delims:按照=,-,“ ”来分割每一行
-
循环语句(搬运他人)
- 1、指定次数循环
FOR /L %variable IN (start,step,end) DO command [command-parameters]
组合命令:
FOR /L %variable IN (start,step,end) DO (
Command1
Command2
……
)
- 2、对某集合执行循环语句。
FOR %%variable IN (set) DO command [command-parameters]
%%variable 指定一个单一字母可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 对每个文件执行的命令,可用小括号使用多条命令组合。FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
检查以 [drive:]path 为根的目录树,指向每个目录中的
FOR 语句。如果在 /R 后没有指定目录,则使用当前
目录。如果集仅为一个单点(.)字符,则枚举该目录树。同前面一样,command可以用括号来组合:
FOR /R [[drive:]path] %variable IN (set) DO (
Command1
Command2
……
commandn
)
- 3、条件循环
上面的循环结构是用for命令来实现的,for命令循环有一个缺点,就是整个循环被当作一条命令语句,涉及到变量延迟的问题。
利用goto语句和条件判断,dos可以实现条件循环
@echo off set var=100 rem ************循环开始了 :continue echo 第%var%次循环 set /a var-=1 if %var% gtr 0 goto continue rem ************循环结束了 echo 循环执行完毕 pause
-
子程序(CALL)
子程序调用格式:
CALL :label arguments
子程序语法:
:label
command1
command2
......
commandn
goto :eof
1.在子程序段中,参数%0指标签:label ,%1代表第一个参数,以此类推
2.子过程一般放在最后,并且注意在主程序最后要加上exit或跳转语句,避免错误的进入子过程。
3.子程序和主程序中的变量都是全局变量,其作用范围都是整个批处理程序。
4.传至子程序的参数在call语句中指定,在子程序中用%1、%2至%9的形式调用,而子程序返回主程序的数据只需在调用结束后直接引用就可以了,当然也可以指定返回变量
例子:
案列:
setlocal enabledelayedexpansion
cd ..
set currentDir=%cd%
set svndir= %currentDir%/source/view/setting/FSvnVersion.h
echo %svndir%
set name=fsdf1234
For /f "usebackq delims=" %%2 in (%svndir%) do (
set /a n+=1
if !n!==3 set name=%%2
)
set svnnum=%name:~-5,4%
cd AutoPKGset /p SVN=Input SVN(eg:T5060):
if "%SVN%"=="" set SVN=FFR_Application_%svnnum%7z a -ttar app.tar ./resource/
7z a -tgzip %SVN%.tgz app.tar
ren %SVN%.gz %SVN%.bin
del /q /s app.tar
UpdateFileMakeTool.exe %SVN%.bin
pause