替换或删除文件夹中所有文件的文件名中的特定字符

72

我该如何通过批处理执行来删除某些字符或将某些字符替换为其他字符,以一次性更改 Windows 文件夹中所有文件的文件名?有DOS命令可以完成这个任务吗?

5个回答

120
使用PowerShell更智能地处理DOS提示符下的任何事情。 在这里,我展示了如何批量重命名当前目录中包含空格的所有文件和目录,并将它们替换为_下划线。
Dir |
Rename-Item -NewName { $_.Name -replace " ","_" }

编辑:
可选地,Where-Object命令可以用于筛选掉不符合后续cmdlet(命令)的对象。以下是一些示例,以说明它可以为您提供的灵活性:

  • To skip any document files

    Dir |
    Where-Object { $_.Name -notmatch "\.(doc|xls|ppt)x?$" } |
    Rename-Item -NewName { $_.Name -replace " ","_" }
    
  • To process only directories (pre-3.0 version)

    Dir |
    Where-Object { $_.Mode -match "^d" } |
    Rename-Item -NewName { $_.Name -replace " ","_" }
    

    PowerShell v3.0 introduced new Dir flags. You can also use Dir -Directory there.

  • To skip any files already containing an underscore (or some other character)

    Dir |
    Where-Object { -not $_.Name.Contains("_") } |
    Rename-Item -NewName { $_.Name -replace " ","_" }
    

1
@JesonPark 感谢您指出这一点。我已经添加了一些更好的关于Where-Object用法的示例。 - Ravi K Thapliyal
3
重命名项目:源路径和目标路径必须不同。错误:/ - MERT DOĞAN
对我没用。我认为是因为我想要替换点。在这种情况下,这个答案帮了我。 - Sip
@AminM Where-Object 用于根据某些条件过滤 dir 的内容。 - Tropilio
如何替换文件名中的第一个 _ 符号? - Bataklik
显示剩余3条评论

36
在Windows PowerShell中,删除或重命名特定字符的一行命令如下所示。(这里将空格替换为下划线)
Dir | Rename-Item –NewName { $_.name –replace " ","_" }

3
Rename-Item:源路径和目标路径必须不同。错误:/ - MERT DOĞAN
嘿,我不太明白我应该在哪里输入这个命令以及如何定位我需要的目录。 - John Smith
仅适用于Windows操作系统。运行Windows PowerShell。进入文件夹并按照上述命令运行(记得更改搜索参数)。 - aphoe
2
使用-creplace进行大小写敏感的搜索。 - LosManos
PowerShell Core也支持许多其他操作系统。 - Ivo Merchiers
简单而高效! - Joginder Tanikella

23

PowerShell的答案很好,但是Rename-Item命令在相同目标目录中不起作用,除非您所有文件中都有不想要的字符(如果找到重复项则失败)。

如果您像我一样有好的和坏的文件名混在一起,请尝试使用此脚本代替(将空格替换为下划线):

Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace(" ", "_") }

1
这个解决方案对我很有效(因为接受的答案会抛出错误,我猜测是由于一些文件不包含要替换的字符,正如你所提到的)。+1,如果能在这种情况下更详细地解释“-Recurse”标志和“Move-Item”命令,那就太好了。 - j4v1
1
也是对我最好的解决方案。很容易会抛出“正在被另一个进程使用”的错误。关闭所有其他窗口可以解决这个问题。谢谢Dustin :) - MartinJH

9
这个批处理文件可以帮助您,但它有一些限制。文件名中的字符 = 和 % 不能被替换(我记得是这样),文件名中的 ^ 也可能会有问题。
在下面的每一行 %newname: =_% 的部分中,它会将冒号后面的字符用等号后面的字符替换,因此当前一堆字符将被替换为下划线。
去掉 echo 以激活 ren 命令,否则它只会将命令打印到控制台窗口,直到您执行该操作为止。
它将仅处理当前文件夹,除非您在 DIR 命令部分添加 /s,然后它将处理当前文件夹下的所有文件夹。
要删除特定字符,请从等号后面删除字符。在 %newname:z=% 中,这样的条目将删除所有 z 字符(不区分大小写)。
@echo off
for /f "delims=" %%a in ('dir /a:-d /o:n /b') do call :next "%%a"
pause
GOTO:EOF
:next
set "newname=%~nx1"

set "newname=%newname: =_%"
set "newname=%newname:)=_%"
set "newname=%newname:(=_%"
set "newname=%newname:&=_%"
set "newname=%newname:^=_%"
set "newname=%newname:$=_%"
set "newname=%newname:#=_%"
set "newname=%newname:@=_%"
set "newname=%newname:!=_%"
set "newname=%newname:-=_%"
set "newname=%newname:+=_%"
set "newname=%newname:}=_%"
set "newname=%newname:{=_%"
set "newname=%newname:]=_%"
set "newname=%newname:[=_%"
set "newname=%newname:;=_%"
set "newname=%newname:'=_%"
set "newname=%newname:`=_%"
set "newname=%newname:,=_%"

echo ren %1 "%newname%

编辑队列已满,因此我在这里放置了注释: 请注意,dir /a:-d 仅列出文件,如果要处理所有文件和目录,则应为 dir /a,如果要仅处理目录,则为 dir /a:d同时缺少结尾的引号,这不会影响代码,但会影响我的目录。例如,如果您想删除目录名称中的点,则应为: set "newname=%newname:.=%" - DefToneR

-3
我建议使用rename命令来完成此操作。在命令行中键入ren /?以获取更多帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接