Powershell脚本重命名文件

4

我有一堆以数字开头的文件名,可能包含一个或两个数字后跟空格和破折号,然后有时(有时不是)在我想要保留的名称的第一个字母字符之前有一个空格,例如:

2-01 Dazed And Confused.txt(我想将其重命名为Dazed And Confused.txt)

或者

02 - Uncle Salty.txt(我想将其重命名为Uncle Salty.txt)

或者

02-The Night Before.txt(我想将其重命名为The Night Before.txt)


列表脚本将从目录中获取文件列表并对它们进行重命名。 - user577651
3个回答

6

Move-ItemRename-Item cmdlet 可以从管道中直接接收源并使用脚本块提供新名称:

dir | Move-Item -Destination { $_.Name -replace '^([0-9\-\s]*)' }

或者

dir | Rename-Item -NewName { $_.Name -replace '^([0-9\-\s]*)' }

4
dir c:\tmp | % {
     mv $_.FullName $(Join-Path $_.Directory ($_.Name -replace "^([0-9\-\s]*)",'').Trim());
}

如果您需要递归处理YourDirectory,请在dir后面加上-recurse

这个在第二个例子上不起作用。请尝试使用^([0-9\-\s]*) - Frode F.
这个脚本对我需要重命名的600多个文件中的大约95%都有效。第一次在我想要重命名的文件子集上运行时,它确实会抛出一个关于将文件移动到同一文件夹的错误,但它确实重命名了文件。第二次我在整个文件集上运行脚本时,它没有给我任何错误。谢谢,这是一个很棒的脚本。 - user577651
1
Move-ItemRename-Item 命令可以直接从管道中接受源并使用脚本块提供新名称:dir | move-item -destination { $_.Name -replace '^([0-9\-\s]*)' }dir | rename-item -newname { $_.Name -replace '^([0-9\-\s]*)' } - Emperor XLII
1
@EmperorXLII 你应该将这个作为一个独立的答案发布,因为我认为它在易懂性和简洁性方面优于现有的任何答案。 - Ian Newson

0
尝试像这样做:

$re = '^\d+\s*-\d*\s*(.*)$'
$recurse = $false

Get-ChildItem "C:\some\folder" -Recurse:$recurse | ? {
  -not $_.PSIsContainer -and $_.Name -match $re
} | % {
  Move-Item $_.FullName (Join-Path $_.Directory $matches[1])
}

如果您希望连字符是可选的,请将正则表达式更改为'^\d+\s*-?\d*\s*(.*)$'

如果您想要递归到子文件夹中,请将$recurse更改为$true


这个改变了大部分的文件,但大约有15%的文件没有重命名。 - user577651
@user577651 这15%的文件名是什么样子的? - Ansgar Wiechers

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