5

常用脚本学习手册——Bat脚本 - 秋落雨微凉

 1 year ago
source link: https://www.cnblogs.com/qiuluoyuweiliang/p/17288356.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

常用脚本学习手册——Bat脚本

我们在日常工作中常常会遇到一些需要重复进行的工作,又或者我们的项目在转交客户时需要去简化配置过程

这时我们就需要使用到一些自动化部署操作,我们常常会采用脚本来完成这部分功能

下面我们来介绍一种脚本类型Bat脚本,我们会从以下方面介绍:

  • Bat脚本基本语法
  • Bat脚本常用语法
  • Bat脚本进阶内容

首先我们需要去简单了解一下脚本

首先我们需要知道脚本是什么:

  • 脚本是一种特殊文件,借助这种文件我们可以快速实现一些配置设置或快速启动某些部件

那么脚本具有什么优势:

  • 脚本的语言相对而言比较简单易学,可以快速掌握
  • 脚本可以使用任何文本文件编辑工具创建和修改,简单便捷
  • 脚本通过一次书写多次执行的方式来简化多次代码的书写,加快速度
  • 脚本可以提前设置执行方式,使我们在部署或其他方面简化操作,封装内部快速使用

那么市面上常见的脚本都有哪些:

  • python:目前比较常用的语言之一,这里推荐简单学习一下
  • Shell:Shell既是一种命令语言,又是一种 程序设计语言 ,也就是我们所说的脚本,以sh结尾的文件
  • Bat:Bat也是一种常见的脚本语言,具有低廉的学习成本,可以快速掌握并用于一些简单操作,双击执行即可

Bat脚本简介

首先我们需要先去了解一下Bat脚本:

  • Bat脚本是一种以.bat结尾的文件,可以直接双击点击使用即可

  • 全称batch脚本,也称批处理文件,是Windows系统默认支持的脚本语言

然后我们给出一个简单的Bat脚本,介绍一下基本格式:

REM 这是注释,@echo off表示关闭Bat脚本内容展示
@echo off

REM set表示定义变量
set name=123

REM echo表示页面输出,%%中包含变量名可以使用变量
echo %name%

REM goto:eof表示结束不再继续下面的内容
goto:eof

Bat脚本基本语法

下面我们会介绍Bat的基本语法内容

注释@和REM和::

首先我们介绍注释信息:

  • @:表示不显示本行信息,但是仍执行

  • REM:表示注释信息,该注释信息不会显示

  • "::":也表示注释信息,实际上":"加任意符号都可以表示无信息显示,但我们通常用::来表示注释

我们给出简单示例:

REM 我是注释

:: 我是注释

输出echo

首先我们来介绍echo的五种用处:

  • echo txt :直接输出语句
  • echo. : 表示换行符
  • echo text > txt文件 :将text覆盖在txt文件中
  • echo text >> txt文件 :将text追加在txt文件中
  • echo on/off: bat语句信息是否展示

我们给出简单示例:

REM 我们采用@来隐藏该行指令,这样本行就不会出现在界面
REM 我们使用echo off,那么我们后续的指令就不会出现在界面中
@echo off

REM 正常输出语句
echo 123

REM 这里如果我们输出所拼接的字符串,直接拼接即可
echo hello world

REM  表示换行符
echo.

REM 表示将123写入t.txt文本中
echo 123 > t.txt

REM 表示将456覆盖进t.txt文本中,这时文本内为456
echo 123 > t.txt

REM 表示将789追加到t.txt文本中,这时文本内为789
echo 789 >> t.txt

暂停pause

我们先来简单介绍一个pause:

  • pause:用于暂时暂停界面,当我们输入其他信息时界面继续运行

我们常常会将其用于暂停页面查看信息:

REM 我们采用@来隐藏该行指令,这样本行就不会出现在界面
REM 我们使用echo off,那么我们后续的指令就不会出现在界面中
@echo off

REM 我们查看一个较长的数据
echo 123

REM 我们可以在中途暂停查看数据,点击后查看下一个数据
pause

REM  我们查看一个较长的数据
echo 456

标题title

我们简单介绍title:

  • title:可以用于设置该命令框的名称
  • 我们的bat命令其实就是一个cmd命令执行框,title会修改该框的名称

我们给出简单实例:

@echo off

REM 设置标题为this is a test
title this is a test

参数set

我们先来介绍一下set关键字:

  • set:通常用来定义变量,定义后该变量可以任意使用
  • 变量的使用通常采用%%包围该变量,表示使用该变量的内部数据

我们给出一个简单示例:

@echo off
    
REM set 后跟变量名=变量值,注意不能存在空格
set name=ScriptHome

REM 然后我们可以采用%%去使用该数据
echo %name%

REM 我们可以直接进行拼接
set age=18
echo %name%%age%

REM set的变量值可以进行界面交互获取(set /P 变量名=提示信息)
set /P yourname=你的名字是:

echo %yourname%

跳转goto

下面我们来介绍跳转关键字:

  • goto:goto后面可以跟位置关键字,用于跳转到对应的位置
  • goto通常配合:来使用,使用":名称"来定义跳转位置,然后使用goto:名称来进行跳转

