bat脚本语法与实战

news2024/11/20 11:45:56

一、什么是bat脚本

        bat脚本就是将一系列DOS命令按照一定顺序排列而形成的集合,运行在windows命令行环境上。通过本文的学习,基本可以实现一些简单的脚本。

二、为什么学习bat脚本?

        使用bat可以提高办公效率,可以直接使用Notepad++编辑器编写代码,直接双击即可实现自己编写的脚本流程,如对两个excel表格的数据对比,执行某些繁琐的命令并输出到指定文件里面等等,通过bat脚本可以节约很多时间,不需要人工再去执行机械系的操作。

三、基本环境准备

1、Winows系统

2、文本编辑器Notepad++

3、创建txt文件将后缀改为.bat

4、如需执行到python文件需要准备python环境

四、中文乱码解决

bat 批处理脚本如下

@echo off
echo 你好,世界    
pause

执行该脚本的时候,出现了中文乱码

 

1、乱码分析

  1. 乱码都跟字符编码有关系。
  2. 计算机只能处理数字,如果遇到文本,必须先将其转换为数字后才能处理,由此出现了字符编码(字符集)。如果编码时采用某种字符编码,那么解码时,必须得相对应使用同一种字符编码,如采用不同的字符编码,会出现乱码。

2、乱码解决

1. 在原先 bat 脚本文件中声明更改代码页,chcp 65001

 输出如下:

2、在编辑器中使用ANSI编码进行编辑。

输出如下:

五、基本语法

1、echo命令

echo on 批处理命令在执行时显示自身命令行
echo off 批处理命令在执行时不显示自身命令行
@echo off @字符放在命令前将关闭该命令回显,无论此时echo是否为打开状态。
echo. 输出空行,"."可以用,:;”/[\]+等任一符号替代

echo Hello World 打印Hello World
echo test > file.txt 创建包含字符test的file.txt文件

echo %TIME%输出当前时间

2、pause 命令

pause 等待并提示"请按任意键继续. . ."
pause > nul 等待但不出现提示语
echo 请输入任意键退出 & pause > nul 输出指定输出语"请输入任意键退出"并等待操作

基本案例:输出 Hellow World与当前时间

@echo off

echo Hello world

echo %TIME%

pause 

3、set命令

SET [variable=[string]] #variable表示变量名,string表示变量值。

举例如下:
@echo off
set str="Hellow my dear"
echo %str%
pause

输出:
"Hellow my dear"

4、exit 命令

EXIT [/B] [exitCode]
参数说明:
/B:指定要退出当前批处理脚本而不是 CMD.EXE。如果从一个批处理脚本外执行,则会退出 CMD.EXE
exitCode:指定一个数字号码。如果指定了 /B,将 ERRORLEVEL设成那个数字。如果退出 CMD.EXE,则用那个数字设置过程退出代码

5、常用系统变量

%CD%  获取当前目录
%PATH%  获取命令搜索路径
%DATE%  获取当前日期。
%TIME%  获取当前时间。
%RANDOM% 获取 0 和 32767 之间的任意十进制数字。
%ERRORLEVEL% 获取上一命令执行结果码

6、字符串基本操作

字符串截取:使用命令 echo %var:~n,k%,其中"%var",表示待截取字符的字符串,"~"取字符标志符,"n”表示字符截取起始位置,"k" 表示截取结束位置(不包含该字符)。举例如下

@echo off
set str=helloworld~
echo str=%str% 
echo str:~0,3=%str:~0,3%
echo str:~3=%str:~3%
echo str:~-3=%str:~-3% 
echo str:~0,-3=%str:~0,-3% 
pause 

输出如下:

str=helloworld~
str:~0,3=hel
str:~3=loworld~
str:~-3=ld~
str:~0,-3=hellowor

字符串替换:使用命令%var:old_str=new_str% ,举例如下

@echo off 
set str=HelloWorld~
set temp=%str:hello=My% 
echo %temp% 
pause 

输出如下:

MyWorld~

7、rem 命令

 注释符,也可以用两个冒号代替(::)

8、errorlevel 命令

程序执行结果返回码,执行成功返回0,失败返回为1

9、start 命令

启动一个单独的窗口以运行指定的程序或命令,程序继续向下执行。START [command/program] [parameters]

10、cls 命令

清除屏幕内容

11、help 命令

