[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] [已解决]批处理如何批量删除所有文件名中的特殊字符?

如何批量删除当前目录下的所有文件包含子目录中的文件的文件名中的特殊符号。
就是除了a-z A-Z 0-9 中文字 - .  以外的符号,全部删除掉。符号,只保留两个半角符号 - .  
其它的都不要,尤其的感叹号 !有的文件名中还有多个感叹号。
还有些是外国文字,心型,全角/半角中括号 、全角/半角小括号、各种标点符号等等。要求全部删除掉,如果删除不了,也可以替换成A或者什么的。

我来帮你总结下重点:
保留:a-z A-Z 0-9  - .
其它的全部删除,顺便我也学习下
毕竟没有老师教,自学很痛苦的

TOP

本帖最后由 idwma 于 2022-9-24 19:32 编辑
  1. powershell "dir -rec|foreach{ren $_.fullname $($_.name -replace '[^0-9a-z\u4e00-\u9fff\-\.]')}"
复制代码
3

评分人数

TOP

本帖最后由 thp2008 于 2022-9-25 00:16 编辑

我直接运行了,数千文件,一下就解决了。牛,满足要求。


大神,能不能帮我改下,把空格保留下来,可以吗?谢谢!

TOP

我也在关注这个帖子,大神的代码太牛逼了,我昨天想把-换成_,一直不成功,今天看到你问,我百度了一下正则表达式,就发现了这个了,\s就代表空白字符,添加进去就行,你试一下看看。
  1. powershell "dir -rec|foreach{ren $_.fullname $($_.name -replace '[^0-9a-z\u4e00-\u9fff\s\-\.]')}"
复制代码
回复 4# thp2008

TOP

我又发现了,\w就代表字母数字及下划线,添加进去,就保留下划线“_”了。

TOP

感谢!看来大家都有这种需求,弄一个,以后就方便了。一条命令全搞定了,不要为那些特殊字符的事,烦了。

TOP

我试了下,运行,会报以下错误,但是好像不影响改名。规则是对的。包括子目录都一次性改好了。
  1. powershell "dir -rec|foreach{ren $_.fullname $($_.name -replace '[^0-9a-z\u4e00-\u9fff\-\.\s\w]')}"
复制代码
ren : 源路径和目标路径必须不同。
所在位置 行:1 字符: 18
+ ... rec|foreach{ren $_.fullname $($_.name -replace '[^0-9a-z\u4e00-\u9fff ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : WriteError: (H:\Sex2\Temp:String) [Rename-Item], IOException
    + FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand

TOP

回复 9# xczxczxcz


    大神,你的代码没对文件夹名做删除操作

TOP

回复 10# 77七


    一楼 内容只处理文件名,不处理文件夹名,所以脚本不处理文件夹名。
QQ: 己阵亡
脚本优先 [PowerShell win10]

TOP

再求助一下,
  1. powershell "dir -rec|foreach{ren $_.fullname $($_.name -replace '[^0-9a-z\u4e00-\u9fff\s\w\-\.]')}"
复制代码
1、我在使用时,发现一个问题,就是文件名中不能有半角的 “ [ ” 或“ ] ”不然会报错。

2、请帮忙把这句改一下,如果我想对文件夹名改名,删除所有特殊字符呢。

TOP

回复 11# thp2008
  1. @echo off
  2. set "reg=[^a-z\d\u4e00-\u9fff.-]"
  3. REM 改文件名
  4. PowerShell "dir -Literal '%~dp0' -Recurse | ?{$_ -is [IO.FileInfo] -and $_.Name -match '%reg%'} | forEach{ $newName = $_.Name -replace '%reg%'; mv -Literal $_.FullName -Dest ($_.PSParentPath + '\' + $newName) -Force }"
  5. REM 改文件夹名
  6. PowerShell "dir -Literal '%~dp0' -Recurse | ?{$_ -is [IO.DirectoryInfo] -and $_.Name -match '%reg%'} | sort FullName -Desc | forEach{ $newName = $_.Name -replace '%reg%'; mv -Literal $_.FullName -Dest ($_.PSParentPath + '\' + $newName) -Force }"
  7. pause
复制代码
2

评分人数

TOP

回复 12# WHY


    出差了几天,不方便上网,现在才来回复。非常感谢,测试通过,这次的比上次的好,完全没有报错了。好用!

TOP

返回列表