企业网站制作的公司,可以做cps合作的棋牌网站,动态ip建网站,怀化高速网站文章目录 文件/文件夹管理实例批量更改文件名创建编号从0到9的10个文件自动循环运行某个程序显示批处理的完整路径信息将文件名更名为当前系统日期使用批处理命令自动接收用户输入的信息计算当前目录及子目录#xff08;中文件#xff09;所占硬盘空间自动删除当前目录及子目… 文章目录 文件/文件夹管理实例批量更改文件名创建编号从0到9的10个文件自动循环运行某个程序显示批处理的完整路径信息将文件名更名为当前系统日期使用批处理命令自动接收用户输入的信息计算当前目录及子目录中文件所占硬盘空间自动删除当前目录及子目录下所有空文件夹批处理中不同盘符路径的切换 文件/文件夹管理实例
批量更改文件名
命名a.bat写上以下代码
echo off
echo 开始更改文件名
set extensions.rar
set /a sum0
for %%m in (*) do (if not %%m a.bat (ren %%m %%m%extensions%set /a sumsum1)
)
echo 111
echo 修改完成共修改%sum%个文件的后缀
set extensions
set sumren命令修改文件名其实就是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 filenameecho filename表示需要修改的原文件名echo.goto end
)set extension%~x1
for /F tokens1-4 delims/- %%a in (date /t) do (rem set date%%a%%b%%cset date%%b%%c%%d
)
ren %1 %date%%extension%
echo 文件%1已经被改名为%date%%extension%
set extension
set date
:end输出
D:\TEMP\bata.bat 1.txt
文件1.txt已经被改名为20230719.txt原理其实比较简单
首先我们需要知道date /t的输出是这个样子的周三 2023/07/19而我们的这次需求里目的其实是想把20230719提取出来怎么提取呢自然就是分割了就是里面的tokens1-4 delims/- 这部分代码这是啥意思呢
token1-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 (clsecho.echo.echo 当前日期为date /tpausegoto repeat
)
if %num% 2 (clsecho.echo.echo 当前时间为time /tpausegoto repeat
)
if %num% 3 (clsecho.echo.echo 当前文件列表为dir /wpausegoto repeat
)
echo.
echo.
echo 输入了字符%num%批处理自动退出。
pause具体结果不太好演示就不截图了有兴趣的话跑一下就可以。
这里比较有意思的有两点
goto语句带来的类似while循环的功能获取用户输入set /p num表示将用户在回车前的键入都存进变量num里。
计算当前目录及子目录中文件所占硬盘空间
核心在于一个dir指令。
首先我们需要明确dir的输出在cmd里执行dir我的输出是这样的
D:\Code\BATdirVolume in drive D is DataVolume Serial Number is A237-8B58Directory of D:\Code\BAT2023/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 d35 File(s) 728 bytes5 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 tokens3* %%b in (%%a) do (echo 当前目录大小%%b%%c)
)最终输出
D:\Code\BATa.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 tokens3* %%c in (%%b) do (echo %%a: %%c%%d)))echo.输出
D:\Code\BATa.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\BATdir /b
a.bat
a.txt
d1dir /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 sum0
for /f %%a in (listnull.txt) do (rd /q %%aset /a sumsum1
)
echo.
echo 共删除%sum%个空文件夹
echo.
set sum
del /q listnull.txt这里需要特别注意的主要是findstr ||的联合使用。
findstr .其实是指通配任意字符只要前面指令有返回字符串findstr就算成功但是||后面的指令是只有在前面执行失败的时候才会执行这意味着只有当%%a所代表的目录下啥都没有即没有文件也没有文件夹的时候才会执行||后面的命令因此联合使用后反而是相当于是筛出了所有空的%%a。
形如
D:\Code\BATtype listnull.txt
D:\Code\BAT\d2
D:\Code\BAT\d3还有就是几个指令的用法如rd表示删除文件夹del表示删除文件。
批处理中不同盘符路径的切换
这个其实没啥好讲的就是两个切换盘符用的常用指令
pushd 指定路径将当前目录存储到一个虚拟栈里然后将当前工作目录切换成指定的路径如pushd c:\或者是pushd c:\users\
popd将当前工作目录切换成栈里保存的上一个目录。
这里需要注意pushd存储路径的时候是相当于用一个栈去存储的然后popd一个一个弹出栈直到栈里弹空了。