提供 Windows 命令的帮助信息 HELP [command]

12、实现自动交互?

利用重定向方式可以实现自动交互输入。假设需要交互的脚本为A.exe,脚本需要依次输入1、2、3。则可以采用如下形式:

@echo off 
del test.txt
echo 1 > test.txt
echo 2 >> test.txt
echo 2 >> test.txt
A.exe < test.txt
pause 

13、if/else命令

    if/else条件语句,用来判定是否符合规定的条件,从而决定执行不同的命令。 在CMD下使用 IF /? 打开 IF 的系统帮助,IF有3种基本的用法,如下

IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command

 说明:

  NOT:指定只有条件为 false 的情况下,Windows 才应该执行该命令。
  ERRORLEVEL number:如果最后运行的程序返回一个等于或大于指定数字的退出代码,指定条件为 true。
  string1==string2:如果指定的文字字符串匹配,指定条件为 true。
  EXIST filename:如果指定的文件名存在,指定条件为 true。
  command:如果符合条件,指定要执行的命令。如果指定的条件为 FALSE,命令后可跟 ELSE 命令,该命令将在 ELSE 关键字之后执行该命令。

实战一:注意语句括号前后的空格

@echo off
        IF EXIST ./filename.txt (
            echo filename exit.
        ) ELSE (
            echo filename. missing.
        )

pause

 或者如果都放在同一行上,以下子句有效:

IF EXIST filename. (echo filename exit.) ELSE  echo filename. missing.

实战二:

@echo off

set /p var="Please input the number(1,2,3):"

if %var% == 1 (
  echo "the number equal to 1"
) else if %var% == 2 (
  echo "the number equal to 2"
) else if %var% == 3 (
  echo "the number equal to 3"
) else (
  echo "input wrong number,exit program."
)

pause

如果命令扩展被启用,IF 会如下改变:

IF [/I] string1 compare-op string2 command
IF CMDEXTVERSION number command
IF DEFINED variable command

  其中, compare-op 可以是:

EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于

而 /I 开关(如果指定)说明要进行的字符串比较不分大小写。/I 开关可以用于 IF 的 string1==string2 的形式上。这些比较都是通用的;原因是,如果 string1 和 string2 都是由数字组成的,字符串会被转换成数字,进行数字比较。

14、For语句

 cmd命令行窗口下,输入help for 或者 for /? 查看for语句的使用方法。for语句基本格式如下:

  FOR %variable IN (set) DO command [command-parameters]

  参数说明:

%variable  指定一个单一字母可替换的参数。注意:批处理脚本中使用%%variable
(set)  指定一个或一组文件。可以使用通配符。
command  指定对每个文件执行的命令。
command-parameters 为特定命令指定参数或命令行开关。

  for语句还有4个参数,分别是 /d /r /l /f ,下面分别介绍这4个参数对应的for语句命令。

(1)/D参数的fro语句格式

FOR /D %variable IN (set) DO command [command-parameters]

 说明:如果(set)集中包含通配符,则指定与目录名匹配,而不与文件名匹配。

 实例:打印D盘根目录下的目录名

