我有一堆以数字开头的文件名,可能包含一个或两个数字后跟空格和破折号,然后有时(有时不是)在我想要保留的名称的第一个字母字符之前有一个空格,例如:
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)
我有一堆以数字开头的文件名,可能包含一个或两个数字后跟空格和破折号,然后有时(有时不是)在我想要保留的名称的第一个字母字符之前有一个空格,例如:
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)
Move-Item
和 Rename-Item
cmdlet 可以从管道中直接接收源并使用脚本块提供新名称:
dir | Move-Item -Destination { $_.Name -replace '^([0-9\-\s]*)' }
或者
dir | Rename-Item -NewName { $_.Name -replace '^([0-9\-\s]*)' }
dir c:\tmp | % {
mv $_.FullName $(Join-Path $_.Directory ($_.Name -replace "^([0-9\-\s]*)",'').Trim());
}
dir
后面加上-recurse
。^([0-9\-\s]*)
。 - Frode F.Move-Item
和 Rename-Item
命令可以直接从管道中接受源并使用脚本块提供新名称:dir | move-item -destination { $_.Name -replace '^([0-9\-\s]*)' }
或 dir | rename-item -newname { $_.Name -replace '^([0-9\-\s]*)' }
。 - Emperor XLII
$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
。