bat批处理脚本大全

news2025/7/19 3:50:35

   

目录

    1、echo

    2、注释

    3、常见cmd命令

    4、参数与变量

    5、for循环

    6、函数

    7、数组


    在windows上编程或者制作一些小工具,少不了使用批处理脚本,而且在各种开发环境搭建中我们经常会看到批处理脚本。批处理脚本以cmd命令为基础,增加一些变量和参数构造多命令来完成复杂的任务。

    1、echo

     echo就是跟所有语言相似的输出打印命令,一般我们会在前面加上@前缀,表示不会显示打印语句。

C:\Users\buejee\Desktop\battutorial>for %i in (1,3,5) do echo %i

C:\Users\buejee\Desktop\battutorial>echo 1
1

C:\Users\buejee\Desktop\battutorial>echo 3
3

C:\Users\buejee\Desktop\battutorial>echo 5
5

C:\Users\buejee\Desktop\battutorial>for %i in (1,3,5) do @echo %i
1
3
5

   我们也会调用@echo off关闭显示打印信息,这样后面的所有echo就不用加@前缀来隐藏命令。

C:\Users\buejee\Desktop\battutorial>type bat_echo.bat
echo hello
@echo off
echo world
C:\Users\buejee\Desktop\battutorial>bat_echo.bat

C:\Users\buejee\Desktop\battutorial>echo hello
hello
world

     在这个示例中,第一次没有设置@echo off,运行脚本,回显了echo hello,但是当运行echo world的时候,它没有回显,因为已经关闭了回显。

     echo表示输出,那么输入怎么办?这里要借助一个小技巧set /p 

@echo off
echo please input you name:
set /p name=
echo your name is : %name%

  运行:

 

    echo还可以结合>与>>命令向文件中写入和追加内容。 

C:\Users\buejee\Desktop\battutorial>echo hello > hello.txt

C:\Users\buejee\Desktop\battutorial>echo world >> hello.txt

C:\Users\buejee\Desktop\battutorial>type hello.txt
hello
world

C:\Users\buejee\Desktop\battutorial>echo hello,world > hello.txt

C:\Users\buejee\Desktop\battutorial>type hello.txt
hello,world

C:\Users\buejee\Desktop\battutorial>

     其实这个示例里面隐含了一个操作,就是如果hello.txt文件不存在就创建,存在就覆盖或者追加。在linux下,我们新建一个文件可以使用touch命令,在windows命令行下,创建文件可以使用echo > xxx.txt 就可以了。 

     值得一提的是,因为cmd命令行默认编码是ANSI(936),而批处理脚本默认编码是UTF8(65001),所以在bat文件中使用echo输出中文会乱码。解决办法:要么改变cmd编码,要么改变脚本编码为ANSI。

    改变脚本编码,可以在notepad++里面直接使用 "编码" 菜单项:转为 ANSI 编码 修改,再一个办法就是通过记事本打开脚本,然后“另存为”的时候选择编码 ANSI,如下所示:

    2、注释

    任何语言都有注释,批处理脚本语言也不例外,它的注释,就是使用关键字REM,一般带上@前缀。

    在这个图中,可以看到,当使用REM关键字的时候,这一行内容就已经变为绿色高亮,明显与可以执行的语句有区别。 

    3、常见cmd命令

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]

   

    4、参数与变量

    在执行脚本的时候,我们可以在脚本后面跟上一些参数,这些参数我们在脚本中通过%1、%2、%3、%4依此类推类获取。

@echo off
@echo first param is %1
@echo second param is %2
@echo third param is %3
@echo fourth param is %4

    运行脚本,打印如下: 

C:\Users\buejee\Desktop\battutorial>bat_params.bat hello world 3 4
first param is hello
second param is world
third param is 3
fourth param is 4

    bat脚本参数只能表示%1~%9,也就是最多可以表示出9个参数。

     从这个脚本显示的样子可以看出,当表示%10的时候,其实已经无法表示了,只是表示%1后面拼接了一个0,所以第十个参数是10,第十一个参数是11,第十二个参数是12。

C:\Users\buejee\Desktop\battutorial>bat_params.bat 1 2 3 4 5 6 7 8 9 9 9 9
first param is 1
second param is 2
third param is 3
fourth param is 4
fifth param is 5
sixth param is 6
seventh param is 7
eighth param is 8
ninth param is 9
tenth param is 10
eleventh param is 11
twelfth param is 12

    解决办法就是需要将前面的参数弹出。使用shift /1

    代码:

