I’m slowly getting to grips with Powershell.

# -----------------------------------------------------------------
# Script - Catalog-MP3s.ps1 #
# Gets mp3 tags from the mp3 file.
# -----------------------------------------------------------------
# Parameter is either a directory or an individual mp3 Param ( $P_DIR_OR_MP3 )  
# --------------------------
# Function: get-mp3info
# The function gets the tags
# for the specified mp3
# --------------------------
Function get-mp3info ($P_MP3)
{
     # Get the tages into a variable
     $TAGS = [TagLib.File]::Create("$P_MP3")
     $TAGS_OBJECT = @{Filename = $TAGS.Name;

     Bitrate = $TAGS.Properties.AudioBitRate;
     Artist = $TAGS.tag.FirstArtist;
     Title =  $TAGS.tag.Title;
     Genre = $TAGS.tag.FirstGenre;
     LP = $TAGS.tag.Album}

     # Output as an object
     New-Object PSObject -Property $TAGS_OBJECT
}

     # --------------------------
     # Main body
     # --------------------------
     # Store the location of the taglib dll
     $TAGLIB="C:\Users\Matt\Downloads\taglib-sharp-2.1.0.0-windows\taglib-sharp-2.1.0.0-windows\Libraries\tag\lib-sharp.dll"

     # Load the DLL
     [System.Reflection.Assembly]::LoadFile($Taglib)

     # Get a list of all the MP3s under the specified folder
     # - exclude anything that's not an mp3
     # - Fullname contains the full path and filename
     $MP3_LIST = gci -recurse Filesystem::$DIR_OR_MP3 |
                     where {$_.Extension -eq '.mp3'} |
                     select FullName

     # Walk through the list, and output the tags
     foreach ($MP3 in $MP3_LIST)
     {
          get-mp3info $MP3.Fullname
     }

The heavily borrows from: