我想批量重命名文件夹中的文件,并在新名称中添加文件夹名称的前缀。即C:\house chores\
所有文件将被重命名house chores - $old_name
。
Answers:
选项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”命令。
do
之后)不起作用-重命名某些文件后,for
以新名称找到它们,并一次又一次添加前缀,直到达到文件名长度限制。
ren was unexpected at this time.
知道为什么吗?
do
他的答案中没有这个词。应该是for %a in (.) do ren "%a" "prefix - %a"
这两个Powershell答案的问题在于,前缀可能最终会重复,因为脚本在重命名之前和之后都可能在文件上运行,具体取决于重命名过程运行时所使用的目录。要解决此问题,只需使用以下-Exclude
选项:
Get-ChildItem -Exclude "house chores-*" | rename-item -NewName { "house chores-" + $_.Name }
这将防止该过程多次重命名任何一个文件。
免费软件“批量重命名实用程序”也可以很好地工作(并且对于高级任务也很强大)。下载和安装需要一分钟。
-
我无法提供分步屏幕截图,因为这些图像必须根据Creative Commons License发布,并且我不拥有该软件的屏幕截图。
免责声明:我没有以任何方式与所述软件/公司相关联。我喜欢自己完成任务的产品,它可以满足OP和类似要求,因此值得推荐。
这对我有用,首先在您要将文件名更改为目录的cd中,然后运行以下命令:
Get-ChildItem | rename-item -NewName { "house chores-" + $_.Name }
我正在拔头发,因为对于某些项目,重命名的项目将再次重命名(重复,除非达到最大文件名长度)。对于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。)
我知道这是一个古老的问题,但是我从各种答案中学到了很多,但是提出了自己的解决方案。这应该动态地将父文件夹作为前缀添加到与特定模式匹配的所有文件中,但前提是该父文件夹尚未具有该前缀。
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
@
中@echo on
不是必需的。你刚转身@echo off
。