@echo off
@echo first param is %1
@echo second param is %2
@echo third param is %3
@echo fourth param is %4
@echo fifth param is %5
@echo sixth param is %6
@echo seventh param is %7
@echo eighth param is %8
@echo ninth param is %9
shift /1
@echo tenth param is %9
shift /1
@echo eleventh param is %9
shift /1
@echo twelfth param is %9

    运行结果:

C:\Users\buejee\Desktop\battutorial>bat_params.bat 1 2 3 4 5 6 7 8 9 100 101 199
first param is 1
second param is 2
third param is 3
fourth param is 4
fifth param is 5
sixth param is 6
seventh param is 7
eighth param is 8
ninth param is 9
tenth param is 100
eleventh param is 101
twelfth param is 199

    变量赋值与取值:

    变量赋值语句使用“=”,且“=”两边没有空格。 取值的时候使用%%包裹,这个跟我们在命令行下打印系统环境变量的值一样:echo %JAVA_HOME%        在bat脚本中,for循环的变量,我们需要使用两个%%来表示,在cmd命令行下,可以使用一个%表示:

    bat_variable_in_forloop.bat

@echo off
for %%i in (1,2,3,5) do (
  @echo %%i
)

    运行:

    以上这些都是自定义变量,还有一些系统内置的变量,可以方便我们在脚本中使用:

    %cd% 当前目录

    %os% 操作系统名称

    %date% 系统日期

    %time% 系统时间

    %username% 当前用户名

    在操作脚本的时候,想要得到脚本相关的参数:比如脚本属性、所在盘符、全路径名、文件名、 路径、缩写路径、文件最后修改时间、扩展名、文件大小、带盘符路径。就需要用到如下的变量:%~(a|d|f|n|p|s|t|x|z|dp)0。示例如下:

   bat_builtin_variable.bat

@echo off
@REM attribute
@echo attr		: %~a0
@REM drive name
@echo drive		: %~d0
@REM filename
@echo filename	: %~f0
@REM name
@echo name		: %~n0
@REM path
@echo path		: %~p0
@REM short name
@echo shortname	: %~s0
@REM time(modify)
@echo time		: %~t0
@REM extension name
@echo extensionname	: %~x0
@REM size
@echo size		: %~z0
@REM drive name + path
@echo dp		: %~dp0

    运行结果如下:

    从中可以看出,name没有扩展名后缀.bat,path没有盘符c:,所以一般使用%~dp0来表示脚本路径。 缩写这里,如果一个文件夹名称不超过6个字符,则使用原样名称,只有文件名称超过6个字符,才使用缩写,而且缩写的名称会变大写。

    5、for循环

    for循环的语法是:

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

     这里可以根据场景选择不同的参数:

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

@echo off
for /d %%i in (%cd%\*) do (
  @echo %%i
)

    运行结果:

     /l 可以使用一个序列来做循环,比如 (1,2,10)表示从1开始,10结束,步长为2,产生的序列为:(1,3,5,7,9)。(5,-1,1),表示从5开始,1结束,步长为-1,也就是递减数列(5,4,3,2,1)。

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

    运行结果:

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

@echo off
for /r %%i in (*.txt) do (
  @echo %%i
)

    该脚本的意思是读取当前文件夹以及子文件夹下的所有.txt扩展名的文件。与/d遍历当前文件夹下的文件夹不同, 它不止遍历当前文件夹,还遍历子文件夹。

    运行结果:

     /f 读取文件

@echo off
for /f %%a in (user.txt) do (
	echo %%a
)

    运行结果:

     我们准备的文件,user.txt里面是id,name,age三列按空格分割的五行数据,最后只读到了id这一列,因为/f默认是按照空格分隔来读取每一行第一列内容。

    可以增加一个"delims="的参数,表示不分割读取每一行。

@echo off
for /f "delims=" %%a in (user.txt) do (
	echo %%a
)

    运行结果:

    还可以分割,并取分割之后的某几列,增加tokens参数:比如"tokens=1-3 delims= "表示按照空格分隔,取1到3列,也就是所有列,但是每一列在取的时候,需要按照%%a,%%b,%%c依次类推来取值。

@echo off
for /f "tokens=1-3 delims= " %%a in (user.txt) do (
	echo %%a - %%b - %%c
)

    运行结果:

  /f 这里不仅可以读取文件,还可以用来读取系统命令执行的结果。

