重命名文件夹中的多个文件,添加前缀(Windows)


80

我想批量重命名文件夹中的文件,并在新名称中添加文件夹名称的前缀。即C:\house chores\所有文件将被重命名house chores - $old_name

Answers:


141

选项1:使用Windows PowerShell

打开Windows菜单。键入:“ PowerShell”并打开“ Windows PowerShell”命令窗口。

转到包含所需文件的文件夹:例如cd“ C:\ house chores”注意:如果涉及空格,地址必须包含引号“”。

您可以使用“ dir”查看文件夹中的所有文件。使用“ |” 将通过管道传递“ dir”的输出给随后的命令。

注意:“ dir”是“ Get-ChildItem”的别名。请参阅:wiki:cmdlet。一个可以提供进一步的功能。例如'dir -recurse'输出所有文件,文件夹和子文件夹。

如果我只想要一系列文件怎么办?

代替“ dir |” 我可以用:

dir | where-object -filterscript {($_.Name -ge 'DSC_20') -and ($_.Name -le 'DSC_31')} |

对于以目录名作为前缀的批量重新命名:

dir | Rename-Item -NewName {$_.Directory.Name + " - " + $_.Name}

选项2:使用命令提示符

在文件夹中,按shift +右键单击:选择“在此处打开命令窗口”

for %a in (*.*) do ren "%a" "prefix - %a"

如果文件很多,最好在此之前添加“ @echo off”命令,并在末尾添加“ echo on”命令。


1
未成年人挑剔:本@@echo on不是必需的。你刚转身@echo off
IInspectable 2014年

9
选项2(在添加了丢失的字符do之后)不起作用-重命名某些文件后,for以新名称找到它们,并一次又一次添加前缀,直到达到文件名长度限制。
谢尔盖·弗拉索夫

2
使用选项2时,我ren was unexpected at this time.知道为什么吗?
空指针

4
@billgatesdo他的答案中没有这个词。应该是for %a in (.) do ren "%a" "prefix - %a"
Christiaan Westerbeek 2014年

2
@SergeyVlasov这在两个选项中都会发生。避免这种情况的唯一方法是将重命名放置在原始名称的上方。或者在重命名后将其移动到其他文件夹。
大卫·斯塔基

40

这两个Powershell答案的问题在于,前缀可能最终会重复,因为脚本在重命名之前和之后都可能在文件上运行,具体取决于重命名过程运行时所使用的目录。要解决此问题,只需使用以下-Exclude选项:

Get-ChildItem -Exclude "house chores-*" | rename-item -NewName { "house chores-" + $_.Name }

这将防止该过程多次重命名任何一个文件。


1
请考虑在您的建议中添加一个不太具体的示例,其中包括$
_。Directory.Name

17

免费软件“批量重命名实用程序”也可以很好地工作(并且对于高级任务也很强大)。下载和安装需要一分钟。

在原始网站上查看屏幕截图教程

-

我无法提供分步屏幕截图,因为这些图像必须根据Creative Commons License发布,并且我不拥有该软件的屏幕截图。

免责声明:我没有以任何方式与所述软件/公司相关联。我喜欢自己完成任务的产品,它可以满足OP和类似要求,因此值得推荐。


我在某个时候开始使用它。+1用于向线程添加内容。
ofer.sheffer 2014年

@ ofer.sheffer谢谢。

这个答案是题外话!-1
Marco Demaio 2015年

1
@MarcoDemaio感谢您的反馈。OP希望完成一项任务,而链接的软件使其易于完成。我相信,解决方案的复杂性并不能使其更具针对性。

@GopalAggarwal:对不起,您是对的,我读到他的问题“我想批量重命名文件夹中的文件”,我以为他正在寻找Windows批处理文件。我删除了-1。
Marco Demaio


6

我正在拔头发,因为对于某些项目,重命名的项目将再次重命名(重复,除非达到最大文件名长度)。对于Get-ChildItem和传递dir的输出都在发生这种情况。我猜是由于字母顺序的更改而导致重命名的文件被提取。我通过以下方式解决了这个问题:

Get-ChildItem -Path . -OutVariable dirs
foreach ($i in $dirs) { Rename-Item $i.name ("<MY_PREFIX>"+$i.name) }

这将“锁定” Get-ChildItem在变量$ dirs中返回的结果,您可以对其进行迭代,而不必担心顺序会更改或发生其他有趣的事情。

Dave.Gugg使用-Exclude的技巧也应解决此问题,但这是另一种方法。可能是如果要重命名的文件已经包含前缀中使用的模式。

(免责声明:我非常是PowerShell n00b。)


2

基于@ ofer.sheffer答案,此命令将批量重命名并将当前日期附加到文件名中。即对于当前文件夹中的所有文件,“ file.txt”变为“ 20180329-file.txt”

for %a in (*.*) do ren "%a" "%date:~-4,4%%date:~-7,2%%date:~-10,2% - %a"

2

基于@ ofer.sheffer答案,这是用于添加词缀的CMD变体(这不是问题,但是如果您搜索词缀,则此页面仍是Google搜索结果的第一名)。由于扩展,它有所不同。

for %a in (*.*) do ren "%~a" "%~na-affix%~xa"

您可以更改“-缀”部分。


0

我知道这是一个古老的问题,但是我从各种答案中学到了很多,但是提出了自己的解决方案。这应该动态地将父文件夹作为前缀添加到与特定模式匹配的所有文件中,但前提是该父文件夹尚未具有该前缀。

function Add-DirectoryPrefix($pattern) {
    # To debug, replace the Rename-Item with Select-Object
    Get-ChildItem -Path .\* -Filter $pattern -Recurse | 
        Where-Object {$_.Name -notlike ($_.Directory.Name + '*')} | 
        Rename-Item -NewName {$_.Directory.Name + '-' + $_.Name}
        # Select-Object -Property Directory,Name,@{Name = 'NewName'; Expression= {$_.Directory.Name + '-' + $_.Name}}
}

https://gist.github.com/kmpm/4f94e46e569ae0a4e688581231fa9e00

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.