我们给出一个简单实例:

:: goto展示

@echo off

REM 下述是一个死循环,我们正常使用时不能这样书写,下述会一直输出1

:top

echo 1

goto:top

:: goto:eof 表示结束,执行后就不会再执行后续命令

REM 下述命令只会执行1,不会执行2,因为在中间进行了中断

@echo off

echo 1

goto:eof

echo 2

首先我们需要知道Bat脚本其实是基于cmd命令来实现的,所以我们首先给出window的一些常用命令:

windows命令行 功能描述 linux终端
cd 切换工作目录 cd
dir 列出当前文件夹下所有文件 ls [-lh]
type 查看文件内容 cat
md/mkdir 创建目录 mkdir
del 删除文件 rm
rd 删除目录 rm -r
copy/xcopy 拷贝 cp [-r]
cls 清屏 clear
findstr 根据关键字查找 grep
move/rename 移动/重命名 mv/rename
tasklist 查找进程 ps [-ef]
taskkill 杀死进程 kill [-9]

下面我们统一来介绍一些其他语法

::首先我们需要介绍一个Bat脚本中文乱码修复办法:使用 chcp 65001 命令行
::当然我们也可以在保存时手动选择为ANSI编码格式来解决中文乱码问题

@echo off
chcp 65001

set param1=hello
set param2=world

REM 默认情况下可能会导致你好出现乱码状况,但是有chcp 65001相当于选择 ANSI 编码格式,可以修复乱码问题
echo %param1%%param2%你好

::start可以调用同目录级别下的其他文件

Bat脚本常用语法

下面我们来介绍一些关于Bat的常用内容

常用系统变量

除了常用的符号我们还需要注意一些常用的系统变量:

REM 当前工作路径
%CD%

REM 当前日期,格式为"星期日 DD/MM/YYYY"
%DATE%

REM 当前时间,格式为"HH:MM:SS.SS"
%TIME%

REM 一个从0~32767之间的随机数
%RANDOM%

REM 之前的命令是否出错(出错为0,出错为1+)
%ERRORLEVEL%

REM 当前登录用户名
%USERNAME%

REM 当前用户的用户文件夹目录
%USERPROFILE%

REM 当前用户的应用程序数据文件夹目录
%APPDATA%

常用符号介绍

首先我们来介绍Bat中常用的各类符号的功能

命令行回显屏蔽符@

命令行回显屏蔽符@的主要用途:

  • 关闭当前行的回显
  • ECHO OFF可以关闭掉整个批处理命令的回显,但不能关掉ECHO OFF这个命令,所以我们通常采用@来关闭ECHO OFF命令的回显

**批处理变量引导符% **

批处理变量引导符%的主要用途:

  • %%将变量名包围在里面可以表示变量
  • %%将变量名放在最后可以用于表示for的单个元素
  • %0表示该Bat脚本本身,通常可以用于复制文本或者其他的一些操作
  • %(19)表示在执行该Bat脚本时传入的19个参数,可以看作为输入的变量值,可以在bat脚本中使用

**重定向符> **

重定向符>的主要用途:

  • DOS的标准输入输出通常是在标准设备键盘和显示器上进行的,利用重定向,可以方便地将输入输出改向磁盘文件或其它设备
  • “>”:将命令发送到文件或设备,使用大于号“>”时,有些命令输出(例如错误消息)不能重定向
  • “>>”:将命令输出添加到文件结尾而不删除文件中已有的信息
  • “<”:从文件而不是键盘上获取命令所需的输入

**命令管道符| **

命令管道符| 的主要用途:

  • 格式:第一条命令 | 第二条命令 [| 第三条命令...]4
  • 将第一条命令的结果作为第二条命令的参数来使用,例如dir c:|find "txt"查找c盘下的txt文本

**转义字符^ **

转义字符^的主要用途:

  • ^是对特殊符号<,>,&的前导字符
  • 在命令中他将以上3个符号的特殊功能去掉,仅仅只把他们当成符号而不使用他们的特殊意义
  • 此外,^放在echo text的末尾可以表示续行符号,因为每行末尾还有一个看不见的符号,即回车符,所以^会将回车符失去意义

**组合命令& **

组合命令&的主要用途:

  • 语法:第一条命令 & 第二条命令 [& 第三条命令...]
  • 这个符号允许在一行中使用2个以上不同的命令,当第一个命令执行失败了,也不影响后边的命令执行

**组合命令&& **

组合命令&&的主要用途:

  • 语法:第一条命令 && 第二条命令 [&& 第三条命令...]
  • 用这种方法可以同时执行多条命令,当碰到执行出错的命令后将不执行后面的命令,如果一直没有出错则一直执行完所有命令

**组合命令|| **

组合命令|| 的主要用途:

  • 语法:第一条命令 || 第二条命令 [|| 第三条命令...]
  • 用这种方法可以同时执行多条命令,当一条命令失败后才执行第二条命令,当碰到执行正确的命令后将不执行后面的命令

Bat脚本进阶内容

