我使用 Windows 7 64 位,我有一个文件列表,文件名称由以下部分组成
作者 - 专辑名称 - 歌曲名称
我需要所有文件的名称成为
作者 - 歌曲名称 - 专辑名称
文件扩展名(.mp3、.mp4、.mpeg)不应更改,应保留原始扩展名
My old file name:
author - album name - name of the song
Céline Dion - Loved Me Back to Life - Save Your Soul
Céline Dion - Loved Me Back to Life - Unfinished Songs
Michael Jackson - Bad - Dirty Diana
Michael Jackson - Thriller - Baby Be Mine
My new file name
author - name of the song - album name
Céline Dion - Save Your Soul - Loved Me Back to Life
Céline Dion - Unfinished Songs - Loved Me Back to Life
Michael Jackson - Dirty Diana - Bad
Michael Jackson - Baby Be Mine - Thriller
答案1
PowerShell 是替代批处理文件的绝佳选择。我不保证此脚本的效果——请务必备份您的文件夹,因为名称将自动重新排列。此外,它不会进行任何错误处理——如果文件命名错误或不遵循您描述的命名约定,它将不完美。
Set-Location C:\pathHere\
Get-ChildItem | ForEach-Object {
$artist,$album,$song = $_.BaseName.Split(" - ")
Rename-Item $_ -NewName ($artist + " - " + $song + " - " + $album + $_.Extension)
}
答案2
如果需要批量处理,但批处理文件不是绝对必要的,则可以想到两个 GUI 驱动的实用程序:
媒体猴可以安装或以便携模式运行,无需安装。它旨在对媒体库进行持久管理,还将设置 ID3 标签,但只能使用一次。
- 如果文件已经标记,MediaMonkey 将自动推断艺术家、专辑和曲目
- 如果文件没有标记,则从文件名自动标记(Alt+Q),使用以下格式:
<Artist> - <Album> - <Title>
- 如果文件没有标记,则从文件名自动标记(Alt+Q),使用以下格式:
- 使用移动和重命名选项,根据以下格式从标签(Ctrl+R)重命名文件:
<Artist> - <Title> - <Album>
- 如果文件已经标记,MediaMonkey 将自动推断艺术家、专辑和曲目
变形记2必须安装,但可以使用一些正则表达式和交换重命名器进行所需的更改。
- 将此与以下文本进行交换:
[^\W\d]-[^\W\d]+-
以及以下文字:-[^\W\d]
- 在这段文字中间:
[^\W\d]-
以及以下文字:-[^\W\d]
- 确保两者都已勾选“作为正则表达式进行评估”。
- 将此与以下文本进行交换:
任何一个应用程序都可以在应用更改之前预览更改。
答案3
也许可以尝试这个 PowerShell 脚本,最好使用 PowerShell 7 运行它,你可以在 GitHub 上下载它。(否则它可能无法正常工作。)
$path=$args[0]
$extension=$args[1]
Get-ChildItem -Path $path -Force -Recurse -Include $extension -File | Foreach-Object {
$name=$_.BaseName.Split(" - ")
if ($name.Count -eq 3) {
Rename-Item -Path $_.FullName -NewName $($name[0]+" - "+$name[2]+" - "+$name[1]+$_.Extension)
}
}
将其保存为 rensong.ps1,然后先通过 cd 到其位置运行它,然后像这样运行它:
.\rensong.ps1 "C:\Path\to\Folder" "*.ext1,*.ext2,*.ext3"
例如:
.\rensong.ps1 "C:\Users\Estranger\Music" "*.mp3,*.mp4,*.mpeg"
您可以使用三个以上的扩展,只需遵循格式即可。
答案4
在尝试了更多不起作用的 Powershell 脚本后,我找到了一个使用简单批处理文件的解决方案
Powershell 代码似乎不起作用。
@Echo Off&SetLocal EnableExtensions DisableDelayedExpansion
For %%G In ("* - * - *.*")Do (Set "BaseNameBefore=%%~nG"
SetLocal EnableDelayedExpansion&For /F "Tokens=1-4 Delims=?" %%I In (
"!BaseNameBefore: - =?!")Do EndLocal&If "%%L" == "" If Not %%K == "" (
Ren "%%G" "%%I - %%K - %%J%%~xG"))