@echo off
for /f "usebackq tokens=1-5 delims= " %%a in (`netstat -aon^| findstr 135`) do (
  @echo %%a - %%b - %%c - %%d - %%e
)

     这段脚本读取netstat -aon | findstr 135的结果,并按照空格分隔,取1-5列。

    运行结果:

    6、函数

    bat脚本里面的函数定义:采用冒号开头,然后定义函数名。在调用的时候,使用关键字call,同样的要跟上冒号:函数名。

    bat脚本有个特点,它虽然可以定义函数,因为脚本串行执行的特点,如果没有跳转指令控制的话,函数定义也会被当作指令执行,虽然函数没有被调用。

    如下所示的代码,我们定义了hello、world两个函数,我们只调用了world函数,但是最后运行结果很诡异:

@echo off

call :world


:hello
  @echo hello
  goto :eof

:world
  @echo world
  goto :eof

    运行结果:

C:\Users\buejee\Desktop\battutorial>bat_func_test.bat
world
hello

    要想让上面的代码执行正确,我们需要在call :world函数之后增加 goto :eof的跳转控制:

    call除了可以调用函数之外,还可以调用其他脚本。

    7、数组

    和其他语言一样,数组在bat脚本中,可以直接通过set 命令设置,如下所示:

@echo off
set arr=1,3,5,7,9
for %%a in (%arr%) do (
  @echo %%a
)

    运行结果:

 

     这种方式定义的数组,却无法通过下标访问,它虽然可以通过for循环遍历并得到数组中的所有元素,但是却不能称为普通意义上的数组。这种一次性声明的数组,只能是一个类数组。

    在批处理脚本中,可以通过下标访问的数组,需要这样来定义:

@echo off
setlocal enabledelayedexpansion
set a[0]=1
set a[1]=3
set a[2]=5
set a[3]=7
set a[4]=9
set a[5]=11
for /l %%n in (0,1,5) do (
  @echo !a[%%n]!
)

    运行结果:

 

    这种数组,虽然可以通过下标访问,但是无法知道它的长度,在进行遍历的时候,我们不得不写死范围。可以通过如下的方式计算数组长度:

@echo off
set Arr[0]=1
set Arr[1]=2
set Arr[2]=3
set Arr[3]=4
set Arr[4]=5
set "x=0"
:loop
if defined Arr[%x%] (
  set /a "x+=1"
  goto loop
)
echo the length is %x%

    运行结果:

 

=======================================================

    批处理脚本与cmd命令行密切相关,所有在脚本中能够执行的操作,基本都可以在命令行下执行,但是有时候,命令行与脚本也有少许差别,比如在命令行下的for循环中,变量可以直接使用一个%来表示,但是脚本中必须使用两个%%来表示。 

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

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

相关文章

【学生毕业设计】基于web学生信息管理系统网站的设计与实现(13个页面)

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

【计算机毕业设计】50.课程设计管理系统

一、系统截图(需要演示视频可以私聊) 摘 要 网络的广泛应用给生活带来了十分的便利。所以把课程设计管理与现在网络相结合,利用JSP技术建设课程设计管理系统,实现课程设计管理的信息化。则对于进一步提高课程设计管理发展&#x…

【图像分割】基于神经气体网络 (NGN)实现图像分割附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

华为开源自研AI框架昇思MindSpore应用实践:DCGAN生成漫画头像

目录一、原理说明1.GAN基础原理2.DCGAN原理二、环境准备1.进入ModelArts官网2.使用CodeLab体验Notebook实例三、数据准备与处理1.数据处理四、创建网络1.生成器2.判别器3.损失和优化器4.优化器五、训练模型六、结果展示本教程是通过示例代码说明DCGAN网络如何设置网络、优化器、…

Pytorch学习笔记 (参考官方教程)

参考: pytorch官网教程 文章目录一、快速开始(Quick Start)数据处理(Working with data)创建模型(Creating Models)优化模型参数(Optimizing the Model Parameters)保存模…

光环:研发云搭建及人才梯队建设——姚冬

摘要:文章内容主要来源于光环国际2022年第三届中国科创者大会姚冬老师的分享,原分享名称为"数字化时代的研发效能建设"。讲述了华为在研发上整套流程规范,通过云的方式去实现人机协同,保持人去做创新型工作。对人才梯队…

方形平板振动克拉尼图形可视化计算MATLAB程序(Chladni Patterns)

方形平板振动克拉尼图形可视化计算MATLAB程序(Chladni Patterns)0前言1 数值时域求解1.1 方程建立1.2 数值差分方程建立1.3 计算结果2 简单的波动解3 理论求解惯例声明:本人没有相关的工程应用经验,只是纯粹对相关算法感兴趣才写此…

