windows:批处理bat实例

news2024/10/5 21:25:19

文章目录

  • 文件/文件夹管理实例
    • 批量更改文件名
    • 创建编号从0到9的10个文件
    • 自动循环运行某个程序
    • 显示批处理的完整路径信息
    • 将文件名更名为当前系统日期
    • 使用批处理命令自动接收用户输入的信息
    • 计算当前目录及子目录(中文件)所占硬盘空间
    • 自动删除当前目录及子目录下所有空文件夹
    • 批处理中不同盘符路径的切换

文件/文件夹管理实例

批量更改文件名

命名a.bat,写上以下代码:

@echo off
echo 开始更改文件名
set extensions=.rar
set /a sum=0
for %%m in (*) do (
    if not "%%m" == "a.bat" (
        ren %%m %%m%extensions%
        set /a sum=sum+1
    )
)
echo 111
echo 修改完成,共修改%sum%个文件的后缀!
set extensions=
set sum=

ren命令,修改文件名,其实就是rename

运行之前,当前文件夹内容:

在这里插入图片描述

运行之后,当前文件夹内容:

在这里插入图片描述

比较有意思的是,当整个bat的最后一行我放的是带变量的echo时,它竟然没有输出。。。直到我在后面又添了几行。。。

创建编号从0到9的10个文件

@echo off
for /l %%n in (0, 1, 9) do (
    echo 内容为:%%n > %%n.txt
)
echo 创建完成

在这里插入图片描述

自动循环运行某个程序

@echo off
:start
ping www.baidu.com > nul
if not %errorlevel% EQU 0 (goto start)
start "新窗口" echo ping通!

> nul:表示将指令的输出重定向至空设备,不在前台做显示,类似linux里的/dev/null

%errorlevel%是一个系统变量,用来获取上一条指令的运行状态,如果是0,则表示上一条指令正常运行完成,如果是非0外的其他数字,则表示指令运行失败。

start之前讲过了,开一个新窗口来执行后面的命令。

显示批处理的完整路径信息

其实就是打印当前的绝对路径:

@echo off
echo %~dp0

%~表示变量扩展

将文件名更名为当前系统日期

@echo off
if not exist %1 (
    echo 命令用法如下:
    echo %0 filename
    echo filename表示需要修改的原文件名
    echo.
    goto end
)

set extension=%~x1
for /F "tokens=1-4 delims=/- " %%a in ('date /t') do (
    rem set date=%%a%%b%%c
    set date=%%b%%c%%d
)
ren "%1" "%date%%extension%"
echo 文件%1已经被改名为%date%%extension%
set extension=
set date=
:end

输出:

D:\TEMP\bat>a.bat 1.txt
文件1.txt已经被改名为20230719.txt

原理其实比较简单

首先我们需要知道date /t的输出,是这个样子的:周三 2023/07/19,而我们的这次需求里,目的其实是想把20230719提取出来,怎么提取呢,自然就是分割了,就是里面的"tokens=1-4 delims=/- "这部分代码,这是啥意思呢?

token=1-4表示切割出1-4个字符串,分别对应了%%a%%b%%c%%d;

"delims=/- "定义了分隔符,这里定义了3种,分别是斜杠、横杠和空格;

这些分隔符把date /t的输出分割成了4部分,分别是:周三、2023、07、19,只要把后面3个组起来就是我们需要的内容了。

使用批处理命令自动接收用户输入的信息

首先,bat中没有while关键字,所以如果要实现这种循环结果的话,只能用for,或者结合goto语句。

直接上代码:

@echo off
echo.
:repeat
echo.
echo.
echo ##################################
echo -----1、输入数字1并回车,显示当前日期
echo -----2、输入数字2并回车,显示当前时间
echo -----3、输入数字3并回车,显示当前文件列表
echo -----4、输入数字4并回车,则终止批处理
echo.
echo.
echo 请输入需要执行的操作
set /p num=
if "%num%" == "1" (
    cls
    echo.
    echo.
    echo 当前日期为:
    date /t
    pause
    goto repeat
)
if "%num%" == "2" (
    cls
    echo.
    echo.
    echo 当前时间为:
    time /t
    pause
    goto repeat
)
if "%num%" == "3" (
    cls
    echo.
    echo.
    echo 当前文件列表为:
    dir /w
    pause
    goto repeat
)
echo.
echo.
echo 输入了字符%num%,批处理自动退出。
pause

