连云港做电商网站的公司承德网站建设作用
文章目录
- 文件/文件夹管理实例
 - 批量更改文件名
 - 创建编号从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 filenameecho filename表示需要修改的原文件名echo.goto end
)set extension=%~x1
for /F "tokens=1-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\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" (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\BAT>dirVolume 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 "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 %%aset /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一个一个弹出栈,直到栈里弹空了。