@echo off
for /d %%i in (d:/*) do (
  echo %%i
)
pause

(2)/R参数的fro语句格式

FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]

  说明:递归查询指定目录下的匹配文件。默认使用当前目录。

  实例:打印D盘目录及子目录下的后缀为.log和.py的文件

@echo off
for /r d:/ %%i in ( *.txt *.py ) do (
  echo %%i
)
pause

(3)/L参数的fro语句格式

FOR /L %variable IN (start,step,end) DO command [command-parameters]

  该集表示以增量形式从开始到结束的一个数字序列。因此,(1,1,5)将产生序列1 2 3 4 5,(5,-1,1)将产生序列(5 4 3 2 1)

实例:打印10以内的偶数

@echo off
for /l %%i in (2,2,10) do (
  echo %%i
)
pause

(4)FOR语句的/F参数包含如下3种命令格式:

  FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
  FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
  FOR /F ["options"] %variable IN ('command') DO command [command-parameters]

  说明:包含/F的参数可以处理文件内容(file-set)、字符串("string")以及执行指定命令('command')返回回的值。可以通过设置["options"]值实现相关需求。["options"]值包含关键字说明如下:

eol=c 处理时跳过起始为c字符的行,通常用于跳过注释行。
skip=n  跳过文件开始的n行
delims=xxx  指定分隔符集。这个替换了空格和制表符的默认分隔符集。
tokens=x,y,m-n  被分隔各字段的处理。
usebackq   需使用双引号包含文件名时考虑,具体使用执行help for查看

  上面的描述有些地方可能不好裂解,学习并执行完如下几个实例观察输出结果,再去理解效果会更快。

  实例:操作temp.txt文件内容。

@echo off

type nul > temp.txt
echo ;Test for /f parameter >> temp.txt
echo line1 1 2 3 >> temp.txt
echo line2 1 2 3 >> temp.txt
echo line3 1 2 3 >> temp.txt
echo 11 12 13 14 15 16 >> temp.txt
echo 21,22,23,24,25,26 >> temp.txt
echo 31-32-33-34-35-36 >> temp.txt
for /F "skip=4 eol=;  tokens=1,3* delims=,- " %%i in (temp.txt) do (
  echo  i=%%i, j=%%j, k=%%k
)
pause
del temp.txt

 输出结果如下:

 i=11 , j=13 ,k=14 15 16
 i=21 , j=23 ,k=24,25,26
 i=31 , j=33 ,k=34-35-36

  程序关键代码简单说明:

skip=4:跳过temp.txt文件的前4行。
eol=;: 忽略冒号打头的行,直接跳过不处理
delims=,- :指定分隔符为逗号(,)、减号(-)、和空格,空格必须放在最后
tokens=1,3*:将按照指定分隔符号分隔到的第1个字段赋给变量i,第二个字段赋值给变量j,剩余字段赋值给变量k。注意:变量i在 for 语句中显式声明,变量j和变量k是通过tokens= 选项隐式声明的。

 建议:如果还是不太理解的可以将上述skip、eol、delims、tokens进行修改并执行观察输出,

六、文件操作命令

(1)copy 文件复制命令

copy d:\temp1\file1.txt d:\temp2 将文件file1.txt复制到temp2目录,有相同文件提示
copy d:\temp1\file1.txt d:\temp2 /y 将文件file1.txt复制到temp2目录,有相同文件覆盖原文件,不提示
copy d:\temp1\* d:\temp2 /y 将temp1目录下的所有文件复制到temp2目录,有相同文件覆盖原文件,不提示

(2)xcopy 目录复制命令

xcopy temp1 d:\temp2 /y 将temp1目录下的文件复制到temp2目录,不包括temp1子目录下的文件。
xcopy temp1 d:\temp2 /s /e /y 将temp1目录下的文件复制到temp2目录,包括temp1子目录下的文件

(3)type 显示文件内容命令

type file1.txt 查看file1文件内容
type file1.txt file2.txt  #查看file1和file2文件内容
type file1.txt > file2.txt  #将file1.txt文件内容重定向到file2.txt
type nul > file1.txt #创建文件

(4)ren 重命名文件命令

ren d:\temp1\file1.txt file2.txt 修改temp目录下的file1.txt文件名为file2.txt

(5)del 删除文件命令

del d:\temp1\file1.txt 删除temp目录下的file1.txt文件
del d:\temp\*.txt  删除temp目录下的后缀为.txt的文件

七、目录操作命令 

(1) cd 显示当前目录或切换目录

cd d:\temp1 切换到temp1目录,当前目录是d盘
cd /d d:\temp1 切换到temp1目录,当前目录非d盘
cd .. 切换到上一级目录

(2)mkdir 创建目录

mkdir test 在当前目录下创建test目录 mkdir d:\temp1\test 在temp1目录下创建test目录,如果temp1目录不存在,自动创建

(3)rmdir 删除目录

rmdir d:\temp1 删除空目录temp1,非空则删除失败
rmdir d:\temp1 /s /q 删除temp1目录,包括子目录(/s),并且删除时不提示(/q)

(4)dir 显示目录下的子目录和文件

dir d:\temp1 显示temp1目录下的文件和目录信息,显示信息包含日期、时间、文件类型和文件名
dir d:\temp1 /a:a /b 只显示temp1目录下(不包括子目录)的文件的绝对路径,不显示日期、时间、文件类型和文件名
dir d:\temp1 /b /s /o:n /a:a  显示temp1路径下(包括子目录)的所有文件的绝对路径。输出文件按照文件名数字顺序排序
dir d:\temp1\*.txt /a:a /b /o:n 显示.txt后缀文件,并且按照文件名顺序排序(/on),其他排序方法查看help dir

 说明:
  (1)/b表示去除摘要信息,仅显示完整路径、/s表示循环列举文件夹中的内容、/o:n 表示根据文件名排序、/a:a 表示只枚举文件而不枚举其他。
  (2)单独dir /b与dir /s 都不会显示完整路径,只有这两个组合才会显示完整路径。  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/562428.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaEE(系列12) -- 常见锁策略

目录 1. 乐观锁和悲观锁 2. 轻量级锁与重量级锁 3. 自旋锁和挂起等待锁 4. 互斥锁和读写锁 5. 可重入锁与不可重入锁 6. 死锁 6.1 死锁的必要条件 6.2 如何避免死锁 7. 公平锁和非公平锁 8. Synchronized原理及加锁过程 8.1 Synchronized 小结 8.2 加锁工作过程 8.2.1 偏向锁…

MySQL保证主备一致,如何解决循环复制?

备库只读&#xff0c;是如何和主库同步数据的&#xff1f; 你可能会问&#xff0c;我把备库设置成只读了&#xff0c;还怎么跟主库保持同步更新呢&#xff1f; 这个问题&#xff0c;你不用担心。因为 readonly 设置对超级 (super) 权限用户是无效的&#xff0c;而用于同步更新…

用Typescript 的方式封装Vue3的表单绑定,支持防抖等功能。

Vue3 的父子组件传值、绑定表单数据、UI库的二次封装、防抖等&#xff0c;想来大家都很熟悉了&#xff0c;本篇介绍一种使用 Typescript 的方式进行统一的封装的方法。 基础使用方法 Vue3对于表单的绑定提供了一种简单的方式&#xff1a;v-model。对于使用者来说非常方便&…

【011】C++选择控制语句 if 和 switch 详解

C控制语句之if和switch语句 引言一、选择控制语句if1.1、if 语句的形式1.2、if...else...语句的形式1.3、if...else if... else...语句 二、选择控制语句switch2.1、switch语句形式 三、switch和if...else if...else...比较四、注意事项总结 引言 &#x1f4a1; 作者简介&#…

企业工程行业管理系统源码-专业的工程管理软件-提供一站式服务

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示1…

Doo Prime 德璞资本:期货开户条件全解析!让你不再困惑!

期货市场是金融市场中一个非常重要的部分&#xff0c;对于许多投资者来说&#xff0c;期货市场是一个非常有吸引力的投资选择。然而&#xff0c;要进行期货交易&#xff0c;必须首先开设期货账户&#xff0c;这就需要满足一些期货开户条件&#xff0c;因此本文将介绍期货开户条…

认识SpringCloud(一) 注册中心Eureka

Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务治理。在传统的rpc远程调用框架中&#xff0c;管理每个服务与服务之间依赖关系比较复杂&#xff0c;管理比较复杂&#xff0c;所以需要使用服务治理&#xff0c;管理服务于服务之间依赖关系&#xff0c;可以实现服…

(原创)getX+Dio实现Flutter悬浮置顶的页面效果

前言 Flutter的开发相对已经比较成熟了&#xff0c;现在市面上不少商业应用也在使用这个技术 老实说&#xff0c;Flutter去实现一些基础的ui界面&#xff0c;效率还是很高的 当然前提是你对它要有一定的了解。 今天就演示一下&#xff0c;如何去实现一个基础悬浮置顶的页面效果…

OSTrack 中的边界框回归策略

目录 一、裁剪和标签的设置 二、模型的预测输出的边界框回归 一、裁剪和标签的设置 1、添加偏移量&#xff0c;得到偏移后的边界框 jittered_anno [self._get_jittered_box(a, s) for a in data[s _anno]] 2、以偏移后的边界框为中心&#xff0c;进行裁剪 首先以偏移边界…

Apache Pulsar入门指南

1.概述 Apache Pulsar 是灵活的发布-订阅消息系统&#xff08;Flexible Pub/Sub messaging&#xff09;&#xff0c;采用计算与存储分离的架构。雅虎在 2013 年开始开发 Pulsar &#xff0c;于 2016 年首次开源&#xff0c;目前是 Apache 软件基金会的顶级项目。Pulsar 具有支…

面试官:写一个单例模式

1. 什么是单例模式 了解单例模式之前&#xff0c;我们需要先了解什么是设计模式。 设计模式是一种抽象的编程思想&#xff0c;不局限于编程语言&#xff0c;简单来说&#xff0c;就是一些大佬程序猿针对一些典型的场景&#xff0c;给出一些典型的解决方案&#xff0c;只要按照这…

04-CSS3-渐变色、2D转换、3D转换

一、渐变色 CSS渐变色&#xff08;Gradient&#xff09;是指在元素背景中使用两种或多种不同的颜色进行过渡&#xff0c;超过两个颜色可以形成更为细腻的渐变效果。常见的CSS渐变色有线性渐变和径向渐变。 1. 线性渐变&#xff1a;Linear Gradients 向下/向上/向左/向右/对角…

SVN 修改URL路径-使用重新定位(relocate)命令和找不到问题解决

当svn服务器url发生变更,又不想在本地重新进行checkout操作,这时候可以使用svn relocate命令进行url的重新定位; 在windows下以TortoiseSVN为例,在仓库文件夹上右键,TortoiseSVN-(重新定位)relocate, 1、Windows TortoiseSVN客户端: 在工作复本的根目录上右键->TortoiseSV…

DOUBLETROUBLE: 1

文章目录 DOUBLETROUBLE: 1实战演练一、前期准备1、相关信息 二、信息收集1、nmap探测目标靶机端口2、扫描目标网址目录3、访问网站&#xff0c;发现secret下有个图片4、将图片下载5、查看图片所含内容6、破解密码并查看7、登陆邮箱8、创建反弹shell9、上传反弹shell10、监听11…

Jeecg-Boot 未授权SQL注入漏洞(CVE-2023-1454)

本文转载于&#xff1a;https://blog.csdn.net/qq_27536045/article/details/129944987 环境搭建 JDK: 1.8 (小于11) Maven: 3.5 MySql: 5.7 Redis: 3.2 Node Js: 10.0 Npm: 5.6.0 Yarn: 1.21.1 下载源码 后端源码 https://github.com/jeecgboot/jeecg-boot/tree/v…

MongoDB安装教程—Ubuntu

为啥用MongoDB&#xff0c;问就是客户要求。 为啥用Ubuntu&#xff0c;问就是客户只有Ubuntu的机器。 0. 环境 操作系统&#xff1a; Ubuntu 22.04.1 LTS (GNU/Linux 5.19.0-41-generic x86_64) 不同版本系统差异不同&#xff0c;其他版本系统未测试。 1. 安装 1.1 包管理公…

深入探索SDL游戏开发

前言 欢迎来到小K的SDL专栏第二小节&#xff0c;本节将为大家带来基本窗口构成、渲染器、基本图形绘制、贴图、事件处理等的详细讲解&#xff0c;看完后希望对你有收获 文章目录 前言一、简单窗口二、渲染器三、基本图形绘制1、点2、线3、矩形4、圆和椭圆 四、贴图五、事件处理…

XR交互技术趋势:6DoF追踪、手势识别、眼动跟踪……

XR交互技术提供了用户与虚拟环境进行交互的方式和手段&#xff0c;而实时云渲染则提供了真三维、可交互、高沉浸的图形渲染和计算能力。结合这两者&#xff0c;用户可以通过XR设备获得更真实、更沉浸的虚拟体验&#xff0c;同时享受到优质的图形效果和流畅的交互响应。本篇文章…

关于开发中对端口(port)的几点理解

一、服务端的端口是固定的&#xff0c;客户端的端口是随机的 客户端端口是随机的&#xff0c;比如访问百度&#xff0c;系统为浏览器分配了个端口1024。过一会重开电脑&#xff0c;访问了新浪&#xff0c;可能还是用1024端口&#xff0c;我不关浏览器&#xff0c;还要再开一个浏…

CenterFusion数据处理函数__getitem__()解析

CenterFusion数据处理函数__getitem__解析 1. 图像数据处理1.1 通过利用nuScence_COCO实例化对象获取图像以及相关数据的信息1.2 获取图像数据增强的相关参数&#xff1a;中心点c&#xff0c;尺度scale&#xff0c;旋转rotia和翻转flip1.3 根据生成的参数生成仿射矩阵来对图像进…