云计算技术架构-云计算四种模式(公有云、私有云、混合云、行业云)

接下来几篇主要从技术角度介绍云计算的架构:  云计算四种模式:公有云、私有云、混合云和行业云(本文讲述) 云计算架构:基础架构层、云平台层、业务应用层和业务管理层  云计算服务模式:IaaS、PaaS和…

Python按单元格读取复杂电子表格(Excel)数据实践

Python读取电子表格方法 本文所使用电子表格的目标是读取、解析来自Excel编制的数据报表,或者软件界面导出的数据报表,这类电子表格报表显著特点是有一定的格式,且数据位置不连续,而非标准二维数据表。 关于电子表格&#xff0c…

基于粒子群算法的配电网重构研究matlab程序

基于粒子群算法的配电网重构研究matlab程序 参考文献:基于改进灰狼算法的含分布式电源配电网重构研究 (本文未考虑分布式电源) 摘要:使用基本环矩阵编码的智能优化算法在处理配电网重构问题中,通常使用无序的解空间&a…

机械硬盘,Win10系统,磁盘100%

问题描述 使用机械硬盘,装了Win10系统,打开文件夹或程序,非常的慢,通过任务管理器查看性能,显示磁盘一直处于100%的状态。电脑概览如下: 电脑型号 技嘉 B460MAORUSPRO 操作系统 Microsoft Windows 10 专业…

PyQt5学习笔记--多线程处理、数据交互

目录 1--引入多线程的原因 2--PyQt多线程的基本知识 3--多线程登录程序的实例 4--参考 1--引入多线程的原因 ① 如果Qt只采用单线程任务的方式,当遇到数据处理慢的情形时,会出现GUI卡死的情况。 ② 使用下述例子展示单线程任务的缺陷: …

Java学习之继承的本质(重要)

目录 目录 一、一个继承的代码案例 二、子类创建的内存布局 三、查找顺序 一、son.name的输出结果 二、son.age的输出结果 三、son.hobby的输出结果 一、一个继承的代码案例 package com.hspedu.entends_;/*** 讲解继承的本质*/ public class ExtendsTheory {public sta…

Spring Boot 项目的创建和简单使用

目录 1. 什么是 Spring Boot, Spring Boot 框架有什么优点 2. Spring Boot 项目的创建 2.1 在 IDEA 下安装 Spring Boot Helper 插件: 2.2 创建 Spring Boot 项目: 2.3 网页版创建 Spring Boot 项目 3. Spring Boot 通过路由映射到本地程序 1. 什么是 Spring Boot, Spring …

MFC编辑框控件属性和用法

目录 一、编辑框的属性 1.want return 2.Multiline 3.滚动条 4.添加完效果 二、初始化编辑框内容 三、复制与退出 四、edit control的值类型 五、思维拓展 一、编辑框的属性 默认情况下编辑框edit control 是可以横向无限输入的 1.want return 支持换行,…

dreamweaver作业静态HTML网页设计模板——迪士尼影视电影(6页)带音乐

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置,有div的样式格局,这个实例比较全面,有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 文章目录一、网页介绍一…

Private Execution on Blockchain

1.Alan Szepieniec: Ghost-Queen Chess——复杂金融合约 Alan Szepieniec为Neptune合伙人。 为何需关注decentralized Finance? 1)从学术角度来看:是 密码学 ∩\cap∩ 分布式系统 ∩\cap∩ 经济学 ∩\cap∩ …的集合。2)从工程…

基于蚁群算法的多配送中心的车辆调度问题的研究附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。 🍎个人主页:Matlab科研工作室 🍊个人信条:格物致知。 更多Matlab仿真内容点击👇 智能优化算法 …

BUUCTF Misc ningen1 小明的保险箱1 爱因斯坦1 easycap1

ningen1 下载文件 使用kali中的binwalk查看 binwalk xxx.jpg 分离文件 打开 压缩包加密了,爆破 爆破成功,密码:8368 得到flag flag{b025fc9ca797a67d2103bfbc407a6d5f} 小明的保险箱1 下载文件 用010 editor打开 可以看到图…

Java初识泛型

什么是泛型 泛型是jdk1.5引入的新语法,泛型就是适用于许多许多类型,就是对类型实现了参数化。实现一个类,类中包含一个数据成员,使得数组中可以存放任何类型的数据,也可以根据成员方法返回数组中某个下标的值 class M…