1、用bat构建格式化的数据
代码如下:
@echo off
setlocal enabledelayedexpansion
copy nul 书号.txt
copy nul 档号.txt
copy nul 盒号.txt
copy nul 索引号.txt
echo >索引号.txt
for /f "delims=, tokens=1,2,3,4" %%i in (1.txt) do (
set sy=405041-0206-2024-计-
set dh=1634-2024-计科-
if %%k equ 1 (
echo %%i>>书号.txt
echo %%i>>书号.txt
echo %%j>>盒号.txt
echo %%j>>盒号.txt
echo !sy!%%j>>索引号.txt
echo !sy!%%j>>索引号.txt
echo !dh!%%i-正本01>>档号.txt
echo !dh!%%i-书目袋>>档号.txt
) else if %%k geq 2 (
set /a num=%%k-1
for /l %%b in (1,1,!num!) do (
set str=0%%b
set str=!str:~-2!
echo %%i>>书号.txt
echo %%j>>盒号.txt
echo !sy!%%j>>索引号.txt
echo !dh!%%i-正本!str!>>档号.txt
)
echo %%i>>书号.txt
echo %%i>>书号.txt
echo %%j>>盒号.txt
echo %%j>>盒号.txt
echo !sy!%%j>>索引号.txt
echo !sy!%%j>>索引号.txt
echo !dh!%%i-副本01>>档号.txt
echo !dh!%%i-书目袋>>档号.txt
)
if %%l gtr 0 (
for /l %%y in (1,1,%%l) do (
set str=0%%y
set str=!str:~-2!
echo %%i>>书号.txt
echo %%j>>盒号.txt
echo !sy!%%j>>索引号.txt
echo !dh!%%i-工科!str!>>档号.txt
)
)
)
pause
2、bat字符串截取说明、变量或参数属性截取说明





3、用bat查找文件夹有缺失的书号
案例说明:比如某个书号有n册,文件夹的个数则是n+1个,如果成果中的文件夹个数小于n+1,则说明文件夹有缺失。
代码如下:
@echo off
setlocal enabledelayedexpansion
set txtpath= %cd%
set /p path=请输入要检查的文件路径:
set num=0
cd /d %path%
for /f "delims=, tokens=1,2" %%i in (%txtpath%\1.txt) do (
echo %%i-%%j
set a=0
cd /d %%i
for /d %%x in (*) do (
set /a a+=1
echo %%i- %%x
)
if !a! neq %%j (
echo %%i 文件夹有缺失!!!!!!!!!!!!!!
set /a num+=1
)
echo ----------------------------------
cd..
)
if %num% equ 0 (
echo 没有发现文件夹有缺失的书号
) else (
echo.
echo ----------------------------------
echo 共发现!num!个错误!!!!!!!!!!!!!!
echo ---------------------------------- & echo.
)
pause
说明:
1.txt与bat文件在同一目录下,其保存形式为"书号,数量"
set txtpath= %cd% 把当前路径(即txt与bat文件所在路径)赋值给变量txtpath
for /f "delims=, tokens=1,2" %%i in (%txtpath%\1.txt) do 读取1.txt文件,并以逗号作为分割符,然后提取第1、2列
echo %%i-%%j %%i即为书号,%%j 即为个数
cd /d %%i 进入相应的书号
cd.. 返回上一级文件夹
set /a a+=1 统计文件夹个数
if !a! neq %%j 如何统计到的文件夹个数a 不等于 读取到的个数%%j , 则....
4、bat中去掉字符串中空格最简单的方法
代码如下:
@echo off
set str=你好 大家好 同学们好
echo %str%
set str=%str: =%
echo %str%
pause
说明:
set str=%str: =% 将变量str中的空格替换为空,并将结果赋值给str

