我有混合音乐项目,软件会生成每个项目中歌曲的 txt 文件列表。问题是生成的列表仅包含每首歌曲名称的前 36 个字符。
我需要更正 txt 文件中的名称,以便它们与原始文件的名称相同,并且我的脚本可以使用列表复制文件。
我在两个块中创建了一个脚本,在第一个块中,我读取了原始文件并生成了一个与 txt 文件中的名称同名的变量。
First block (what I managed to do):
读取原始音乐文件夹中的原始文件,并创建与 List.txt 文件中的变量同名的变量。
Goal of the first block (what I couldn't do):
当此块中变量的名称与 List.txt 中的名称相同时,脚本会将 List.txt 中的名称更改为与该变量相关的原始文件的全名。因此,可以在第二个块中读取 List.txt 文件,其中包含正确的名称。
注意:
可能会出现Original Musics文件夹中有两个同名文件,但版本不同,这种情况下,这两个文件的两个全名必须在List.txt文件中才能复制到目的地文件夹。例如。
List.txt 文件中的名称:
Got To Be Real (CM_Gex Bootleg Exten
原始名称(原始音乐文件夹中的全名):
Cheryl Lynn - Got To Be Real (CM_Gex Bootleg Extended SHORT Re Mix).mp3
Cheryl Lynn - Got To Be Real (CM_Gex Bootleg Extended LONG Re Mix).mp3
变量 $ShortOriginalSongName:
Got To Be Real (CM_Gex Bootleg Exten
Got To Be Real (CM_Gex Bootleg Exten
由于是同一个文件,区别在于一个是长版,一个是短版,两个全名都必须在List.txt文件中,即除了在list.txt中改名字,当文件相同时,脚本必须在 List.txt 中包含原始全名
脚本:
$files = "C:\Users\$env:username\Desktop\List.txt"
$location = "G:\Original Musics\"
$destination = "C:\Users\$env:username\Desktop\Copy Selected Musics\"
# First block:
Get-ChildItem -Recurse $location* -Include *.mp3 | % {
$ShortOriginalSongName = $_.Basename.Split("-")[1].Trim();
If ($ShortOriginalSongName.Length -gt 36) {$ShortOriginalSongName = $ShortOriginalSongName.Substring(0, 36)};
};
# Second Block:
Get-Content $files | % {
$result = gci -recurse "$location*$_" -Include *.mp3
If($result) {
Add-Content $destination"AddList.txt" -Value $result.Fullname
$musicName = $result.Name
$tot+=1
Write-Host -ForegroundColor Green "$musicName found on $location!"
Write-Host "$musicName copied to $destination..."
Copy-Item $result.FullName -Destination $destination\$($_.Name)
}
}
Second Block:
读取使用第一个块中歌曲的正确名称生成的 List.txt 文件,并将原始文件复制到 Copy Selected Musics 文件夹。
您的代码有很多对
Get-ChildItem
for的重复调用$Location
,因此我建议创建一个将短名称与其关联文件相关联的哈希表。你想要:
整理你的文件:
创建一个由计算的短名称和源 FileInfo 对象组成的自定义对象:
按短名称对它们进行分组(因为多个文件可以产生相同的短名称)。
所以我们从这个开始:
然后将该对象转换为哈希表:
然后核心处理使用每个条目
$files
作为哈希键:未经测试,但很确定逻辑是合理的。想要获取代码 - 将在今晚晚些时候添加注释。