批处理文件遍历所有子目录批量移除文件名和目录名中特殊字符

从网上下载到的某些资源(感谢那些无私奉献学习资源的人),文件名或目录名有一些特殊字符,如何批量移除呢?
本文介绍利用批处理脚本,遍历指定目录以及指定目录下的所有子目录批量移除文件名和目录名中特殊字符的方法。方便快捷绿色省心~~

遍历当前目录以及所有子目录批量处理

批处理脚本内容

创建一个后缀为 .bat.cmd 的批处理文件,内容如下:

@echo off
setlocal enabledelayedexpansion
chcp 65001

:: 如果要指定绝对路径,用以下两行,注释 set path=. 所在行。也就是用以下两行代替 set path=. 这一行。
:: set path="C:\temp\test"
:: cd "/d %path%"

set path=.
:: echo.&set /p path=please input path:

:: 删除特殊字符,记得替换成你自己需要删除的
set adv=【我是特殊字符】
:: echo.&set /p adv=please input to be delete characters:

call:renameFiles

for /f "delims=" %%i in ('dir /ad/b/s "%path%"') do (
    cd %%i
    call:renameFiles
)

echo.
echo 处理完毕
echo.

pause

:: 子过程一般放在最后,主程序最后要加上exit或跳转语句,避免错误的进入子过程。
:: 如果没有 exit,子程序还会被执行(而不是调用)一次,这样在执行 echo %1 时,因为没有参数,会提示:ECHO is off.
exit

:renameFiles
echo 正在处理的目录:【%cd%】 ...

:: 先删除空格
for /f "delims=" %%i in ('dir /b *.*') do (
    set "foo=%%~nxi"
    set foo=!foo: =!
    ren "%%~fi" "!foo!"
)

for /f "delims=" %%i in ('dir /b *%adv%*') do (
    :: echo %%i
    set var=%%i
    set var=!var:%adv%=!
    echo rename "%%i" to "!var!"
    ren "%%i" "!var!"
)

echo.
goto:eof

批处理脚本说明

  • 该批处理脚本会把脚本中变量 path 定义的路径下,以及该路径下的所有子目录(含子目录下的子目录)下的文件名和目录名中的 adv 定义的字符删除,还一个干净的文件名和目录名。
  • 如果子目录下的子目录名也包含特殊字符,第一次处理时会提示:The system cannot find the path specified.,这是因为目录名被改了,之前读入内存的目录名不存在了,这没有关系,重复执行该脚本,直到不再出现这个提示为止即表示所有目录名和文件名都已经改完了。
  • path=. 表示当前目录,需要把此批处理文件复制到需要处理的顶层文件夹下再双击执行。
  • 如果设置 path 为绝对路径,则脚本文件放哪个位置都行。
  • 也可以每次输入需要处理的绝对路径和需要移除的特殊字符,见下面 path 和 adv 变量的下一行注释代码。

仅处理当前目录下的文件名和目录名

创建一个后缀为 .bat.cmd 的批处理文件,内容如下:

@echo off
:: 仅处理当前目录下的所有文件,所以,需要把该文件 copy 至需要改名的文件夹下,双击执行
setlocal enabledelayedexpansion
chcp 65001

:: 先删除空格
for /f "delims=" %%i in ('dir /b *.*') do (
    set "foo=%%~nxi"
    set foo=!foo: =!
    ren "%%~fi" "!foo!"
)

:: 删除特殊字符,记得替换成你自己需要删除的
set adv=【我是特殊字符】

for /f "delims=" %%i in ('dir /b *%adv%*') do (
    ::echo %%i
    set var=%%i
    set var=!var:%adv%=!
    echo rename "%%i" to "!var!"
    ren "%%i" "!var!"
)

pause

处理过程,以下介绍均为只处理当前目录

特殊字符不带空格

如:test【我是特殊字符】.txt
这类文件用以下脚本即可正常处理,批处理脚本如下:

@echo off
setlocal enabledelayedexpansion
chcp 65001
set adv=【我是特殊字符】

for /f "delims=" %%i in ('dir /b *%adv%*') do (
    ::echo %%i
    set var=%%i
    set var=!var:%adv%=!
    echo rename "%%i" to "!var!"
    ren "%%i" "!var!"
)

pause

特殊字符包含空格

但是,如果需要删除的特殊字符部分有空格,如:1. test - [加微信 xxxx 有妹子].txt,下面的批处理脚本不能达到去除特殊字符的目的。

@echo off
setlocal enabledelayedexpansion
chcp 65001
set adv="- [加微信 xxxx 有妹子]"

for /f "delims=" %%i in ('dir /b *%adv%*') do (
    ::echo %%i
    set var=%%i
    set var=!var:%adv%=!
    echo rename "%%i" to "!var!"
    ren "%%i" "!var!"
)

pause

执行的时候会提示:

rename "1. test - [加微信 xxxx 有妹子].txt" to "1. test - [加微信 xxxx 有妹子].txt"
Press any key to continue . . .

解决

在删除特殊字符前,先将空格删除,然后,处理方式就与删除不带空格的特殊字符相同了。

@echo off
chcp 65001
setlocal enabledelayedexpansion

:: 先删除空格
for /f "delims=" %%i in ('dir /b *.*') do (
    set "foo=%%~nxi"
    set foo=!foo: =!
    ren "%%~fi" "!foo!"
)

:: 删除特殊字符,记得替换成你自己需要删除的
set adv=-[加微信xxxx有妹子]

for /f "delims=" %%i in ('dir /b *%adv%*') do (
    ::echo %%i
    set var=%%i
    set var=!var:%adv%=!
    echo rename "%%i" to "!var!"
    ren "%%i" "!var!"
)

pause

执行结果:

rename "1.test-[加微信xxxx有妹子].txt" to "1.test.txt"
Press any key to continue . . .

批量删除文件名中的空格

  • 会处理当前目录以及所有子目录和子目录下的所有文件,如子目录也带空格,则需要多执行几次,因为子目录会先被修改。
  • 正确的姿势是,在循环里判断是否为文件夹,如果是,则先处理文件夹下的文件,最后处理文件夹名,这一点请读者自行研究。
@echo off&setlocal enabledelayedexpansion

for /f "delims=" %%i in ('dir /s/b *.*') do (
    set "foo=%%~nxi"
    set foo=!foo: =!
    ren "%%~fi" "!foo!"
)

pause

百度 PC 端下载文件完成后,文件名后缀没有被及时修改(其实是下载完成了的),用秕处理脚本删除这些后缀

但并不总是这样,后来的版本没有这个问题,估计官方修复这个 bug 了。批量修改脚本如下:

@ECHO OFF
FOR /F "delims=" %%I IN ('DIR /A-D /B *.baiduyun.p.downloading.*') DO REN "%%~I" "%%~nI"
FOR /F "delims=" %%I IN ('DIR /A-D /B *.baiduyun.p') DO REN "%%~I" "%%~nI"
FOR /F "delims=" %%I IN ('DIR /A-D /B *.baiduyun') DO REN "%%~I" "%%~nI"

bat批处理的注释语句

  1. :: 注释内容(第一个冒号后也可以跟任何一个非字母数字的字符)
  2. rem 注释内容(不能出现重定向符号和管道符号)
  3. echo 注释内容(不能出现重定向符号和管道符号)
  4. if not exist nul 注释内容(不能出现重定向符号和管道符号)
  5. :注释内容(注释文本不能与已有标签重名)
  6. %注释内容%(可以用作行间注释,不能出现重定向符号和管道符号)
  7. goto 标签 注释内容(可以用作说明goto的条件和执行内容)
  8. :标签 注释内容(可以用作标签下方段的执行内容)

后记,对变量赋值含中文时找不到文件

现象

批处理文件变量赋值语句set adv=【我是特殊字符】,给变量赋值含有中文时,如果 cmd/PowerShell 的编码为非 UTF-8,则不会正常执行。

解决方法一

通过动态赋值的方式,可以正常执行,具体代码如下:

echo.&set /p adv=please input to be delete characters:

解决办法二

修改 cmd/PowerShell 的默认编码为 UTF-8。

直接修改注册码

一劳永逸,具体可参考:windows 控制台 cmd/PowerShell 中文显示乱码,解决方法

在脚本最前面指定,更具通用性,本文介绍的脚本已经添加

另一种方式,简单粗暴但是非常实用,就是在脚本前面添加 chcp 65001,每次执行批量删除文件名中的特殊字符之前,先设置编码格式。

关于作者

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,264评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,549评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,389评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,616评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,461评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,351评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,776评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,414评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,722评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,760评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,537评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,381评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,787评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,030评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,304评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,734评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,943评论 2 336

推荐阅读更多精彩内容

  • 个人学习批处理的初衷来源于实际工作;在某个迭代版本有个BS(安卓手游模拟器)大需求,从而在测试过程中就重复涉及到...
    Luckykailiu阅读 4,668评论 0 11
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,689评论 0 10
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,345评论 0 5
  • [TOC] ##Assoc 显示或修改文件扩展名关联 Assoc [.Ext[=[Filetype]]] .Ex...
    btijjj阅读 326评论 0 1
  • dos 批处理 一:windows的命令行模式(win+R)在里面写CMD就可以进入windows的命令行模式了二...
    chenchao981阅读 726评论 0 6