《Windows批处理(BAT)脚本实战大全:41个场景告别重复操作》含文件处理/查找/重命名/清理等)

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

代码解释:

  1. @echo off:关闭命令回显。
  2. setlocal EnableDelayedExpansion:启用延迟变量扩展,以便在for循环内部正确处理变量。
  3. set "str= ":定义一个变量str,其值为一个空格字符。
  4. for /f "delims=" %%i in ('dir /b .') do (:遍历当前目录下的所有文件。dir /b列出文件名(不包括路径),*.*表示所有文件类型。
  5. set "var=%%i":将当前文件名存储在变量var中。
  6. ren "%%i" "!var:%str%=!":使用ren命令重命名文件,将文件名中的空格替换为下划线。这里使用了延迟变量扩展!var:%str%=!来实现字符串替换。
  7. 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的意思)。

​
相关推荐
xrkhy2 小时前
windows家庭版,D盘安装docker,下载大模型
windows·docker·容器
松莫莫3 小时前
Vue 3 项目搭建完整流程(Windows 版 · 避坑指南)
前端·vue.js·windows
这儿有一堆花5 小时前
Windows 原生输入法强制添加小鹤双拼方案指南
windows
松莫莫6 小时前
Spring Boot 整合 MQTT 全流程详解(Windows 环境)—— 从 Mosquitto 安装到消息收发实战
windows·spring boot·后端·mqtt·学习
課代表6 小时前
bat 批处理文件中 PowerShell 命令换行问题
符号·参数·powershell·批处理·换行·续行符·管道符
jiayong236 小时前
Windows 磁盘清理完全指南
windows
a努力。6 小时前
网易Java面试被问:fail-safe和fail-fast
java·windows·后端·面试·架构
水木姚姚6 小时前
搭建 TensorFlow 在 VScode 下编程环境(Debian)
人工智能·windows·vscode·debian·tensorflow
〝七夜5697 小时前
什么是Stream流
windows