5、用bat查找PDF文件为0或PDF有缺失的文件夹
echo off
setlocal enabledelayedexpansion
set /p path=请输入要检查的文件路径:
cd /d %path%
set errornum=0
for /d %%i in (*) do (
pushd %%i
for /d %%j in (*) do (
pushd %%j
set p=0
set num=0
for %%m in (*.pdf) do (
set /a p+=1
set str=%%~nm
set str=!str:~0,2!
if !str! gtr !num! (
set num=!str!
)
)
echo %%i-%%j:有 !p! 个 PDF文件,最大序号为!num! & echo.
if !p! equ 0 (
echo %%i-%%j PDF文件个数为0!!!!!!!!!!& echo.
set /a errornum+=1
)
if !num! lss 10 (
set num=!num:0=!
)
if !num! neq !p! (
echo %%i-%%j PDF文件有缺失!!!!!!!!!!& echo.
set /a errornum+=1
)
popd
)
popd
echo ----------------------------------------------------& echo.
)
if !errornum!==0 (
echo ----------------------------------------------------& echo.
echo 没有发现错误& echo.
echo ----------------------------------------------------& echo.
) else (
echo ----------------------------------------------------& echo.
echo 共发现 !errornum! 个错误& echo.
echo ----------------------------------------------------& echo.
)
pause
说明:
set str=%%~nm 截取变量%%m中的文件名并赋值给str
set str=!str:~0,2! 截取变量str中的前2个字符(即文件名中的数字部分)
if !num! lss 10 (
set num=!num:0=!
)
这个判断很重要:如果num小于10,就把num中的0替换为空!
没有这个判断直接把0替换为空的话,就会把20、30之类的0替换掉,结果显然就错了。
另:9和09在bat中比较并不相等(equ),所有不能用equ或neq来比较它们,但是可以用lss或gtr比较大小,比如09大于8或者9大于08
补充说明:如果数字的位数不是2位,甚至是不固定的,如何去掉它前面的0?
答案是:用"delims=0 tokens=*",请看后面案例"去掉文本文件中所有字符串开头所有的0"
cd /d %path%
1、假如我们想要进入的目录的根目录与当前目录根目录相同,则不用参数/d。
2、假如我们想要进入的目录的根目录与当前目录根目录不同,那么就必须加参数/d。
另:第1种情况下,用/d也可以。所以,所有情况都加/d是最保险的!
上面pushd和popd成对使用,就是用来进出文件夹的,其实也可以用cd 和 cd..来实现进出文件夹,
下面介绍下cd的用法:
CD 等于 CHDIR
显示当前目录名或改变当前目录。
3种语法:
CD [/D] [drive:][path]
CD [..]
CD [\]
1、CD [/D] [drive:][path]改变当前目录为输入目录。
假如我们想要进入的目录的根目录与当前目录根目录相同,则不用参数/d。
例如:C:\Documents and Settings>cd administrator执行后,当前目录就变为:C:\Documents and Settings\Administrator>
假如我们想要进入的目录的根目录与当前目录根目录不同,那么就必须加参数/d。
例如:C:\Documents and Settings>cd /d D:\Tencent执行后,当前目录就变为:D:\Tencent>
另,为保险起见,所有情况都加/d是最好的
2、
cd.. 返回上一级目录
cd..\.. 返回上两级目录
cd..\..\.. 返回上三级目录
cd..\..\..\.. 返回上四级目录
例如:C:\Documents and Settings\Administrator\My Documents\MyMusic\iTunes\Album Artwork\Cache>cd..\..\..\..\..
变为:C:\Documents and Settings\Administrator>
6、很强大的bat重命名文件代码
要求:现有大量文件夹和子文件夹中有大量tif图片,需要将它们重命名为jpg文件,并且要实现文件名为4位数(不足位的补0)
代码如下
echo off
setlocal enabledelayedexpansion
set /p path=请输入要执行重命名的路径:
cd %path%
for /r %%i in ( *.tif) do (
echo %%i
set str=%%~ni
set str=000!str!
set str=!str:~-4!
echo !str!
ren %%i !str!.jpg
)
pause
说明:
set /p path=请输入要执行重命名的路径: 人机交互命令,让用户输入路径并保存到path变量中
cd %path% 进入到path变量对应的路径中
for /r %%i in ( *.tif) 遍历当前路径下所有tif文件
%%i是一个完整的路径
str=%%~nxi 会从%%i中提取最后的文件名和扩展名
set str=%%~ni 会从%%i中提取最后的文件名
set str=000!str! 在前面拼接3个0
set str=!str:~-4! 截取后面4个字符
补充说明:
如果代码中有中文,需要在另存为时把编码改成ANSI,否则会成乱码。特别是路径中有中文时,如果编码不是ANSI,代码将无法执行,却很难发现原因,这时把路径echo出来就能看到乱码,从而找到原因。
ren重命名文件时可以带路径,但新文件名中不能有路径
7、用bat查找并移动未转化成PDF的文件夹到aa文件夹,并找出转化中断的文件夹(只转化了一部分)
代码如下:
echo off
setlocal enabledelayedexpansion
set num=0
for /d %%i in (*号) do (
pushd %%i
set p=0
for /d %%j in (*) do (
pushd %%j
for %%m in (*.pdf) do (
set /a p+=1
)
popd
echo %%i-%%j PDF文件个数为 !p!
)
popd
if !p! equ 0 (
if not exist aa (
mkdir aa
)
move %%i aa
set /a num+=1
)
echo ---------------------------------------------------
)
echo ---------------------------------------------------
echo 共移动 !num! 个文件夹
echo ---------------------------------------------------
for /d %%i in (*号) do (
pushd %%i
for /d %%j in (*) do (
pushd %%j
set a=0
set p=0
for %%k in (*.jpg) do (
set /a a+=1
)
for %%m in (*.pdf) do (
set /a p+=1
)
if !p! gtr 0 (
if !p! neq !a! (
echo %%i-%%j 未转化完成!!!!!!!!!
echo ---------------------------------------------------
) )
popd
)
popd
)
pause
说明:
%cd% 表示当前路径
mkdir aa 表示创建文件夹。如果路径中包含的文件夹不存在,mkdir命令会自动创建它们。如果文件夹已经存在,mkdir不会报错,而是简单地返回一个信息,表明文件夹已存在。为稳妥起见,最好加一个if not exist aa 进行判断
move %%i aa 移动文件夹
8、用bat批量复制指定的文件夹及其子文件夹和文件
在当前目录下查找1.txt中保存的需要复制的书号,并复制到aa文件夹(aa文件夹会自动创建)
代码如下:
echo off
setlocal enabledelayedexpansion
for /f %%i in (1.txt) do (
xcopy %%i aa\%%i /e /i /c /y
)
pause
说明:
for /f %%i in (1.txt) 读取1.txt中的内容,并逐行赋值给%%i
xcopy 用于复制文件和目录
- /E 复制目录和子目录,包括空目录。
- /I 如果目标不存在,且复制的是多个文件,则将目录创建为目录。
- /C 即使出现错误,也会继续复制。
- /Y 覆盖现有的文件而无需提示。
注意:aa\%%i 中的 \%%i 不能少,否则所有案号中的文件都是混在一起
9、bat批量重命名文件(空位补0凑足4位)
代码如下:
echo off
setlocal enabledelayedexpansion
for /f "delims=." %%i in ('dir /b *.jpg') do (
set str=000%%i
set str=!str:~-4!
ren %%i.jpg !str!.jpg
)
pause
说明:
'dir /b *.jpg' 列出当前目录下所有jpg文件
"delims=." 用点号分割,未指定tokens的情况下,默认提取第一部分值,即点号前的值,并赋值给%%i
set str=000%%i 在%%i前加3个0,并赋值给str
set str=!str:~-4! 截取str最后四个字符
10、清理微信垃圾
代码如下:
echo
pushd "C:\Users\Administrator\Documents\WeChat Files"
for /f "tokens=*" %%a in ('dir') do (
echo "%%a"|find "wxid">nul && for /f "tokens=4*" %%b in ("%%a") do (
del /s /q %%b\FileStorage\*.* & del /s /q %%b\ResUpdateV2\*.* & del /s /q %%b\Msg\*.*
)
)
rem 删除所有微信号中的FileStorage、ResUpdateV2、Msg及其子目录下所有文件(包括图片、视频、文件、聊天记录等)
popd
pause
说明:
tokens= *表示获取行上的所有内容,但会忽略行首的所有空格**。当使用tokens=*时,for /f命令会读取文件中的每一行,并将整行内容(包括行首的空格)赋值给指定的变量,但会忽略行首的所有空格。
也可以用"delims=" 来代替"tokens= *" , "delims="表示用"空"作为分割符,但是文本中并没有"空"这个东西,所以并不会进行分割,最终得到的是整行。
echo "%%a"|find "wxid">nul && for /f "tokens=4*" %%b in ("%%a")
上面代码中, | 的作用是将上一命令执行的结果传递给下一命令去处理。&&的作用是如果前面的命令执行成功,则继续执行后面的命令,否则后面命令不执行。tokens=4*表示获取分割后的第四部分及其之后的所有部分
11、清除微信垃圾(逻辑直观版)
代码如下:
@echo off
setlocal enabledelayedexpansion
pushd "C:\Users\Administrator\Documents\WeChat Files"
for /f "delims=" %%i in ('dir') do (
for /f "tokens=4 delims= " %%k in ("%%i") do (
set str=%%k
set part=!str:~0,4!
if !part!==wxid (
del /s /q !str!\FileStorage\*.*
del /s /q !str!\ResUpdateV2\*.*
del /s /q !str!\Msg\*.*
)
)
)
rem 删除所有微信号中的FileStorage、ResUpdateV2、Msg及其子目录下所有文件(包括图片、视频、文件、聊天记录等)
popd
pause
12、用bat将tif文件重命名为jpg文件
@echo off
for /f "delims=." %%i in ('dir /b *.tif') do (
echo %%i
ren %%i.tif %%i.jpg
)
pause
说明:
dir /b *.tif 表示读取当前目录下所有tif文件,用单引号 '' 括起来表示是一组命令,如果用 双引号 "" 括起来则表示是字符串
"delims=." 表示用点号分割,这里没有指定tokens,所以提取的是点号前的部分
13、用bat将文件名中的空格替换为下划线再截掉前面28个字符
有一大批文件,文件名类似如下,现要求去掉每个文件名中重复的内容(即去掉"学习网 张三 循序渐进学java从入门到精通(完整版)")
学习网 张三 循序渐进学java从入门到精通(完整版)000讲 开山篇.wmv
学习网 张三 循序渐进学java从入门到精通(完整版)001讲 Java介绍和JDK的安装配置.wmv
学习网 张三 循序渐进学java从入门到精通(完整版)002讲 课程内容及项目演示.wmv
分析:由于文件名中有空格,所以在bat的命令中要将相关内容用 "" 括起来!!
代码如下:
echo off
setlocal enabledelayedexpansion
::将文件名中的空格替换为下划线
set "str= "
for /f "delims=" %%i in ('dir /b *.wmv') do (
set "var=%%i"
ren "%%i" "!var:%str%=_!"
)
rem 截掉文件名中的前28个字符,并用剩下的字符重命名文件
for %%i in (*.wmv) do (
echo %%i
set new=%%i
set new=!new:~28!
echo !new!
ren %%i !new!
)
pause
说明:注释可以用两个英文冒号(::),也可以用 rem
dir /b命令在Windows命令行中用于显示当前目录下的所有文件名,但不显示其他信息。
dir /b *.wmv 列出所有.wmv 文件
'dir /b *.wmv'中单引号的作用:
1、for /f %%iin (文件名) do (......)
2、for /f %%iin ('命令语句') do (......)
3、for /f %%iin ("字符串") do (......)
第一个括号里的内容是否需要用符号包裹起来,以及使用什么样的符号包裹,取决于要处理的对象属于什么类型:如果是文件,则无需包裹;如果是命令语句,则用单引号包裹;如果是字符串,则使用双引号括起来。
for/f 就是被设计成专门用于解析文本的。读取文本文件的内容,请使用 for /f 语句!
for /f 语句是以行为单位处理文本文件的
切分字符串的利器:delims=
"delims=," 表示以逗号为分割符
如果没有指定 "delims= 符号列表 " 这个开关,那么, for /f 语句默认以空格键或跳格键作为分隔符号。
"delims=" 如果delims=后面没有跟任何字符,则表示整行都被视为一个单独的令牌,不进行任何分割。
"delims=. ," 表示以点号 和 逗号为分割符( 可以一次性指定多个分隔符号**)**
14、用bat将文件名中的空格替换为下划线
@echo off
setlocal enabledelayedexpansion
set "str= "
for /f "delims=" %%i in ('dir /b *.wmv') do (
set "var=%%i"
ren "%%i" "!var:%str%=_!"
)
pause
代码解释:
- @echo off:关闭命令回显。
- setlocal EnableDelayedExpansion:启用延迟变量扩展,以便在for循环内部正确处理变量。
- set "str= ":定义一个变量str,其值为一个空格字符。
- for /f "delims=" %%i in ('dir /b .') do (:遍历当前目录下的所有文件。dir /b列出文件名(不包括路径),*.*表示所有文件类型。
- set "var=%%i":将当前文件名存储在变量var中。
- ren "%%i" "!var:%str%=!":使用ren命令重命名文件,将文件名中的空格替换为下划线。这里使用了延迟变量扩展!var:%str%=!来实现字符串替换。
- pause:暂停脚本执行,以便查看结果
15、查找PDF转化出错的文件夹
查找PDF转化出错的文件夹(原理:当pdf文件数>0且不等于jpg的文件数时就有问题)
echo off
setlocalenabledelayedexpansion
for /d %%i in (*)do (
pushd %%i 进入书号层级
for /d %%j in (*) do (
pushd %%j 进入正本或书目袋层级
set a=0
set p=0
for %%k in (*.jpg) do (
set /a a+=1
)
for %%m in (*.pdf) do (
set /a p+=1
)
if !p! gtr 0 (
if !p! neq !a! (
echo %%i%%j
goto over
)
)
popd
)
popd
)
:over
pause
16、删除当前文件夹及所有子文件夹下的隐藏文件
for /f"delims=" %%i in ('dir /ah /b /s') do (
del /a:h %%i
echo %%i
)
pause
::删除具有隐藏属性的文件 del /a:h D:\test.txt
:: /ah 只显示隐藏文件
::/S 显示指定目录和所有子目录中的文件。
::/B 只显示文件名和扩展名(不显示时间、字节数等其它信息)。
17、适用性强而简洁的重命名文件代码(空位补0)
空位补0代码:
echo
setlocal enabledelayedexpansion
for %%i in (*.jpg) do (
set str=000%%i
set str=!str:~-8!
ren %%i !str!
)
pause
清除占位0代码:
echo
setlocal enabledelayedexpansion
for %%i in (*.jpg) do (
for /f "tokens=* delims=0" %%a in ("%%i") do (
ren %%i %%a
)
)
pause
18、去掉文本文件中所有字符串头所有的0
@echo off
:: 去掉字符串头所有的0
del a6a.txt
for /f "delims=0 tokens=*" %%i in (3.txt) do (
echo %%i>> a6a.txt
)
echo 执行成功!
pause
说明:本案例最成功地方就是:不会去掉数字后面的0,只会去掉数字前面的0
19、用批处理程序提取文本文件中指定的内容
例如:有一文本文件,格式如下:
100,6525,文号A,责任者A,题名A,时间A,30年
100,6525,文号B,责任者B,题名B,时间B,30年
100,6525,,责任者C,题名C,时间C,30年
100,6525,文号D,责任者D,题名D,时间D,30年
100,6525,,责任者E,题名E,时间E,30年
要求:提取其中的文号、责任者、题名、时间
代码如下:
echo
setlocal enabledelayedexpansion
rem 清空2.txt文件
echo "----------"> 2.txt
for /f %%i in (1.txt) do (
set a=%%i
rem 把变量a中的 ,, 替换为 ,【】, 这所以要在,,之间加入一些内容,是因为此字段如果为空,则后面的字段会往前推,以致于提取的内容是错乱的(文号中有责任者,责任者中有题名等)
set a=!a:,,=,【】,!
echo !a! >> 2.txt
)
set a=--------------------------------------
echo !a!> 3.txt
echo !a!> 4.txt
echo !a!> 5.txt
echo !a!> 6.txt
for /f "delims=, tokens=3,4,5,6" %%i in (2.txt) do (
echo %%i>> 3.txt
rem 不能写成echo %%i >> 3.txt 否则写进去的内容会多一个空格(%%i与>>之间不能有空格)
echo %%j>> 4.txt
echo %%k>> 5.txt
echo %%l>> 6.txt
)
::delims,与tokens之间有一个空格
pause
20、自动清除记事本中的空行(包括回车行、空格行)
代码如下:
echo
for /f %%i in (2.txt) do echo %%i >>3.txt
pause
21、用批处理计算猴子吃桃问题
1 、猴子吃桃问题 :猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,第二天早上又把剩下的桃子吃掉了一半,又多吃了一个,以后每天早上都吃前一天剩下的一半零一个,到第十天早上想再吃时,见只剩下一个桃子,求第一天共摘了多少个桃子。
方法一:用 if 和 goto
@echo off
setlocal enabledelayedexpansion
set day=10
set x1=1
set x2=0
echo 第!day!天,桃子数为:!x1!个
:count
if not !day! lss 2 (
set /a x1=x1+1
set /a x2=x1*2
set /a x1=x2
set /a day-=1
echo 第!day!天,桃子数为:!x2!个
goto count
)
pause
方法二:用 if 和 call
@echo off
setlocal enabledelayedexpansion
set day=10
set x1=1
set x2=0
echo 第!day!天,桃子数为:!x1!个
:count
if not !day! lss 2 (
set /a x1=x1+1
set /a x2=x1*2
set /a x1=x2
set /a day-=1
echo 第!day!天,桃子数为:!x2!个
call :count
)
pause
方法三:用 for循环
@echo off
setlocal enabledelayedexpansion
set day=10
set x1=1
set x2=0
for /l %%i in (10,-1,1) do (
echo 第%%i天,桃子数为:!x1!个
set /a x1=x1+1
set /a x2=x1*2
set /a x1=x2
)
pause
改进成人机对话模式:
@echo off
setlocal enabledelayedexpansion
title "用计算机解决小朋友的数学问题"
color F2
echo.
echo.
echo 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,第二天早上又把剩下的桃子吃掉了一半,又多吃了一个,以后每天早上都吃前一天剩下的一半零一个,到第N天早上想再吃时,见只剩下一个桃子,求第一天共摘了多少个桃子。
echo.
echo.
:begin
set /p num=请输入N的值,查看计算结果:
echo.
set x1=1
set x2=0
for /l %%i in (!num!,-1,1) do (
echo 第%%i天,桃子数为:!x1!个
set /a x1=x1+1
set /a x2=x1*2
set /a x1=x2
)
echo.
echo.
goto begin
pause
22、让图片批量自动分组
代码如下:
echo
set str=陈小东 张小玉 李小兰 张三 刘小军 赵小丽 胡小红 田丽
set str2=lucy hanmei lilei feifei honghong fangfang meili xiaomei
for %%i in (%str%) do move %%i.jpg A
for %%i in (%str2%) do move %%i.jpg B
pause
23、批量重命名文件
需求说明:网上下载了一些图片,文件名都是一长串的字符,现要求把它们改4位数格式的文件名
代码如下:
::@echo off
setlocal enabledelayedexpansion
set a=1
for %%i in (*.jpg) do (
echo %%i
set str=000!a!
set str=!str:~-4!
echo !str!.jpg
ren "%%i" !str!.jpg
set /a a+=1
)
Pause
注:"%%i"中的引号不能没有,否则出错!
24、重命名文件及文件夹与子文件夹
有这样一批文件,文件夹及文件名结构如下:
0163-001 第一级文件夹
0163-001-0001 第二级文件夹
0163-001-0001-0001 第三级文件夹
0163-001-0001-0001.jpg 文件名
现要求将0163替换为0167
代码如下:
echo off
setlocal enabledelayedexpansion
for /r %%i in (*.jpg) do (
set str=%%i
set str=!str:~-18!
set str=0167!str!
ren %%i !str!
)
for /d %%i in (*) do (
pushd %%i
for /d %%j in (*) do (
pushd %%j
for /d %%k in (*) do (
set str=%%k
set str=!str:~4!
ren %%k 0167!str!
)
popd
)
popd
)
for /d %%i in (*) do (
pushd %%i
for /d %%j in (*) do (
set str=%%j
set str=!str:~4!
ren %%j 0167!str!
)
popd
)
for /d %%i in (*) do (
set str=%%i
set str=!str:~4!
ren %%i 0167!str!
)
pause
25、显示与隐藏文件夹或文件
echo off
setlocal enabledelayedexpansion
color F2
title 隐藏显示文件
echo.&echo 彻底隐藏和显示文件或文件夹
echo.&echo 程序通过修改注册表来隐藏文件和文件夹。隐藏好后,即使选择"显示所有文件和文件夹",具有隐藏属性的文件也无法显示。要想恢复显示文件,只有修改注册表回原样才行。操作难度不大,用这种办法保护信息安全,只能对付一般电脑小白。
echo 注:有些杀毒软件对修改注册表很敏感,允许程序运行即可,程序无毒可以放心。
echo.&echo.&echo.
set var=HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\Hidden\SHOWALL
for /f "skip=2 delims=x tokens=2" %%i in ('reg query %var% /v CheckedValue') do (
if /i "%%i"=="1" (
echo 当前计算机文件或文件夹处于显示状态。
set /p tem=是否隐藏文件?^(Y/N^)
if /i "!tem!"=="Y" reg add "%var%" /v CheckedValue /t REG_DWORD /d 0 /f
) else (
echo 当前计算机文件或文件夹处于隐藏状态。
set /p tem=是否显示文件?^(Y/N^)
if /i "!tem!"=="Y" reg add "%var%" /v CheckedValue /t REG_DWORD /d 1 /f)
)
)
pause
26、表达式计算
@echo off
:loop
set /p input=请输入要计算的表达式:
set /a var=%input%
echo %input%=%var%
goto loop
pause
注:不能用于计算小数
27、定时关机程序
@echo off
setlocal enabledelayedexpansion
for /l %%i in (1,1,64) do set /p var=-<nul
echo.
echo 请选择:
echo A(定时关机)
echo B(倒计时关机)
echo C(取消倒计时关机)
:loop
set /p a=请输入你的选择:
if /i "!a!"=="a" (
set /p time1=请输入关机时间(24小时制,例如:23:59):
at "!time1!" shutdown -s -f -c "定时关机程序已启动,正在等待关机..."
) else if /i "!a!"=="b" (
set /p time2=请输入倒计时关机时间(单位秒):
shutdown -s -f -t "!time2!" -c "由于你人品有问题,系统在准备关机..."
) else if /i "!a!"=="c" (
shutdown -a
goto quxiao
)
echo 关机命令已执行,正在等待关机......
pause & goto loop
:quxiao
echo 关机命令已取消
pause & goto loop
28、多个子程序的写法
@echo off
set num=0
set shu=20
call :sub num 10 20 30
echo 求和结果为 %num%
call :plus shu 5 3 2 1
echo 求差结果为 %shu%
pause>nul
rem 加法子程序
:sub
set /a %1=%1+%2
shift /2
if not "%2"=="" goto sub
goto :eof
rem 减法子程序
:plus
set /a %1=%1-%2
shift /2
if not "%2"=="" goto plus
goto :eof
注:可以用 goto :eof 表示子程序结束
29、计算2的N次方
@echo off
:loop
set /p n=请输入2的几次方:
set /a num=1^<^<n
echo %num%
goto loop
pause
注:也可以写成 set /a num=1 "<<" n
30、计算字符串长度
@echo off
set /p str=请输入字符串:
if not defined str echo 你没有输入任何字符 & pause & goto :eof
echo 你输入了字符串:%str%
set num=0
:len
set /a num+=1
set str=%str:~0,-1%
if defined str goto len
echo 字符串的长度为 %num%
pause
31、九九乘法表
@echo off
for /l %%i in (1,1,9) do (
for /l %%j in (1,1,9) do (
call :chenfa %%i %%j
)
echo.
)
pause > nul
:chenfa
if %2 gtr %1 (goto :eof)
set /a num=%2*%1
set /p var=%2*%1=%num% <nul
32、九九乘法表2
@echo off
setlocal enabledelayedexpansion
for /l %%i in (1,1,9) do (
for /l %%j in (1,1,9) do (
set /a res=%%i*%%j
set str=%%j*%%i=!res!
if %%j leq %%i (
set /p var=!str! <nul
)
)
echo.
)
pause > nul
33、模拟进度条
@echo off
set /p str=■<nul
for /l %%i in (1,1,38) do (
set /p str=■<nul
ping /n 1 127.1>nul
)
echo.
pause
注 127.1 为127.0.0.1的简写
34、取100以内的随机数
@echo off
setlocal enabledelayedexpansion
echo 取100以内的10个随机数
for /l %%i in (1,1,10) do (
set /a num=!random!%%100
echo !num!
echo.
)
pause
35、去掉字符串中的空格
@echo off
set str=你好 大家好 同学们好
echo %str%
set str=%str: =%
echo %str%
pause
36、生成随机密码
@echo off
setlocal enabledelayedexpansion
call :randompw 6 pw1 pw2 pw3
echo %pw1%
echo %pw2%
echo %pw3%
pause
exit
:randompw
if "%1"=="" echo 密码长度不能为空 & goto :eof
if %1 lss 1 echo 密码长度不能小于1 & goto :eof
set pwlen=%1
set return=
set str=abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ+-_$#
:randompw1
set /a num=!random!%%67
set return=%return%!str:~%num%,1!
set /a pwlen-=1
if %pwlen% gtr 0 goto randompw1
if not "%2"=="" (
set %2=%return%
)
shift /2
if not "%2"=="" goto randompw
goto :eof
37、十进制数转换为任意进制数
@echo off
set /p x=要转换的十进制数:
set /p y=要转换的目标进制:
call :change %x% %y%
pause>nul goto :eof
:change
set/a t=%1/%2
if %t% gtr 0 call :change %t% %2
set /a b=%1%%%2
set /p=%b% <nul
rem 注:上面转换,当进制超过 10 进制时,例如十六进制,那么输出结果以 10 代表 A,11 代表 B,12 代表 C 如此等等。
38、输出国际象棋棋盘
@echo off
setlocal enabledelayedexpansion
set b=0
:loop
for /l %%i in (1,1,4) do (
set a=□■
set/p=!a!<nul
)
echo.
for /l %%i in (1,1,4) do (
set a=■□
set/p=!a!<nul
)
echo.
set/a b+=1
if %b% geq 4 pause>nul&goto :eof
goto :loop
39、一字一字显示效果
@echo off
setlocal enabledelayedexpansion
set str=床前明月光 疑是地上霜 举头望明月 低头思故乡
for %%i in (%str%) do (
set var=%%i
for /l %%k in (0,1,5) do (
set /p var=!var:~%%k,1!<nul
ping /n 1 127.1>nul
)
echo.
)
pause
40、把多个文件夹中和图片合并到一个文件夹
有 多个文件夹,每个文件夹中都有1.png、2.png、3.png三张图,现要将所有文件夹中和图片合并到一个文件夹,并用"原文件夹名称+下划线+数字"的方式进行重命名,代码如下:
@echo off
setlocal enabledelayedexpansion
i=1
for /d %%i in (*) do (
echo %%i
set /a i+=1
cd %%i
for %%j in (*) do (
copy 1.png C:\Users\Administrator\Desktop\OC\1\aa\%%i_1.png
copy 2.png C:\Users\Administrator\Desktop\OC\1\aa\%%i_2.png
copy 3.png C:\Users\Administrator\Desktop\OC\1\aa\%%i_3.png
)
cd ..
)
echo !i!
pause
41、配合"任务计划程序" 自动备份文件
①采用替换原文件的形式(适用于目标路径下有同名文件的情况)
Bat代码如下:
@echo off
echo y|xcopy C:\Users\Administrator\Desktop\1.txt d:\aa\1.txt
pause
任务计划程序的设置如下:
右击"任务计划库"---选择"创建任务"。在"常规"中设置"名称"为"备份文件1.txt"。在"触发器"中点击"新建",在弹出窗口中设置每天某个时间执行任务。在"操作"中点击"新建",在弹出的窗口中点击"浏览",找到执行任务的bat文件,打开。在"条件"选项卡中去掉"只有在计算机使用交流电源时才启动此任务"的勾选。最后点击"确定"。如下所示:

