linux下.sh脚本编写、window下.bat(.cmd)脚本编写

本文详细介绍Windows批处理(.bat)文件的编写技巧,包括注释、变量设置、条件语句、循环控制等内容。涵盖注释命令的使用、自定义变量设置、系统变量介绍、条件与循环语句的应用以及子程序调用等核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

0、写在前面

1、linux下.sh脚本编写

2、window下.bat脚本编写

注释命令 【rem  和 ::】

【echo 和 @】 

 pause

errorlevel  程序返回码

title 、color 

自定义变量(set) 

系统变量

goto 和:

if 、else条件语句

for

循环语句(搬运他人)

子程序(CALL)


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 AutoPKG

set /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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值