具体结果不太好演示,就不截图了,有兴趣的话跑一下就可以。

这里比较有意思的有两点:

  • goto语句带来的类似while循环的功能;
  • 获取用户输入:set /p num=,表示将用户在回车前的键入,都存进变量num里。

计算当前目录及子目录(中文件)所占硬盘空间

核心在于一个dir指令。

首先我们需要明确dir的输出,在cmd里执行dir,我的输出是这样的:

D:\Code\BAT>dir
 Volume in drive D is Data
 Volume Serial Number is A237-8B58

 Directory of D:\Code\BAT

2023/08/01  21:05    <DIR>          .
2023/07/14  19:33    <DIR>          ..
2023/08/07  19:06               195 a.bat
2023/07/31  16:57                69 a.txt
2023/08/01  21:13               442 b.bat
2023/07/14  20:57                11 b.txt
2023/07/14  20:57                11 c.txt
2023/07/31  10:54    <DIR>          d1
2023/07/31  10:53    <DIR>          d2
2023/07/31  10:53    <DIR>          d3
               5 File(s)            728 bytes
               5 Dir(s)  330,836,910,080 bytes free

注意最下面两行,已经显示出了当前目录下,有几个文件,几个目录,且文件占的硬盘空间和当前剩余空间,我们要拿的就是倒数第二行!也就是说,问题转化为怎么拿出那个728bytes。

代码如下:

@echo off
for /f "tokens=*" %%a in ('dir') do (
    echo "%%a" | find "File(s)" > nul && for /f "tokens=3*" %%b in ("%%a") do (
        echo 当前目录大小:%%b%%c
    )
)

最终输出:

D:\Code\BAT>a.bat
当前目录大小:728bytes

这里需要注意:

  • 跟find结合使用时,前面的echo "%%a"必须是带双引号的状态,如果写成echo %%a的话,对于find匹配不出的行,会逐行报错The system cannot find the file specified.,具体原因待探查;
  • echo "%%a" | find "File(s)" > nul && echo "%%a"会只输出含File(s)的行,所以这里的find是起到了类似过滤的效果;

不过上述代码只统计了当前目录下文件的总大小,如果我是想统计每个子目录里的文件大小呢?

其实代码差不多:

@echo off
for /f  %%a in ('dir /ad/s/b') do (
    for /f "tokens=*" %%b in ('dir %%a') do (
        echo "%%b" | find "File(s)" > nul && for /f "tokens=3*" %%c in ("%%b") do (
        echo %%a: %%c%%d
    )
    )
    
)

echo.

输出:

D:\Code\BAT>a.bat
D:\Code\BAT\d1: 0bytes
D:\Code\BAT\d2: 0bytes
D:\Code\BAT\d3: 0bytes
D:\Code\BAT\d1\dd1: 122bytes

这里唯一需要注意的就是dir的用法:

dir /a表示以特定模式做展示,其中/ad表示只展示文件夹,/aa应该是表示只展示文件;

dir /b表示以简单模式输出,即只输出文件名和文件夹名,其他一概不输出,如:

D:\Code\BAT>dir /b
a.bat
a.txt
d1

dir /s则表示展示指定目录及其子目录下所有的文件和文件夹。

自动删除当前目录及子目录下所有空文件夹

这个思路很简单,分两步:

  • 首先遍历查找当前目录下及子目录下的所有空文件夹,将全路径输出至listnull.txt;
  • 遍历上一步生成的文件,逐一删除。

代码如下:

@echo off
cd. > listnull.txt
for /f  %%a in ('dir /ad/s/b') do (
    dir /b "%%a" | findstr . > nul || echo %%a >> listnull.txt
)

set /a sum=0
for /f %%a in (listnull.txt) do (
    rd /q %%a
    set /a sum=sum+1
)
echo.
echo 共删除%sum%个空文件夹
echo.
set sum=
del /q listnull.txt

这里需要特别注意的主要是findstr + ||的联合使用。

findstr .其实是指通配任意字符,只要前面指令有返回字符串,findstr就算成功,但是||后面的指令是只有在前面执行失败的时候才会执行,这意味着只有当%%a所代表的目录下,啥都没有,即没有文件也没有文件夹的时候,才会执行||后面的命令,因此联合使用后反而是相当于是筛出了所有空的%%a。

形如:

D:\Code\BAT>type listnull.txt
D:\Code\BAT\d2
D:\Code\BAT\d3

还有就是几个指令的用法,如rd表示删除文件夹,del表示删除文件。

批处理中不同盘符路径的切换

这个其实没啥好讲的,就是两个切换盘符用的常用指令:

pushd 指定路径:将当前目录存储到一个虚拟栈里,然后将当前工作目录切换成指定的路径,如pushd c:\或者是pushd c:\users\

popd:将当前工作目录切换成栈里保存的上一个目录。

这里需要注意,pushd存储路径的时候是相当于用一个栈去存储的,然后popd一个一个弹出栈,直到栈里弹空了。

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

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

相关文章

【Spring Cloud系列】Config详解与应用

【Spring Cloud系列】Config详解与应用 文章目录 【Spring Cloud系列】Config详解与应用一、概述二、Config组成三、Spring Cloud Config 工作原理3.1 原理图3.2 Spring Cloud Config的原理 四、如何使用Spring Cloud Config4.1 创建Config Server4.2 创建Config Client4.3 配置…

2022年软件设计师下半年真题解析(上午+下午)

1 RISC 以下关于RISC(精简指令集计算机)特点的叙述中&#xff0c;错误的是()。 A.对存储器操作进行限制&#xff0c;使控制简单化B.指令种类多&#xff0c;指令功能强 C.设置大量通用寄存器 D.选取使用频率较高的一些指令&#xff0c;提高执行速度 RISC(Reduced Instruction Se…

计算机毕业设计 基于SSM的高校毕业论文管理系统小程序的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb;…

力扣每日一题(+日常水题|树型dp)

740. 删除并获得点数 - 力扣&#xff08;LeetCode&#xff09; 简单分析一下: 每一个数字其实只有2个状态选 or 不 可得预处理每一个数初始状态(不选为0,选为所有x的个数 * x)累加即可 for(auto &x : nums)dp[x][1] x;每选一个树 i 删去 i 1 和 i - 1 故我们可以将 i…

MySQL8.0版安装教程 + Workbench可视化配置教程(史上最细、一步一图解)

文章目录 一、安装MySQL1、选择版本&#xff0c;点击“Download”进行下载2、双击下载好的安装包&#xff0c;点击运行3、选择安装类型为“Custom”4、依次进行选择&#xff0c;选到MySQL Servers 8.0.33 -X64&#xff0c;点击向右的箭头5、选中MySQL Servers 8.0.33 -X64&…

Allure-pytest功能特性介绍

前言 学pytest就不得不说fixture&#xff0c;fixture是pytest的精髓所在&#xff0c;就像unittest中的setup和teardown一样&#xff0c;如果不学fixture那么使用pytest和使用unittest是没什么区别的(个人理解)。 fixture用途 1.做测试前后的初始化设置&#xff0c;如测试数据准…

TikTok海外扩张:亚马逊的新对手崛起

随着社交媒体和电子商务的融合&#xff0c;TikTok正迅速崭露头角&#xff0c;成为亚马逊等传统电商巨头的潜在竞争对手。这一新兴平台的快速发展引发了广泛的关注&#xff0c;特别是在全球范围内。 在这篇文章中&#xff0c;我们将探讨TikTok海外扩张的战略&#xff0c;以及它…

26606-2011 工业用氰乙酸甲酯 阅读笔记

声明 本文是学习GB-T 26606-2011 工业用氰乙酸甲酯. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了工业用氰乙酸甲酯的要求、试验方法、检验规则、标志、包装、运输、贮存和安全。 本标准适用于以氯乙酸、氰化钠、甲醇等为原料…

uniapp h5 端 router.base设置history后仍有#号

manifest.json文件设置&#xff1a; "h5": { "router": { "base": "./", "mode": "history" }, }按相对路径发行时路由模式强制为hash模式&#xff0c;不支持history模式&#xff08;两者相悖&#xff09;…

FatFS文件系统在MCU上的应用

FatFS文件系统是单片机领域有名的一个文件系统&#xff0c;由于它的轻量级和兼容性&#xff0c;备受MCU开发者青睐。 在实现如U盘文件读写&#xff0c;SD卡的文件读写等工作时&#xff0c;我们往往需要一个文件系统来支持我们的工作。特别在一些MCU应用中&#xff0c;文件系统…

[React] Context上下文的使用

文章目录 1.Context的介绍2.为什么需要Context3.Context的使用 1.Context的介绍 Context旨在为React复杂嵌套的各个组件提供一个生命周期内的统一属性访问对象&#xff0c;从而避免我们出现当出现复杂嵌套结构的组件需要一层层通过属性传递值得问题。 Context是为了提供一个组…

大语言模型之十三 LLama2中文推理

在《大语言模型之十二 SentencePiece扩充LLama2中文词汇》一文中已经扩充好了中文词汇表&#xff0c;接下来就是使用整理的中文语料对模型进行预训练了。这里先跳过预训练环节。先试用已经训练好的模型&#xff0c;看看如何推理。 合并模型 这一步骤会合并LoRA权重&#xff0…

有没有项目经理能看得懂这九张图?求挑战

大家好&#xff0c;我是老原。 跟项目经理们聊天&#xff0c;经常能听到这样的话&#xff1a; “我是项目经理&#xff0c;除了项目管理的事情外&#xff0c;还要好多事情我得亲自去做。” “项目经理责任大&#xff0c;权力少&#xff0c;真的太累了。” 作为一个项目经理…

DevSecOps 将会嵌入 DevOps

通常人们在一个项目行将结束时才会考虑到安全&#xff0c;这么做会导致很多问题&#xff1b;将安全融入到DevOps的工作流中已产生了积极结果。 DevSecOps&#xff1a;安全正当时 一直以来&#xff0c;开发人员在构建软件时认为功能需求优先于安全。虽然安全编码实践起着重要作…

C#生成自定义海报

安装包 SixLabors.ImageSharp.Drawing 2.0 需要的字体&#xff1a;宋体和微软雅黑 商用的需要授权如果商业使用可以使用方正书宋、方正黑体&#xff0c;他们可以免费商用 方正官网 代码 using SixLabors.Fonts; using SixLabors.ImageSharp; using SixLabors.ImageSharp.Draw…

win10默认浏览器改不了怎么办,解决方法详解

win10默认浏览器改不了怎么办&#xff0c;解决方法详解_蓝天网络 在使用Windows 10操作系统时&#xff0c;你可能会遇到无法更改默认浏览器的情况。这可能是因为其他程序或设置正在干扰更改。如果你也遇到了这个问题&#xff0c;不要担心&#xff0c;本文将为你提供详细的解决…

【小笔记】面对一个没搞过的任务,如何选择合适的算法模型?

【学而不思则罔&#xff0c;思而不学则殆】 9.28 1.确定问题定义 确定要解决的问题是一个什么类型&#xff0c;在算法中有没有一个专业的任务名定义它&#xff0c;确定了问题类型就明确了问题解决方向。 有时候我们要解决的问题可能有多种解决问题的角度&#xff0c;此时可能…

Java | CMD命令认识Java

文章目录 1. CMD命令2. Java概念1.1 Java是什么&#xff1f;1.2下载和安装1.2.1 下载1.2.2 安装1.2.3 JDK的安装目录介绍 1.3 Java语言的发展1.4 Java的三大平台1.4.1 JavaSE1.4.2 JavaME1.4.3 JavaEE 1.5 Java的主要特性1.5.1 Java语言跨平台的原理 1.6 Java中认识 JRE 和 JDK…

文明城市美丽乡村随手拍小程序开源版开发

文明城市美丽乡村随手拍小程序开源版开发 拍照功能&#xff1a;用户可以通过小程序直接打开手机相机&#xff0c;拍摄当前所见的城市或乡村美景。 美化照片功能&#xff1a;用户可以在拍摄或选择的照片上进行美化处理&#xff0c;如调整亮度、对比度、饱和度&#xff0c;添加滤…

为什么通配符SSL证书如此受欢迎?

SSL证书是网站安全的重要保障&#xff0c;而通配符SSL证书更是其中的一种。那么&#xff0c;通配符SSL证书有哪些作用呢&#xff1f;为什么通配符SSL证书如此受欢迎呢&#xff1f;下面&#xff0c;我们就来一起探讨一下。 通配符SSL证书的作用有哪些&#xff1f; 通配符SSL证书…