②采用新建文件的形式(适用于目标路径下没有同名文件的情况)
Bat代码如下:
@echo off
echo f|xcopy C:\Users\Administrator\Desktop\1.txt "d:/aa/%date%/1.txt"
pause
注:目标路径(后面的那个路径)要加引号,否则出错,因为%date%产生的数据有空格(其形式如2025/05/24 周六)
说明:使用echo y与echo f的区别:
当采用替换备份时,系统会询问是否替换?所以用echo y通过管道命令符 | 传递给系统一个y(yes的意思)。
当采用新建备份时,系统会询问是文件还是目录?所以用echo f通过管道命令符 | 传递给系统一个f(file的意思)。
1、用bat构建格式化的数据
代码如下:
@echo off
setlocal enabledelayedexpansion
copy nul 书号.txt
copy nul 档号.txt
copy nul 盒号.txt
copy nul 索引号.txt
echo >索引号.txt
for /f "delims=, tokens=1,2,3,4" %%i in (1.txt) do (
set sy=405041-0206-2024-计-
set dh=1634-2024-计科-
if %%k equ 1 (
echo %%i>>书号.txt
echo %%i>>书号.txt
echo %%j>>盒号.txt
echo %%j>>盒号.txt
echo !sy!%%j>>索引号.txt
echo !sy!%%j>>索引号.txt
echo !dh!%%i-正本01>>档号.txt
echo !dh!%%i-书目袋>>档号.txt
) else if %%k geq 2 (
set /a num=%%k-1
for /l %%b in (1,1,!num!) do (
set str=0%%b
set str=!str:~-2!
echo %%i>>书号.txt
echo %%j>>盒号.txt
echo !sy!%%j>>索引号.txt
echo !dh!%%i-正本!str!>>档号.txt
)
echo %%i>>书号.txt
echo %%i>>书号.txt
echo %%j>>盒号.txt
echo %%j>>盒号.txt
echo !sy!%%j>>索引号.txt
echo !sy!%%j>>索引号.txt
echo !dh!%%i-副本01>>档号.txt
echo !dh!%%i-书目袋>>档号.txt
)
if %%l gtr 0 (
for /l %%y in (1,1,%%l) do (
set str=0%%y
set str=!str:~-2!
echo %%i>>书号.txt
echo %%j>>盒号.txt
echo !sy!%%j>>索引号.txt
echo !dh!%%i-工科!str!>>档号.txt
)
)
)
pause
2、bat字符串截取说明、变量或参数属性截取说明
3、用bat查找文件夹有缺失的书号
案例说明:比如某个书号有n册,文件夹的个数则是n+1个,如果成果中的文件夹个数小于n+1,则说明文件夹有缺失。
代码如下:
@echo off
setlocal enabledelayedexpansion
set txtpath= %cd%
set /p path=请输入要检查的文件路径:
set num=0
cd /d %path%
for /f "delims=, tokens=1,2" %%i in (%txtpath%\1.txt) do (
echo %%i-%%j
set a=0
cd /d %%i
for /d %%x in (*) do (
set /a a+=1
echo %%i- %%x
)
if !a! neq %%j (
echo %%i 文件夹有缺失!!!!!!!!!!!!!!
set /a num+=1
)
echo ----------------------------------
cd..
)
if %num% equ 0 (
echo 没有发现文件夹有缺失的书号
) else (
echo.
echo ----------------------------------
echo 共发现!num!个错误!!!!!!!!!!!!!!
echo ---------------------------------- & echo.
)
pause
说明:
1.txt与bat文件在同一目录下,其保存形式为"书号,数量"
set txtpath= %cd% 把当前路径(即txt与bat文件所在路径)赋值给变量txtpath
for /f "delims=, tokens=1,2" %%i in (%txtpath%\1.txt) do 读取1.txt文件,并以逗号作为分割符,然后提取第1、2列
echo %%i-%%j %%i即为书号,%%j 即为个数
cd /d %%i 进入相应的书号
cd.. 返回上一级文件夹
set /a a+=1 统计文件夹个数
if !a! neq %%j 如何统计到的文件夹个数a 不等于 读取到的个数%%j , 则....
4、bat中去掉字符串中空格最简单的方法
代码如下:
@echo off
set str=你好 大家好 同学们好
echo %str%
set str=%str: =%
echo %str%
pause
说明:
set str=%str: =% 将变量str中的空格替换为空,并将结果赋值给str
5、用bat查找PDF文件为0或PDF有缺失的文件夹
echo off
setlocal enabledelayedexpansion
set /p path=请输入要检查的文件路径:
cd /d %path%
set errornum=0
for /d %%i in (*) do (
pushd %%i
for /d %%j in (*) do (
pushd %%j
set p=0
set num=0
for %%m in (*.pdf) do (
set /a p+=1
set str=%%~nm
set str=!str:~0,2!
if !str! gtr !num! (
set num=!str!
)
)
echo %%i-%%j:有 !p! 个 PDF文件,最大序号为!num! & echo.
if !p! equ 0 (
echo %%i-%%j PDF文件个数为0!!!!!!!!!!& echo.
set /a errornum+=1
)
if !num! lss 10 (
set num=!num:0=!
)
if !num! neq !p! (
echo %%i-%%j PDF文件有缺失!!!!!!!!!!& echo.
set /a errornum+=1
)
popd
)
popd
echo ----------------------------------------------------& echo.
)
if !errornum!==0 (
echo ----------------------------------------------------& echo.
echo 没有发现错误& echo.
echo ----------------------------------------------------& echo.
) else (
echo ----------------------------------------------------& echo.
echo 共发现 !errornum! 个错误& echo.
echo ----------------------------------------------------& echo.
)
pause
说明:
set str=%%~nm 截取变量%%m中的文件名并赋值给str
set str=!str:~0,2! 截取变量str中的前2个字符(即文件名中的数字部分)
if !num! lss 10 (
set num=!num:0=!
)
这个判断很重要:如果num小于10,就把num中的0替换为空!
没有这个判断直接把0替换为空的话,就会把20、30之类的0替换掉,结果显然就错了。
另:9和09在bat中比较并不相等(equ),所有不能用equ或neq来比较它们,但是可以用lss或gtr比较大小,比如09大于8或者9大于08
补充说明:如果数字的位数不是2位,甚至是不固定的,如何去掉它前面的0?
答案是:用"delims=0 tokens=*",请看后面案例"去掉文本文件中所有字符串开头所有的0"
cd /d %path%
1、假如我们想要进入的目录的根目录与当前目录根目录相同,则不用参数/d。
2、假如我们想要进入的目录的根目录与当前目录根目录不同,那么就必须加参数/d。
另:第1种情况下,用/d也可以。所以,所有情况都加/d是最保险的!
上面pushd和popd成对使用,就是用来进出文件夹的,其实也可以用cd 和 cd..来实现进出文件夹,
下面介绍下cd的用法:
CD 等于 CHDIR
显示当前目录名或改变当前目录。
3种语法:
CD [/D] [drive:][path]
CD [..]
CD [\]
1、CD [/D] [drive:][path]改变当前目录为输入目录。
假如我们想要进入的目录的根目录与当前目录根目录相同,则不用参数/d。
例如:C:\Documents and Settings>cd administrator执行后,当前目录就变为:C:\Documents and Settings\Administrator>
假如我们想要进入的目录的根目录与当前目录根目录不同,那么就必须加参数/d。
例如:C:\Documents and Settings>cd /d D:\Tencent执行后,当前目录就变为:D:\Tencent>
另,为保险起见,所有情况都加/d是最好的
2、
cd.. 返回上一级目录
cd..\.. 返回上两级目录
cd..\..\.. 返回上三级目录
cd..\..\..\.. 返回上四级目录
例如:C:\Documents and Settings\Administrator\My Documents\MyMusic\iTunes\Album Artwork\Cache>cd..\..\..\..\..
变为:C:\Documents and Settings\Administrator>
6、很强大的bat重命名文件代码
要求:现有大量文件夹和子文件夹中有大量tif图片,需要将它们重命名为jpg文件,并且要实现文件名为4位数(不足位的补0)
代码如下
echo off
setlocal enabledelayedexpansion
set /p path=请输入要执行重命名的路径:
cd %path%
for /r %%i in ( *.tif) do (
echo %%i
set str=%%~ni
set str=000!str!
set str=!str:~-4!
echo !str!
ren %%i !str!.jpg
)
pause
说明:
set /p path=请输入要执行重命名的路径: 人机交互命令,让用户输入路径并保存到path变量中
cd %path% 进入到path变量对应的路径中
for /r %%i in ( *.tif) 遍历当前路径下所有tif文件
%%i是一个完整的路径
str=%%~nxi 会从%%i中提取最后的文件名和扩展名
set str=%%~ni 会从%%i中提取最后的文件名
set str=000!str! 在前面拼接3个0
set str=!str:~-4! 截取后面4个字符
补充说明:
如果代码中有中文,需要在另存为时把编码改成ANSI,否则会成乱码。特别是路径中有中文时,如果编码不是ANSI,代码将无法执行,却很难发现原因,这时把路径echo出来就能看到乱码,从而找到原因。
ren重命名文件时可以带路径,但新文件名中不能有路径
7、用bat查找并移动未转化成PDF的文件夹到aa文件夹,并找出转化中断的文件夹(只转化了一部分)
代码如下:
echo off
setlocal enabledelayedexpansion
set num=0
for /d %%i in (*号) do (
pushd %%i
set p=0
for /d %%j in (*) do (
pushd %%j
for %%m in (*.pdf) do (
set /a p+=1
)
popd
echo %%i-%%j PDF文件个数为 !p!
)
popd
if !p! equ 0 (
if not exist aa (
mkdir aa
)
move %%i aa
set /a num+=1
)
echo ---------------------------------------------------
)
echo ---------------------------------------------------
echo 共移动 !num! 个文件夹
echo ---------------------------------------------------
for /d %%i in (*号) do (
pushd %%i
for /d %%j in (*) do (
pushd %%j
set a=0
set p=0
for %%k in (*.jpg) do (
set /a a+=1
)
for %%m in (*.pdf) do (
set /a p+=1
)
if !p! gtr 0 (
if !p! neq !a! (
echo %%i-%%j 未转化完成!!!!!!!!!
echo ---------------------------------------------------
) )
popd
)
popd
)
pause
说明:
%cd% 表示当前路径
mkdir aa 表示创建文件夹。如果路径中包含的文件夹不存在,mkdir命令会自动创建它们。如果文件夹已经存在,mkdir不会报错,而是简单地返回一个信息,表明文件夹已存在。为稳妥起见,最好加一个if not exist aa 进行判断
move %%i aa 移动文件夹
8、用bat批量复制指定的文件夹及其子文件夹和文件
在当前目录下查找1.txt中保存的需要复制的书号,并复制到aa文件夹(aa文件夹会自动创建)
代码如下:
echo off
setlocal enabledelayedexpansion
for /f %%i in (1.txt) do (
xcopy %%i aa\%%i /e /i /c /y
)
pause
说明:
for /f %%i in (1.txt) 读取1.txt中的内容,并逐行赋值给%%i
xcopy 用于复制文件和目录
/E 复制目录和子目录,包括空目录。
/I 如果目标不存在,且复制的是多个文件,则将目录创建为目录。
/C 即使出现错误,也会继续复制。
/Y 覆盖现有的文件而无需提示。
注意:aa\%%i 中的 \%%i 不能少,否则所有案号中的文件都是混在一起
9、bat批量重命名文件(空位补0凑足4位)
代码如下:
echo off
setlocal enabledelayedexpansion
for /f "delims=." %%i in ('dir /b *.jpg') do (
set str=000%%i
set str=!str:~-4!
ren %%i.jpg !str!.jpg
)
pause
说明:
'dir /b *.jpg' 列出当前目录下所有jpg文件
"delims=." 用点号分割,未指定tokens的情况下,默认提取第一部分值,即点号前的值,并赋值给%%i
set str=000%%i 在%%i前加3个0,并赋值给str
set str=!str:~-4! 截取str最后四个字符
10、清理微信垃圾
代码如下:
echo
pushd "C:\Users\Administrator\Documents\WeChat Files"
for /f "tokens=*" %%a in ('dir') do (
echo "%%a"|find "wxid">nul && for /f "tokens=4*" %%b in ("%%a") do (
del /s /q %%b\FileStorage\*.* & del /s /q %%b\ResUpdateV2\*.* & del /s /q %%b\Msg\*.*
)
)
rem 删除所有微信号中的FileStorage、ResUpdateV2、Msg及其子目录下所有文件(包括图片、视频、文件、聊天记录等)
popd
pause
说明:
tokens=*表示获取行上的所有内容,但会忽略行首的所有空格**。当使用tokens=*时,for /f命令会读取文件中的每一行,并将整行内容(包括行首的空格)赋值给指定的变量,但会忽略行首的所有空格。
也可以用"delims=" 来代替" tokens=*" , "delims="表示用"空"作为分割符,但是文本中并没有"空"这个东西,所以并不会进行分割,最终得到的是整行。
echo "%%a"|find "wxid">nul && for /f "tokens=4*" %%b in ("%%a")
上面代码中, | 的作用是将上一命令执行的结果传递给下一命令去处理。&&的作用是如果前面的命令执行成功,则继续执行后面的命令,否则后面命令不执行。tokens=4*表示获取分割后的第四部分及其之后的所有部分
11、清除微信垃圾(逻辑直观版)
代码如下:
@echo off
setlocal enabledelayedexpansion
pushd "C:\Users\Administrator\Documents\WeChat Files"
for /f "delims=" %%i in ('dir') do (
for /f "tokens=4 delims= " %%k in ("%%i") do (
set str=%%k
set part=!str:~0,4!
if !part!==wxid (
del /s /q !str!\FileStorage\*.*
del /s /q !str!\ResUpdateV2\*.*
del /s /q !str!\Msg\*.*
)
)
)
rem 删除所有微信号中的FileStorage、ResUpdateV2、Msg及其子目录下所有文件(包括图片、视频、文件、聊天记录等)
popd
pause
12、用bat将tif文件重命名为jpg文件
@echo off
for /f "delims=." %%i in ('dir /b *.tif') do (
echo %%i
ren %%i.tif %%i.jpg
)
pause
说明:
dir /b *.tif 表示读取当前目录下所有tif文件,用单引号 '' 括起来表示是一组命令,如果用 双引号 "" 括起来则表示是字符串
"delims=." 表示用点号分割,这里没有指定tokens,所以提取的是点号前的部分
13、用bat将文件名中的空格替换为下划线再截掉前面28个字符
有一大批文件,文件名类似如下,现要求去掉每个文件名中重复的内容(即去掉"学习网 张三 循序渐进学java从入门到精通(完整版)")
学习网 张三 循序渐进学java从入门到精通(完整版)000讲 开山篇.wmv
学习网 张三 循序渐进学java从入门到精通(完整版)001讲 Java介绍和JDK的安装配置.wmv
学习网 张三 循序渐进学java从入门到精通(完整版)002讲 课程内容及项目演示.wmv
分析:由于文件名中有空格,所以在bat的命令中要将相关内容用 "" 括起来!!
代码如下:
echo off
setlocal enabledelayedexpansion
::将文件名中的空格替换为下划线
set "str= "
for /f "delims=" %%i in ('dir /b *.wmv') do (
set "var=%%i"
ren "%%i" "!var:%str%=_!"
)
rem 截掉文件名中的前28个字符,并用剩下的字符重命名文件
for %%i in (*.wmv) do (
echo %%i
set new=%%i
set new=!new:~28!
echo !new!
ren %%i !new!
)
pause
说明:注释可以用两个英文冒号(::),也可以用 rem
dir /b命令在Windows命令行中用于显示当前目录下的所有文件名,但不显示其他信息。
dir /b *.wmv 列出所有.wmv 文件
'dir /b *.wmv'中单引号的作用:
1、for /f %%iin (文件名) do (......)
2、for /f %%iin ('命令语句') do (......)
3、for /f %%iin ("字符串") do (......)
第一个括号里的内容是否需要用符号包裹起来,以及使用什么样的符号包裹,取决于要处理的对象属于什么类型:如果是文件,则无需包裹;如果是命令语句,则用单引号包裹;如果是字符串,则使用双引号括起来。
for/f 就是被设计成专门用于解析文本的。读取文本文件的内容,请使用 for /f 语句!
for /f 语句是以行为单位处理文本文件的
切分字符串的利器:delims=
"delims=," 表示以逗号为分割符
如果没有指定"delims=符号列表"这个开关,那么,for /f 语句默认以空格键或跳格键作为分隔符号。
"delims=" 如果delims=后面没有跟任何字符,则表示整行都被视为一个单独的令牌,不进行任何分割。
"delims=.," 表示以点号 和 逗号为分割符(可以一次性指定多个分隔符号)
14、用bat将文件名中的空格替换为下划线
@echo off
setlocal enabledelayedexpansion
set "str= "
for /f "delims=" %%i in ('dir /b *.wmv') do (
set "var=%%i"
ren "%%i" "!var:%str%=_!"
)
pause
代码解释:
@echo off:关闭命令回显。
setlocal EnableDelayedExpansion:启用延迟变量扩展,以便在for循环内部正确处理变量。
set "str= ":定义一个变量str,其值为一个空格字符。
for /f "delims=" %%i in ('dir /b *.*') do (:遍历当前目录下的所有文件。dir /b列出文件名(不包括路径),*.*表示所有文件类型。
set "var=%%i":将当前文件名存储在变量var中。
ren "%%i" "!var:%str%=_!":使用ren命令重命名文件,将文件名中的空格替换为下划线。这里使用了延迟变量扩展!var:%str%=_!来实现字符串替换。
pause:暂停脚本执行,以便查看结果
15、查找PDF转化出错的文件夹
查找PDF转化出错的文件夹(原理:当pdf文件数>0且不等于jpg的文件数时就有问题)
echo off
setlocalenabledelayedexpansion
for /d %%i in (*)do (
pushd %%i 进入书号层级
for /d %%j in (*) do (
pushd %%j 进入正本或书目袋层级
set a=0
set p=0
for %%k in (*.jpg) do (
set /a a+=1
)
for %%m in (*.pdf) do (
set /a p+=1
)
if !p! gtr 0 (
if !p! neq !a! (
echo %%i%%j
goto over
)
)
popd
)
popd
)
:over
pause
16、删除当前文件夹及所有子文件夹下的隐藏文件
for /f"delims=" %%i in ('dir /ah /b /s') do (
del /a:h %%i
echo %%i
)
pause
::删除具有隐藏属性的文件 del /a:h D:\test.txt
:: /ah 只显示隐藏文件
::/S 显示指定目录和所有子目录中的文件。
::/B 只显示文件名和扩展名(不显示时间、字节数等其它信息)。
17、适用性强而简洁的重命名文件代码(空位补0)
空位补0代码:
echo
setlocal enabledelayedexpansion
for %%i in (*.jpg) do (
set str=000%%i
set str=!str:~-8!
ren %%i !str!
)
pause
清除占位0代码:
echo
setlocal enabledelayedexpansion
for %%i in (*.jpg) do (
for /f "tokens=* delims=0" %%a in ("%%i") do (
ren %%i %%a
)
)
pause
18、去掉文本文件中所有字符串头所有的0
@echo off
:: 去掉字符串头所有的0
del a6a.txt
for /f "delims=0 tokens=*" %%i in (3.txt) do (
echo %%i>> a6a.txt
)
echo 执行成功!
pause
说明:本案例最成功地方就是:不会去掉数字后面的0,只会去掉数字前面的0
19、用批处理程序提取文本文件中指定的内容
例如:有一文本文件,格式如下:
100,6525,文号A,责任者A,题名A,时间A,30年
100,6525,文号B,责任者B,题名B,时间B,30年
100,6525,,责任者C,题名C,时间C,30年
100,6525,文号D,责任者D,题名D,时间D,30年
100,6525,,责任者E,题名E,时间E,30年
要求:提取其中的文号、责任者、题名、时间
代码如下:
echo
setlocal enabledelayedexpansion
rem 清空2.txt文件
echo "----------"> 2.txt
for /f %%i in (1.txt) do (
set a=%%i
rem 把变量a中的 ,, 替换为 ,【】, 这所以要在,,之间加入一些内容,是因为此字段如果为空,则后面的字段会往前推,以致于提取的内容是错乱的(文号中有责任者,责任者中有题名等)
set a=!a:,,=,【】,!
echo !a! >> 2.txt
)
set a=--------------------------------------
echo !a!> 3.txt
echo !a!> 4.txt
echo !a!> 5.txt
echo !a!> 6.txt
for /f "delims=, tokens=3,4,5,6" %%i in (2.txt) do (
echo %%i>> 3.txt
rem 不能写成echo %%i >> 3.txt 否则写进去的内容会多一个空格(%%i与>>之间不能有空格)
echo %%j>> 4.txt
echo %%k>> 5.txt
echo %%l>> 6.txt
)
::delims,与tokens之间有一个空格
pause
20、自动清除记事本中的空行(包括回车行、空格行)
代码如下:
echo
for /f %%i in (2.txt) do echo %%i >>3.txt
pause
21、用批处理计算猴子吃桃问题
1、猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,第二天早上又把剩下的桃子吃掉了一半,又多吃了一个,以后每天早上都吃前一天剩下的一半零一个,到第十天早上想再吃时,见只剩下一个桃子,求第一天共摘了多少个桃子。
方法一:用 if 和 goto
@echo off
setlocal enabledelayedexpansion
set day=10
set x1=1
set x2=0
echo 第!day!天,桃子数为:!x1!个
:count
if not !day! lss 2 (
set /a x1=x1+1
set /a x2=x1*2
set /a x1=x2
set /a day-=1
echo 第!day!天,桃子数为:!x2!个
goto count
)
pause
方法二:用 if 和 call
@echo off
setlocal enabledelayedexpansion
set day=10
set x1=1
set x2=0
echo 第!day!天,桃子数为:!x1!个
:count
if not !day! lss 2 (
set /a x1=x1+1
set /a x2=x1*2
set /a x1=x2
set /a day-=1
echo 第!day!天,桃子数为:!x2!个
call :count
)
pause
方法三:用 for循环
@echo off
setlocal enabledelayedexpansion
set day=10
set x1=1
set x2=0
for /l %%i in (10,-1,1) do (
echo 第%%i天,桃子数为:!x1!个
set /a x1=x1+1
set /a x2=x1*2
set /a x1=x2
)
pause
改进成人机对话模式:
@echo off
setlocal enabledelayedexpansion
title "用计算机解决小朋友的数学问题"
color F2
echo.
echo.
echo 猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个,第二天早上又把剩下的桃子吃掉了一半,又多吃了一个,以后每天早上都吃前一天剩下的一半零一个,到第N天早上想再吃时,见只剩下一个桃子,求第一天共摘了多少个桃子。
echo.
echo.
:begin
set /p num=请输入N的值,查看计算结果:
echo.
set x1=1
set x2=0
for /l %%i in (!num!,-1,1) do (
echo 第%%i天,桃子数为:!x1!个
set /a x1=x1+1
set /a x2=x1*2
set /a x1=x2
)
echo.
echo.
goto begin
pause
22、让图片批量自动分组
代码如下:
echo
set str=陈小东 张小玉 李小兰 张三 刘小军 赵小丽 胡小红 田丽
set str2=lucy hanmei lilei feifei honghong fangfang meili xiaomei
for %%i in (%str%) do move %%i.jpg A
for %%i in (%str2%) do move %%i.jpg B
pause
23、批量重命名文件
需求说明:网上下载了一些图片,文件名都是一长串的字符,现要求把它们改4位数格式的文件名
代码如下:
::@echo off
setlocal enabledelayedexpansion
set a=1
for %%i in (*.jpg) do (
echo %%i
set str=000!a!
set str=!str:~-4!
echo !str!.jpg
ren "%%i" !str!.jpg
set /a a+=1
)
Pause
注:"%%i"中的引号不能没有,否则出错!
24、重命名文件及文件夹与子文件夹
有这样一批文件,文件夹及文件名结构如下:
0163-001 第一级文件夹
0163-001-0001 第二级文件夹
0163-001-0001-0001 第三级文件夹
0163-001-0001-0001.jpg 文件名
现要求将0163替换为0167
代码如下:
echo off
setlocal enabledelayedexpansion
for /r %%i in (*.jpg) do (
set str=%%i
set str=!str:~-18!
set str=0167!str!
ren %%i !str!
)
for /d %%i in (*) do (
pushd %%i
for /d %%j in (*) do (
pushd %%j
for /d %%k in (*) do (
set str=%%k
set str=!str:~4!
ren %%k 0167!str!
)
popd
)
popd
)
for /d %%i in (*) do (
pushd %%i
for /d %%j in (*) do (
set str=%%j
set str=!str:~4!
ren %%j 0167!str!
)
popd
)
for /d %%i in (*) do (
set str=%%i
set str=!str:~4!
ren %%i 0167!str!
)
pause
25、显示与隐藏文件夹或文件
echo off
setlocal enabledelayedexpansion
color F2
title 隐藏显示文件
echo.&echo 彻底隐藏和显示文件或文件夹
echo.&echo 程序通过修改注册表来隐藏文件和文件夹。隐藏好后,即使选择"显示所有文件和文件夹",具有隐藏属性的文件也无法显示。要想恢复显示文件,只有修改注册表回原样才行。操作难度不大,用这种办法保护信息安全,只能对付一般电脑小白。
echo 注:有些杀毒软件对修改注册表很敏感,允许程序运行即可,程序无毒可以放心。
echo.&echo.&echo.
set var=HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\Hidden\SHOWALL
for /f "skip=2 delims=x tokens=2" %%i in ('reg query %var% /v CheckedValue') do (
if /i "%%i"=="1" (
echo 当前计算机文件或文件夹处于显示状态。
set /p tem=是否隐藏文件?^(Y/N^)
if /i "!tem!"=="Y" reg add "%var%" /v CheckedValue /t REG_DWORD /d 0 /f
) else (
echo 当前计算机文件或文件夹处于隐藏状态。
set /p tem=是否显示文件?^(Y/N^)
if /i "!tem!"=="Y" reg add "%var%" /v CheckedValue /t REG_DWORD /d 1 /f)
)
)
pause
26、表达式计算
@echo off
:loop
set /p input=请输入要计算的表达式:
set /a var=%input%
echo %input%=%var%
goto loop
pause
注:不能用于计算小数
27、定时关机程序
@echo off
setlocal enabledelayedexpansion
for /l %%i in (1,1,64) do set /p var=-<nul
echo.
echo 请选择:
echo A(定时关机)
echo B(倒计时关机)
echo C(取消倒计时关机)
:loop
set /p a=请输入你的选择:
if /i "!a!"=="a" (
set /p time1=请输入关机时间(24小时制,例如:23:59):
at "!time1!" shutdown -s -f -c "定时关机程序已启动,正在等待关机..."
) else if /i "!a!"=="b" (
set /p time2=请输入倒计时关机时间(单位秒):
shutdown -s -f -t "!time2!" -c "由于你人品有问题,系统在准备关机..."
) else if /i "!a!"=="c" (
shutdown -a
goto quxiao
)
echo 关机命令已执行,正在等待关机......
pause & goto loop
:quxiao
echo 关机命令已取消
pause & goto loop
28、多个子程序的写法
@echo off
set num=0
set shu=20
call :sub num 10 20 30
echo 求和结果为 %num%
call :plus shu 5 3 2 1
echo 求差结果为 %shu%
pause>nul
rem 加法子程序
:sub
set /a %1=%1+%2
shift /2
if not "%2"=="" goto sub
goto :eof
rem 减法子程序
:plus
set /a %1=%1-%2
shift /2
if not "%2"=="" goto plus
goto :eof
注:可以用 goto :eof 表示子程序结束
29、计算2的N次方
@echo off
:loop
set /p n=请输入2的几次方:
set /a num=1^<^<n
echo %num%
goto loop
pause
注:也可以写成 set /a num=1 "<<" n
30、计算字符串长度
@echo off
set /p str=请输入字符串:
if not defined str echo 你没有输入任何字符 & pause & goto :eof
echo 你输入了字符串:%str%
set num=0
:len
set /a num+=1
set str=%str:~0,-1%
if defined str goto len
echo 字符串的长度为 %num%
pause
31、九九乘法表
@echo off
for /l %%i in (1,1,9) do (
for /l %%j in (1,1,9) do (
call :chenfa %%i %%j
)
echo.
)
pause > nul
:chenfa
if %2 gtr %1 (goto :eof)
set /a num=%2*%1
set /p var=%2*%1=%num% <nul
32、九九乘法表2
@echo off
setlocal enabledelayedexpansion
for /l %%i in (1,1,9) do (
for /l %%j in (1,1,9) do (
set /a res=%%i*%%j
set str=%%j*%%i=!res!
if %%j leq %%i (
set /p var=!str! <nul
)
)
echo.
)
pause > nul
33、模拟进度条
@echo off
set /p str=■<nul
for /l %%i in (1,1,38) do (
set /p str=■<nul
ping /n 1 127.1>nul
)
echo.
pause
注 127.1 为127.0.0.1的简写
34、取100以内的随机数
@echo off
setlocal enabledelayedexpansion
echo 取100以内的10个随机数
for /l %%i in (1,1,10) do (
set /a num=!random!%%100
echo !num!
echo.
)
pause
35、去掉字符串中的空格
@echo off
set str=你好 大家好 同学们好
echo %str%
set str=%str: =%
echo %str%
pause
36、生成随机密码
@echo off
setlocal enabledelayedexpansion
call :randompw 6 pw1 pw2 pw3
echo %pw1%
echo %pw2%
echo %pw3%
pause
exit
:randompw
if "%1"=="" echo 密码长度不能为空 & goto :eof
if %1 lss 1 echo 密码长度不能小于1 & goto :eof
set pwlen=%1
set return=
set str=abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ+-_$#
:randompw1
set /a num=!random!%%67
set return=%return%!str:~%num%,1!
set /a pwlen-=1
if %pwlen% gtr 0 goto randompw1
if not "%2"=="" (
set %2=%return%
)
shift /2
if not "%2"=="" goto randompw
goto :eof
37、十进制数转换为任意进制数
@echo off
set /p x=要转换的十进制数:
set /p y=要转换的目标进制:
call :change %x% %y%
pause>nul goto :eof
:change
set/a t=%1/%2
if %t% gtr 0 call :change %t% %2
set /a b=%1%%%2
set /p=%b% <nul
rem 注:上面转换,当进制超过 10 进制时,例如十六进制,那么输出结果以 10 代表 A,11 代表 B,12 代表 C 如此等等。
38、输出国际象棋棋盘
@echo off
setlocal enabledelayedexpansion
set b=0
:loop
for /l %%i in (1,1,4) do (
set a=□■
set/p=!a!<nul
)
echo.
for /l %%i in (1,1,4) do (
set a=■□
set/p=!a!<nul
)
echo.
set/a b+=1
if %b% geq 4 pause>nul&goto :eof
goto :loop
39、一字一字显示效果
@echo off
setlocal enabledelayedexpansion
set str=床前明月光 疑是地上霜 举头望明月 低头思故乡
for %%i in (%str%) do (
set var=%%i
for /l %%k in (0,1,5) do (
set /p var=!var:~%%k,1!<nul
ping /n 1 127.1>nul
)
echo.
)
pause
40、把多个文件夹中和图片合并到一个文件夹
有 多个文件夹,每个文件夹中都有1.png、2.png、3.png三张图,现要将所有文件夹中和图片合并到一个文件夹,并用"原文件夹名称+下划线+数字"的方式进行重命名,代码如下:
@echo off
setlocal enabledelayedexpansion
i=1
for /d %%i in (*) do (
echo %%i
set /a i+=1
cd %%i
for %%j in (*) do (
copy 1.png C:\Users\Administrator\Desktop\OC\1\aa\%%i_1.png
copy 2.png C:\Users\Administrator\Desktop\OC\1\aa\%%i_2.png
copy 3.png C:\Users\Administrator\Desktop\OC\1\aa\%%i_3.png
)
cd ..
)
echo !i!
pause
41、配合"任务计划程序" 自动备份文件
①采用替换原文件的形式(适用于目标路径下有同名文件的情况)
Bat代码如下:
@echo off
echo y|xcopy C:\Users\Administrator\Desktop\1.txt d:\aa\1.txt
pause
任务计划程序的设置如下:
右击"任务计划库"---选择"创建任务"。在"常规"中设置"名称"为"备份文件1.txt"。在"触发器"中点击"新建",在弹出窗口中设置每天某个时间执行任务。在"操作"中点击"新建",在弹出的窗口中点击"浏览",找到执行任务的bat文件,打开。在"条件"选项卡中去掉"只有在计算机使用交流电源时才启动此任务"的勾选。最后点击"确定"。如下所示:
②采用新建文件的形式(适用于目标路径下没有同名文件的情况)
Bat代码如下:
@echo off
echo f|xcopy C:\Users\Administrator\Desktop\1.txt "d:/aa/%date%/1.txt"
pause
注:目标路径(后面的那个路径)要加引号,否则出错,因为%date%产生的数据有空格(其形式如2025/05/24 周六)
说明:使用echo y与echo f的区别:
当采用替换备份时,系统会询问是否替换?所以用echo y通过管道命令符 | 传递给系统一个y(yes的意思)。
当采用新建备份时,系统会询问是文件还是目录?所以用echo f通过管道命令符 | 传递给系统一个f(file的意思)。