下面我们来介绍Bat脚本中的一些进阶内容

首先我们需要了解Bat脚本中的函数:

  • 函数由":"表示开始函数,同样后面带函数名(实际上类似于goto的跳转概念)
  • 由":函数名"来声明函数并书写函数内容,由"call:函数名"来调用函数并在调用结束后回到原位置执行

我们来给出一些简单的函数实例:

::首先我们先来声明函数

REM 声明两个函数

:method1
	@echo hello
	
:method2
	@echo world

REM 但实际上输出的结果会是helloworld,因为只要存在在bat中该代码都会被执行,所以我们需要一些命令避免执行

:: 我们会采用call来调用函数同时分段在末尾书写goto:eof来中断后续代码执行

REM 声明两个函数并调用第二个函数

@echo off

call:method2
goto:eof

:method1
	@echo hello
	goto:eof
	
:method2
	@echo world
	goto:eof
	
REM 那么我们只会执行world,因为call调用method2,然后method2末尾有goto:eof回到原位置执行第二个goto:eof结束bat文件

下面我们来介绍一下数组:

  • bat的数组在某种意义上来说不能被称为数组,因为它无法通过下标访问
  • bat的数组可以通过set直接定义,一次定义一堆可以被称为数组,一次定义一个并标记下标也可以被称为数组

我们下面给出数组实例:

:: 我们首先给出基础数组

set arr=1,3,5,6,8

REM 这里是一个for循环,我们会在后续介绍,大致意思就是从arr数组种提取数据a,然后展示
for %%a in (%arr%) do (
  @echo %%a
)

:: 然后我们来展示带有下标的数组

set a[0]=1
set a[1]=3
set a[2]=5
set a[3]=7
set a[4]=9
set a[5]=11

REM 这里也是for循环,大致意思从0~5全部遍历一遍为n,然后去获得a[n]的值
for /l %%n in (0,1,5) do (
  @echo !a[%%n]!
)

我们这里介绍的循环是for循环:

  • 基本格式:FOR %%variable IN (set) DO command [command-parameters]

  • 其中%%variable表示我们获取的数组中的各个元素值

  • 其中set表示我们所定义的数组,有的可以是数组,有的可以是自定义的一些数据

  • 最后do(),()中书写所需要执行的for循环内容

我们需要注意的是针对不同的for循环参数具有不同的意义:

  • /D:只能显示当前目录下的目录名字
  • /R:可以把当前或者你指定路径下的文件名字全部读取
  • /L:该集表示以增量形式从开始到结束的一个数字序列
  • /F:使用文件解析来处理命令输出、字符串及文件内容

下面我们给出关于for循环的一些案例:

:: 基本循环语法

for [/d/l/r/f] %%i in () do (
  
)

:: 这里讲解一个知识点:\dir /b 指定目录\ 这个语法可以用于获得指定目录下的所有文件和文件夹

REM  %~dp0等同于%CD%,表示当前路径
set curdir=%~dp0test1\
for /f %%i in ('dir /b "%curdir%"') do (
	echo %%i
)
	

:: /d 表示获取某一目录下的所有文件夹

REM 表示bat同目录级下的所有文件夹
for /d %%i in (%cd%\*) do (
  @echo %%i
)

::  /l 可以使用一个序列来做循环,包含三个参数,第一个参数是开始值,第二个参数是跨步值,第三个参数是结束值

REM 例如下面我们会从1~10每隔两位输出,输出为1,3,5,7,9
for /l %%i in (1 2 10) do (
  echo %%i
)

REM 此外也可以实现倒数输出
for /l %%i in (10 -2 1) do (
  echo %%i
)

::  /r 可以获取某一个目录下所有的文件以及文件夹下的文件

REM 获得该目录下的所有文件及文件夹内的txt文本文件
for /r %%i in (*.txt) do (
  @echo %%i
)

:: /f 读取文件(下述的/表示换行)

REM 例如我们的数据为:
REM ID NAME AGE
REM 1 zhang 18
REM 2 lisi 15
REM 3 wang 19

REM 读取user.txt文件并展示(默认只读取每行第一个空格前的信息)
REM 那么展示的数据就是ID /1 /2 /3
for /f %%a in (user.txt) do (
	echo %%a
)

REM 可以增加一个"delims="的参数,表示不分割读取每一行
REM 那么展示的数据就是ID NAME AGE /1 zhang 18 /2 lisi 15 /3 wang 19
for /f "delims=" %%a in (user.txt) do (
	echo %%a
)

REM 也可以采用"delims=分隔符"来将其分割输出,同时需要采用tokens设置获取几列数据
REM delims= 表示以空格作为分隔符;tokens=1-3表示获取第1~3列分别作为%%a,%%b,%%c来作为参数输出
for /f "tokens=1-3 delims= " %%a in (user.txt) do (
	echo %%a - %%b - %%c
)

这篇文章中详细介绍了Bat脚本的优势和一些具体语法来帮助我们快速构建脚本,希望能为你带来帮助

下面给出我学习和书写该篇文章的一些参考文章,大家也可以去仔细观赏:


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK