Guide to editing file metadata using PowerShell

Common metadata

Creation and modification date

  • Single file:

    (Get-ChildItem .\file.ext).CreationTime = "2022-07-17 23:47"
    (Get-ChildItem .\file.ext).LastWriteTime = "2022-07-17 23:47"
    
  • All files in current folder:

    Get-ChildItem | ForEach-Object { $_.CreationTime = "2022-07-17" }
    Get-ChildItem | ForEach-Object { $_.LastWriteTime = "2022-07-17" }
    

Media files

Loading TagLib#

TagLib# is a really great library crafted for this job. Download the NuGet package and unzip it. Copy the TagLibSharp.dll into where you'll be running the script.

.
├── lib
│   ├── net45
│   │   ├── ...
│   └── netstandard2.0
│       ├── TagLibSharp.dll <-- we need this one
│       ├── TagLibSharp.pdb
│       └── TaglibSharp.xml
├── ...
└── ...

Load the DLL:

[System.Reflection.Assembly]::LoadFrom((Resolve-Path "TagLibSharp.dll"))

Image metadata

Open the file and set properties in .ImageTag object and save it.

$photo = [TagLib.File]::Create((Resolve-Path "photo.jpg"))

$photo.ImageTag.Title = "hello"
$photo.ImageTag.Keywords = ("tag", "another tag")
$photo.ImageTag.Comment = "my comment"
$photo.ImageTag.DateTime = [System.DateTime]::Parse("2020-01-02")

$photo.Save()

Video metadata

TagLibSharp can modify video metadata too.

$video = $video = [TagLib.File]::Create((Resolve-Path ./video.mkv))

$video.Tag.Title = "my video"
$video.Tag.Year = 2020
$video.Tag.Comment = "a comment"
$video.Tag.Publisher = "a publisher"
$video.Tag.Description = "a description"

$video.Save()

Cover photo

Load the image file and override .Tag.Pictures with an array.

$cover = [TagLib.Picture]::CreateFromPath((Resolve-Path cover.png))

$video = [TagLib.File]::Create((Resolve-Path video.mp4))
$video.Tag.Pictures = ($cover)
$video.Save()

$music = [TagLib.File]::Create((Resolve-Path music.mp3))
$music.Tag.Pictures = ($cover)
$music.Save()
Last updated: