《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替换为空的话,就会把2030之类的0替换掉,结果显然就错了。

另:909bat中比较并不相等(equ),所有不能用equneq通过来比较它们,但是能够用lssgtr比较大小,比如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、battif文件重命名为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'中单引号的作用:

1for /f %%iin (文件名) do (……)

2for /f %%iin ('命令语句') do (……)

3for /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
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^<^ nul
:chenfa
if %2 gtr %1 (goto :eof)
set /a num=%2*%1
set /p var=%2*%1=%num%      nul
33、模拟进度条
@echo off
set /p str=■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&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
       )
       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的意思)。
​

posted @ 2026-01-10 18:07  clnchanpin  阅读(283)  评论(0)    收藏  举报