我正在寻找一种在 PowerShell 脚本中编辑 mp3 文件信息(如艺术家、专辑等)的方法。
我找到了一种方法来获取 .mp3 文件所需的信息,但不知道如何修改它们。
$songs = Get-ChildItem $dir -Filter *.mp3;
$shell = new-object -com shell.application;
Foreach ($song in $songs) {
$shellfolder = $shell.namespace($dir);
$shellfile = $shellfolder.parsename($song);
$title = $shell.namespace($dir).getdetailsof($shellfile,21);
}
Run Code Online (Sandbox Code Playgroud)
使用 getDetailsOf (带有 21),我可以获取歌曲标题,但不存在 setDetailsOf ,所以我不知道如何修改另一首歌曲的标题。
如果您像我一样并且不喜欢使用库,那么我编写的一个非常简单的 ID3v1 函数可能会满足您的需求:
#Set the specified ID3v1 properties of a file by writing the last 128 bytes
Function Set-ID3v1( #All parameters except path are optional, they will not change if not specified.
[string]$path, #Full path to the file to be updated - wildcards not supported because [] are so stinky and it's only supposed to work on one file at a time.
[string]$Title = "`0", #a string containing only 0 indicates a parameter not specified.
[string]$Artist = "`0",
[string]$Album = "`0",
[string]$Year = "`0",
[string]$Comment = "`0",
[int]$Track = -1,
[int]$Genre = -1,
[bool]$BackDate=$true){#Preserve modification date, but add a minute to indicate it's newer than duplicates
$CurrentModified = (Get-ChildItem -LiteralPath $path).LastWriteTime #use literalpath here to get only one file, even if it has []
Try{
$enc = [System.Text.Encoding]::ASCII #Probably wrong, but works occasionally. See /sf/ask/690040921/
$currentID3Bytes = New-Object byte[] (128)
$strm = New-Object System.IO.FileStream ($path,[System.IO.FileMode]::Open,[System.IO.FileAccess]::ReadWrite,[System.IO.FileShare]::None)
$strm.Seek(-128,'End') | Out-Null #Basic ID3v1 info is 128 bytes from EOF
$strm.Read($currentID3Bytes,0,$currentID3Bytes.Length) | Out-Null
Write-Host "$path `nCurrentID3: $($enc.GetString($currentID3Bytes))"
$strm.Seek(-128,'End') | Out-Null #Basic ID3v1 info is 128 bytes from EOF
If($enc.GetString($currentID3Bytes[0..2]) -ne 'TAG'){
Write-Warning "No existing ID3v1 found - adding to end of file"
$strm.Seek(0,'End')
$currentID3Bytes = $enc.GetBytes(('TAG' + (' ' * (30 + 30 + 30 + 4 + 30)))) #Add a blank tag to the end of the file
$currentID3Bytes += 255 #empty Genre
$strm.Write($currentID3Bytes,0,$currentID3Bytes.length)
$strm.Flush()
$Strm.Close()
$strm = New-Object System.IO.FileStream ($path,[System.IO.FileMode]::Open,[System.IO.FileAccess]::Write,[System.IO.FileShare]::None)
$strm.Seek(-128,'End')
}
$strm.Seek(3,'Current') | Out-Null #skip over 'TAG' to get to the good stuff
If($Title -eq "`0"){ $strm.Seek(30,'Current') | Out-Null} #Skip over
Else{ $strm.Write($enc.GetBytes($Title.PadRight(30,' ').Substring(0,30)),0,30) } #if specified, write 30 space-padded bytes to the stream
If($Artist -eq "`0"){ $strm.Seek(30,'Current') | Out-Null}
Else {$strm.Write($enc.GetBytes($Artist.PadRight(30,' ').Substring(0,30)),0,30) }
If($Album -eq "`0"){ $strm.Seek(30,'Current') | Out-Null}
Else{$strm.Write($enc.GetBytes($Album.PadRight(30,' ').Substring(0,30)),0,30) }
If($Year -eq "`0"){ $strm.Seek(4,'Current') | Out-Null}
Else {$strm.Write($enc.GetBytes($Year.PadRight(4,' ').Substring(0,4)),0,4) }
If(($Track -ne -1) -or ($currentID3Bytes[125] -eq 0)) {$CommentMaxLen = 28}Else{$CommentMaxLen = 30} #If a Track is specified or present in the file, Comment is 28 chars
If($Comment -eq "`0"){ $strm.Seek($CommentMaxLen,'Current') | Out-Null}
Else {$strm.Write($enc.GetBytes($Comment.PadRight($CommentMaxLen,' ').Substring(0,$CommentMaxLen)),0,$CommentMaxLen) }
If($Track -eq -1 ){$strm.Seek(2,'Current') | Out-Null}
Else{$strm.Write(@(0,$Track),0,2)} #Track, if present, is preceded by a 0-byte to form the last two bytes of Comment
If($Genre -ne -1){$strm.Write($Genre,0,1) | Out-Null}
}Catch{
Write-Error $_.Exception.Message
}Finally{
If($strm){
$strm.Flush()
$strm.Close()
}
}
If($BackDate){(Get-ChildItem -LiteralPath $path).LastWriteTime = $CurrentModified.AddMinutes(1)}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用 MP3 文件的完整路径以及要更改的任何ID3V1属性来调用它:
Set-ID3v1 -path "c:\users\me\Desktop\Test.mp3" -Year 1996 -Title "This is a test"
Run Code Online (Sandbox Code Playgroud)
基本上它会写入文件的最后 128 个字节,包括标题、艺术家等。我可能会添加对 ID3v 2.3的支持,它更加灵活,但与旧设备和软件的兼容性较差。检查GitHub以获得最新版本。
归档时间: |
|
查看次数: |
10399 次 |
最近记录: |