Skip to content

Instantly share code, notes, and snippets.

@rwilkes
Created August 8, 2017 01:05
Show Gist options
  • Save rwilkes/5c8bf29a65646dec1b8e0778260753d0 to your computer and use it in GitHub Desktop.
Save rwilkes/5c8bf29a65646dec1b8e0778260753d0 to your computer and use it in GitHub Desktop.
<#
.NOTES
-------------------------------------
Name: Export-MediaFileDetails.ps1
Version: 3.0a - 01/15/2017
Author: Randy E. Turner
Email: [email protected]
-------------------------------------
.SYNOPSIS
This Cmdlet will search a location for media files and export detailed
information about the files to a Tab-Delimited text file suitable for importing into a database.
There are 3 modes of operation: Audio, Image, & Video.
This version tested on Windows 10, but should work on others.
.DESCRIPTION
Media File Extended File Property Exporter
.PARAMETER Mode
Mode of Operation <Required> Audio, Image, or Video
.PARAMETER Directory
Name of the topmost directory to search, if omitted the User default is used.
An Alias of -Dir is provided.
.PARAMETER OutFile
Name of the export file, if omitted a predefined file of
<Mode>Report.txt is used. An Alias of -Out is provided.
.PARAMETER Append
Switch to enable appending to an existing output file.
An Alias of -A is provided.
.PARAMETER Recurse
Switch to enable searching recursively.
An Alias of -R is provided.
.PARAMETER Notify
Use this switch to have a MessageBox Displayed
upon completion of the selected export operation.
An Alias of -N is provided.
.PARAMETER ShowMediaProperties
Switch to enable showing the media properities exported.
An Alias of -SMP is provided. Values shown are mode dependent.
Note:(Overrides export, may be paired with ShowMediaFileTypes)
.PARAMETER ShowMediaFileTypes
Switch to enable showing the media types supported.
An Alias of -SFT is provided. Values shown are mode dependent.
Note:(Overrides export, may be paired with ShowMediaProperties)
.PARAMETER ShowExportFieldNames
Switch to enable showing the Export Field Names used.
An Alias of -SXF is provided. Note:(Overrides all other parameters)
.LINK
Based upon information provided by
http://powershell.com/cs/blogs/tobias/archive/2011/01/07/organizing-videos-and-music.aspx
.EXAMPLE
To Display Supported File Properties & Types
Export-MediaFileDetails -Mode Audio -ShowMediaProperties -ShowMediaFileTypes
.EXAMPLE
To Display Supported File Properties & Types
Export-MediaFileDetails -Mode Video -Dir "\\MediaServer\Public\Video" -Out "C:\VideoReport.txt" -R -A
#>
[CmdletBinding()]
Param(
[Parameter(Mandatory=$True)][ValidateNotNullOrEmpty()][ValidateSet('Audio','Image','Video')][String]$Mode,
[Parameter(Mandatory=$False)][Alias('Dir')][String]$Directory="",
[Parameter(Mandatory=$False)][Alias('Out')][String]$OutFile="",
[Parameter(Mandatory=$False)][Alias('A')][Switch]$Append,
[Parameter(Mandatory=$False)][Alias('R')][Switch]$Recurse,
[Parameter(Mandatory=$False)][Alias('N')][Switch]$Notify,
[Parameter(Mandatory=$False)][Alias('SMP')][Switch]$ShowMediaProperties,
[Parameter(Mandatory=$False)][Alias('SFT')][Switch]$ShowMediaFileTypes,
[Parameter(Mandatory=$False)][Alias('SXF')][Switch]$ShowExportFieldNames)
Import-Module -Name .\ExtractIcon.ps1 -Force
Import-Module -Name .\OSInfoLib.ps1 -Force
Import-Module -Name .\Get-MetadataIndex.ps1 -Force
if ($ShowExportFieldNames -eq $True)
{$ShowMediaProperties = $ShowMediaFileTypes = $False}
$WinVer = Get-OSVersion
$MetaDataIndex = Get-ExtendedFilePropertyIndex $Directory
if($WinVer.Version -eq $null)
{
$ErrMsg = "Windows OS Version of 7/8/10 required, task Aborted"
if($Notify){Show-MsgBox $ErrMsg}
$ErrMsg
exit 100 #Abort Script
}
#Hash Tables
$AudioHash = `
@{
FolderPath = 184;
Name = (Get-IndexByMetadataName $MetaDataIndex "Name");
Title = (Get-IndexByMetadataName $MetaDataIndex "Title");
Album = (Get-IndexByMetadataName $MetaDataIndex "Album");
TrackNo = (Get-IndexByMetadataName $MetaDataIndex "#");
RunTime = (Get-IndexByMetadataName $MetaDataIndex "Length");
ItemType = (Get-IndexByMetadataName $MetaDataIndex "Item type");
FileExtension = (Get-IndexByMetadataName $MetaDataIndex "File extension");
DateCreated = (Get-IndexByMetadataName $MetaDataIndex "Date created");
DateModified = (Get-IndexByMetadataName $MetaDataIndex "Date modified");
DateAccessed = (Get-IndexByMetadataName $MetaDataIndex "Date accessed");
ContributingArtists = (Get-IndexByMetadataName $MetaDataIndex "Contributing artists");
YearReleased = (Get-IndexByMetadataName $MetaDataIndex "Year");
Genre = (Get-IndexByMetadataName $MetaDataIndex "Genre");
Rating = (Get-IndexByMetadataName $MetaDataIndex "Rating");
BitRate = (Get-IndexByMetadataName $MetaDataIndex "Bit rate");
Publisher = (Get-IndexByMetadataName $MetaDataIndex "Publisher");
PartOfSet = (Get-IndexByMetadataName $MetaDataIndex "Part of a compilation");
Size = (Get-IndexByMetadataName $MetaDataIndex "Size");
}
$ImageHash = `
@{
Folderpath = (Get-IndexByMetadataName $MetaDataIndex "Folder path");
Name = (Get-IndexByMetadataName $MetaDataIndex "Name");
FileExtension = (Get-IndexByMetadataName $MetaDataIndex "File extension");
ItemType = (Get-IndexByMetadataName $MetaDataIndex "Item type");
DateCreated = (Get-IndexByMetadataName $MetaDataIndex "Date created");
DateModified = (Get-IndexByMetadataName $MetaDataIndex "Date modified");
DateAccessed = (Get-IndexByMetadataName $MetaDataIndex "Date accessed");
DateTaken = (Get-IndexByMetadataName $MetaDataIndex "Date taken");
CameraMaker = (Get-IndexByMetadataName $MetaDataIndex "Camera maker");
CameraModel = (Get-IndexByMetadataName $MetaDataIndex "Camera model");
Dimensions = (Get-IndexByMetadataName $MetaDataIndex "Dimensions");
BitDepth = (Get-IndexByMetadataName $MetaDataIndex "Bit depth");
HorizontalResolution = (Get-IndexByMetadataName $MetaDataIndex "Horizontal resolution");
VerticalResolution = (Get-IndexByMetadataName $MetaDataIndex "Vertical resolution");
Width = (Get-IndexByMetadataName $MetaDataIndex "Width");
Height = (Get-IndexByMetadataName $MetaDataIndex "Height");
EXIF_Version = (Get-IndexByMetadataName $MetaDataIndex "EXIF version");
ExposureBias = (Get-IndexByMetadataName $MetaDataIndex "Exposure bias");
ExposureProgram = (Get-IndexByMetadataName $MetaDataIndex "Exposure program");
ExposureTime = (Get-IndexByMetadataName $MetaDataIndex "Exposure time");
FStop = (Get-IndexByMetadataName $MetaDataIndex "F-stop");
FlashMode = (Get-IndexByMetadataName $MetaDataIndex "Flash mode");
FocalLength = (Get-IndexByMetadataName $MetaDataIndex "Focal length");
FocalLength35mm = (Get-IndexByMetadataName $MetaDataIndex "35mm focal length");
ISO_Speed = (Get-IndexByMetadataName $MetaDataIndex "ISO speed");
LightSource = (Get-IndexByMetadataName $MetaDataIndex "Light source");
MaxAperture = (Get-IndexByMetadataName $MetaDataIndex "Max aperture");
MeteringMode = (Get-IndexByMetadataName $MetaDataIndex "Metering mode");
Orientation = (Get-IndexByMetadataName $MetaDataIndex "Orientation");
ProgramMode = (Get-IndexByMetadataName $MetaDataIndex "Program mode");
Saturation = (Get-IndexByMetadataName $MetaDataIndex "Saturation");
WhiteBalance = (Get-IndexByMetadataName $MetaDataIndex "White balance");
Size = (Get-IndexByMetadataName $MetaDataIndex "Size");
}
$VideoHash = `
@{
Folderpath = (Get-IndexByMetadataName $MetaDataIndex "Folder path");
Name = (Get-IndexByMetadataName $MetaDataIndex "Name");
FileExtension = (Get-IndexByMetadataName $MetaDataIndex "File extension");
ItemType = (Get-IndexByMetadataName $MetaDataIndex "Item type");
Title = (Get-IndexByMetadataName $MetaDataIndex "Title");
Subtitle = (Get-IndexByMetadataName $MetaDataIndex "Subtitle");
DateCreated = (Get-IndexByMetadataName $MetaDataIndex "Date created");
DateModified = (Get-IndexByMetadataName $MetaDataIndex "Date modified");
DateAccessed = (Get-IndexByMetadataName $MetaDataIndex "Date accessed");
ContributingArtists = (Get-IndexByMetadataName $MetaDataIndex "Contributing artists");
Album = (Get-IndexByMetadataName $MetaDataIndex "Album");
Year = (Get-IndexByMetadataName $MetaDataIndex "Year");
Genre = (Get-IndexByMetadataName $MetaDataIndex "Genre");
Rating = (Get-IndexByMetadataName $MetaDataIndex "Rating");
Length = (Get-IndexByMetadataName $MetaDataIndex "Length");
FrameWidth = (Get-IndexByMetadataName $MetaDataIndex "Frame width");
FrameHeight = (Get-IndexByMetadataName $MetaDataIndex "Frame height");
VideoOrientation = (Get-IndexByMetadataName $MetaDataIndex "Video orientation");
DataRate = (Get-IndexByMetadataName $MetaDataIndex "Data rate");
Bitrate = (Get-IndexByMetadataName $MetaDataIndex "Bit rate");
TotalBitrate = (Get-IndexByMetadataName $MetaDataIndex "Total bitrate");
FrameRate = (Get-IndexByMetadataName $MetaDataIndex "Frame rate");
Size = (Get-IndexByMetadataName $MetaDataIndex "Size");
VideoCompressionRegKey = (Get-IndexByMetadataName $MetaDataIndex "Video compression");
}
#Supported Audio File Types
$AudioFileTypes = @(
".3gp",".aac",".act",".aiff",".alac",".amr",".atrac",".au",
".awb",".dct",".dss",".dvf",".flac",".gsm",".iklax",".ivs",
".m3u",".m4a",".m4p",".mmf",".mp2",".mp3",".mpc",".msv",".ogg",
".opus",".ra",".rm",".raw",".tta",".vox",".wav",".wavpack",".wma")
#Supported Image File Types
$ImageFileTypes = @(
".bmp",".clp",".emf",".img",".jp2",
".jpg",".jpeg",".mac",".pcx",".png",
".gif",".tif",".tiff",".ras",".raw")
#Supported Video File Types
$VideoFileTypes = @(
".avi",".divx",".dvx",".f4p",".f4v",".fli",".flv",
".mp4",".mov",".m4v",".mpg",".mpeg",".wmv",".mkv",".xvid")
$ValidModes = @('Audio','Image','Video')
$ModeIdx = [array]::IndexOf($ValidModes,$Mode)
$FieldNames = @(
#Audio
("EFP_Directory","EFP_FileName","EFP_FileExtension","EFP_ItemType",
"EFP_DateCreated","EFP_DateModified","EFP_DateAccessed","EFP_Title",
"EFP_Album","EFP_TrackNo","EFP_RunTime","EFP_ContributingArtists",
"EFP_YearReleased","EFP_Genre","EFP_Rating","EFP_BitRate",
"EFP_Publisher","EFP_PartOfSet","EFP_Size"),
#Image
("EFP_Directory","EFP_FileName","EFP_FileExtension","EFP_ItemType",
"EFP_DateCreated","EFP_DateModified","EFP_DateAccessed","EFP_DateTaken",
"EFP_CameraMaker","EFP_CameraModel","EFP_Dimensions","EFP_BitDepth",
"EFP_HorizontalResolution","EFP_VerticalResolution","EFP_Width ",
"EFP_Height","EFP_EXIF_Version","EFP_ExposureBias","EFP_ExposureProgram",
"EFP_ExposureTime","EFP_FStop","EFP_FlashMode","EFP_FocalLength",
"EFP_FocalLength35mm","EFP_ISO_Speed","EFP_LightSource","EFP_MaxAperture",
"EFP_MeteringMode","EFP_Orientation","EFP_ProgramMode","EFP_Saturation",
"EFP_WhiteBalance","EFP_Size"),
#Video
("EFP_Directory","EFP_FileName","EFP_FileExtension","EFP_ItemType",
"EFP_DateCreated","EFP_DateModified","EFP_DateAccessed","EFP_Title",
"EFP_Subtitle","EFP_Genre","EFP_RunTime","EFP_Album",
"EFP_ContributingArtists","EFP_YearReleased","EFP_Rating","EFP_FrameWidth",
"EFP_FrameHeight","EFP_FrameRate","EFP_VideoOrientation","EFP_VideoCompressionRegKey",
"EFP_Bitrate","EFP_DataRate","EFP_TotalBitrate","EFP_Size")
)
function Get-RegistryValue($key, $value)
{(Get-ItemProperty $key $value).$value}
function Get-ReportFile
{
param(
[Parameter(Mandatory=$True)]
[ValidateNotNullOrEmpty()]
[ValidateSet('Audio','Image','Video')]
[String]$Mode)
return -join(".\",$Mode,"Report.txt")
}
function Get-UserMediaFolder
{
param(
[Parameter(Mandatory=$True)]
[ValidateNotNullOrEmpty()]
[ValidateSet('Audio','Image','Video')]
[String]$Mode)
$SubKeys = @("My Music","My Pictures","My Video")
$KeyPath = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders"
Get-RegistryValue $KeyPath $SubKeys[$ModeIdx]
}
function Get-Dir([String]$Directory, [Bool]$Recurse)
{
if($Recurse -eq $True)
{Dir $Directory -Recurse}
else
{Dir $Directory}
}
function Get-ColumnHeaders
{
for($C=0;$C -lt $FieldNames[$ModeIdx].length-1;$C++)
{$FormatStr += "{$C}`t"}
$FormatStr += "{$($FieldNames[$ModeIdx].length-1)}"
$FormatStr -F $FieldNames[$ModeIdx]
}
function Add-FileDetails {
param([Parameter(ValueFromPipeline=$true)]
$fileobject,
$hash = @{Artists = 13; Album = 14; Year = 15; Genre = 16; Title = 21; Length = 27; Bitrate = 28}
)
begin { $shell = New-Object -COMObject Shell.Application }
process {
if ($_.PSIsContainer -eq $false) {
$folder = Split-Path $fileobject.FullName
$file = Split-Path $fileobject.FullName -Leaf
$shellfolder = $shell.Namespace($folder)
$shellfile = $shellfolder.ParseName($file)
Write-Progress 'Adding Properties' $fileobject.FullName
$hash.Keys |
ForEach-Object {
$property = $_
$value = $shellfolder.GetDetailsOf($shellfile, $hash.$property)
if ($value -as [Double]) { $value = [Double]$value}
$fileobject | Add-Member NoteProperty "Extended_$property" $value -force
}
}
$fileobject
}
}
function Export-DataAudio
{
param(
[Parameter(Mandatory=$False)][Alias('Dir')][String]$Directory=(Get-UserMediaFolder -Mode Audio),
[Parameter(Mandatory=$False)][Alias('Out')][String]$OutFile=(Get-ReportFile -Mode Audio),
[Parameter(Mandatory=$False)][Alias('A')][bool]$Append,
[Parameter(Mandatory=$False)][Alias('R')][bool]$Recurse)
#Gather Data
$list = Get-Dir $Directory $Recurse |
Add-FileDetails -hash $AudioHash
$list | Where-Object { $_.Extended_Name } |
Sort-Object $File.FullName |
Select-Object `
Extended_FolderPath,
Extended_Name,
Extended_FileExtension,
Extended_ItemType,
Extended_DateCreated,
Extended_DateModified,
Extended_DateAccessed,
Extended_Title,
Extended_Album,
Extended_TrackNo,
Extended_RunTime,
Extended_ContributingArtists,
Extended_YearReleased,
Extended_Genre,
Extended_Rating,
Extended_BitRate,
Extended_Publisher,
Extended_PartOfSet,
Extended_Size
#Fix Extended_FileExtension
if($WinVer.IsWin7)
{foreach($file in $List)
{
if($File.mode.StartsWith('d') -ne $True)
{$File.Extended_FileExtension = $File.Extension}
}
}
#Export Data
if((Test-Path $OutFile) -eq $True -and ($Append -eq $False)){Remove-Item -Path $OutFile}
$FormatStr = ""
for($C=0;$C -lt $AudioHash.Keys.Count-1;$C++)
{$FormatStr += "{$C}`t"}
$FormatStr += "{$($AudioHash.Keys.Count-1)}"
Get-ColumnHeaders | Out-File $($OutFile) -Append
forEach($file in $List)
{
if($File.mode.StartsWith('d') -ne $True)
{if($File.Extended_FileExtension.length -ne 0)
{if($AudioFileTypes.Contains($File.Extended_FileExtension.ToLower()))
{
$FormatStr -f `
$File.Extended_FolderPath,
$File.Extended_Name,
$File.Extended_FileExtension,
$File.Extended_ItemType,
$File.Extended_DateCreated,
$File.Extended_DateModified,
$File.Extended_DateAccessed,
$File.Extended_Title,
$File.Extended_Album,
$File.Extended_TrackNo,
$File.Extended_RunTime,
$File.Extended_ContributingArtists,
$File.Extended_YearReleased,
$File.Extended_Genre,
$File.Extended_Rating,
$File.Extended_BitRate,
$File.Extended_Publisher,
$File.Extended_PartOfSet,
$File.Extended_Size | Out-File $($OutFile) -Append
}
}
}
}
}
function Export-DataImage
{
param(
[Parameter(Mandatory=$False)][Alias('Dir')][String]$Directory=(Get-UserMediaFolder -Mode Image),
[Parameter(Mandatory=$False)][Alias('Out')][String]$OutFile=(Get-ReportFile -Mode Image),
[Parameter(Mandatory=$False)][Alias('A')][bool]$Append,
[Parameter(Mandatory=$False)][Alias('R')][bool]$Recurse)
#Gather Data
$list = Get-Dir $Directory $Recurse |
Add-FileDetails -hash $ImageHash
$list | Where-Object { $_.Extended_Name } |
Sort-Object $File.FullName |
Select-Object `
Extended_Folderpath,
Extended_Name,
Extended_FileExtension,
Extended_ItemType,
Extended_DateCreated,
Extended_DateModified,
Extended_DateAccessed,
Extended_DateTaken,
Extended_CameraMaker,
Extended_CameraModel,
Extended_Dimensions,
Extended_BitDepth,
Extended_HorizontalResolution,
Extended_VerticalResolution,
Extended_Width,
Extended_Height,
Extended_EXIF_Version,
Extended_ExposureBias,
Extended_ExposureProgram,
Extended_ExposureTime,
Extended_FStop,
Extended_FlashMode,
Extended_FocalLength,
Extended_FocalLength35mm,
Extended_ISO_Speed,
Extended_LightSource,
Extended_MaxAperture,
Extended_MeteringMode,
Extended_Orientation,
Extended_ProgramMode,
Extended_Saturation,
Extended_WhiteBalance,
Extended_Size
#Fix Extended_FileExtension
if($WinVer.IsWin7)
{foreach($file in $List)
{
if($File.mode.StartsWith('d') -ne $True)
{$File.Extended_FileExtension = $File.Extension}
}
}
#Export Data
if((Test-Path $OutFile) -eq $True -and ($Append -eq $False)){Remove-Item -Path $OutFile}
$FormatStr = ""
for($C=0;$C -lt $ImageHash.Keys.Count-1;$C++)
{$FormatStr += "{$C}`t"}
$FormatStr += "{$($ImageHash.Keys.Count-1)}"
Get-ColumnHeaders | Out-File $($OutFile) -Append
foreach($file in $List)
{
if($File.mode.StartsWith('d') -ne $True)
{if($File.Extended_FileExtension.length -ne 0)
{if($ImageFileTypes.Contains($File.Extended_FileExtension.ToLower()))
{
$FormatStr -f `
$File.Extended_Folderpath,
$File.Extended_Name,
$File.Extended_FileExtension,
$File.Extended_ItemType,
$File.Extended_DateCreated,
$File.Extended_DateModified,
$File.Extended_DateAccessed,
$File.Extended_DateTaken,
$File.Extended_CameraMaker,
$File.Extended_CameraModel,
$File.Extended_Dimensions,
$File.Extended_BitDepth,
$File.Extended_HorizontalResolution,
$File.Extended_VerticalResolution,
$File.Extended_Width,
$File.Extended_Height,
$File.Extended_EXIF_Version,
$File.Extended_ExposureBias,
$File.Extended_ExposureProgram,
$File.Extended_ExposureTime,
$File.Extended_FStop,
$File.Extended_FlashMode,
$File.Extended_FocalLength,
$File.Extended_FocalLength35mm,
$File.Extended_ISO_Speed,
$File.Extended_LightSource,
$File.Extended_MaxAperture,
$File.Extended_MeteringMode,
$File.Extended_Orientation,
$File.Extended_ProgramMode,
$File.Extended_Saturation,
$File.Extended_WhiteBalance,
$File.Extended_Size | Out-File $($OutFile) -Append
}
}
}
}
}
function Export-DataVideo
{
param(
[Parameter(Mandatory=$False)][Alias('Dir')][String]$Directory=(Get-UserMediaFolder -Mode Video),
[Parameter(Mandatory=$False)][Alias('Out')][String]$OutFile=(Get-ReportFile -Mode Video),
[Parameter(Mandatory=$False)][Alias('A')][bool]$Append,
[Parameter(Mandatory=$False)][Alias('R')][bool]$Recurse)
#Gather Data
$list = Get-Dir $Directory $Recurse |
Add-FileDetails -hash $VideoHash
$list | Where-Object { $_.Extended_Name } |
Sort-Object $File.FullName |
Select-Object `
Extended_Folderpath,
Extended_Name,
Extended_FileExtension,
Extended_ItemType,
Extended_DateCreated,
Extended_DateModified,
Extended_DateAccessed,
Extended_Title,
Extended_Subtitle,
Extended_Genre,
Extended_Length,
Extended_Album,
Extended_ContributingArtists,
Extended_Year,
Extended_Rating,
Extended_FrameWidth,
Extended_FrameHeight,
Extended_FrameRate,
Extended_VideoOrientation,
Extended_VideoCompressionRegKey,
Extended_Bitrate,
Extended_DataRate,
Extended_TotalBitrate,
Extended_Size
#Fix Extended_FileExtension
If($WinVer.IsWin7)
{foreach($file in $List)
{
if($File.mode.StartsWith('d') -ne $True)
{$File.Extended_FileExtension = $File.Extension}
}
}
#Export Data
if((Test-Path $OutFile) -eq $True -and ($Append -eq $False)){Remove-Item -Path $OutFile}
$FormatStr = ""
for($C=0;$C -lt $VideoHash.Keys.Count-1;$C++)
{$FormatStr += "{$C}`t"}
$FormatStr += "{$($VideoHash.Keys.Count-1)}"
Get-ColumnHeaders | Out-File $($OutFile) -Append
foreach($file in $List)
{
if($File.mode.StartsWith('d') -ne $True)
{if($File.Extended_FileExtension.length -ne 0)
{if($VideoFileTypes.Contains($File.Extended_FileExtension.ToLower()))
{
$FormatStr -f `
$File.Extended_Folderpath,
$File.Name,
$File.Extended_FileExtension,
$File.Extended_ItemType,
$File.Extended_DateCreated,
$File.Extended_DateModified,
$File.Extended_DateAccessed,
$File.Extended_Title,
$File.Extended_Subtitle,
$File.Extended_Genre,
$File.Extended_Length,
$File.Extended_Album,
$File.Extended_ContributingArtists,
$File.Extended_Year,
$File.Extended_Rating,
$File.Extended_FrameWidth,
$File.Extended_FrameHeight,
$File.Extended_FrameRate,
$File.Extended_VideoOrientation,
$File.Extended_VideoCompressionRegKey,
$File.Extended_Bitrate,
$File.Extended_DataRate,
$File.Extended_TotalBitrate,
$File.Extended_Size | Out-File $($OutFile) -Append
}
}
}
}
}
function Export-MediaFileDetails($Mode,$Directory,
$OutFile,$Append,$Recurse,
$ShowMediaProperties,
$ShowMediaFileTypes)
{
if($ShowMediaProperties -eq $True -or
$ShowMediaFileTypes -eq $True -or
$ShowExportFieldNames -eq $True)
{Show-MediaInfo $Mode $ShowMediaProperties $ShowMediaFileTypes}
else
{
switch($Mode)
{
$ValidModes[0]
{
if($Directory.Length -eq 0){$Directory = Get-UserMediaFolder -Mode Audio}
if($OutFile.Length -eq 0){$OutFile = Get-ReportFile -Mode Audio}
Export-DataAudio $Directory $OutFile $Append $Recurse
}
$ValidModes[1]
{
if($Directory.Length -eq 0){$Directory = Get-UserMediaFolder -Mode Image}
if($OutFile.Length -eq 0){$OutFile = Get-ReportFile -Mode Image}
Export-DataImage $Directory $OutFile $Append $Recurse
}
$ValidModes[2]
{
if($Directory.Length -eq 0){$Directory = Get-UserMediaFolder -Mode Video}
if($OutFile.Length -eq 0){$OutFile = Get-ReportFile -Mode Video}
Export-DataVideo $Directory $OutFile $Append $Recurse
}
}
if($Notify -eq $True){Show-MsgBox "Export Complete!"}
}
}
function Show-MediaInfo($Mode,$ShowMediaProperties,$ShowMediaFileTypes)
{
$ShowFields = !($ShowMediaProperties -eq $True -or $ShowMediaFileTypes -eq $True)
if($ShowFields -eq $False)
{$FormWidth =750;$FormHeight = 575}
else
{$FormWidth =925;$FormHeight = 668}
$Titles = @("Media Properties\Types","Export Field Names")
Add-Type -A "System.Windows.Forms"
#Add objects for About
$fotmInfo = New-Object System.Windows.Forms.Form
$rtbInfo = New-Object System.Windows.Forms.RichTextBox
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
#About Form
$fotmInfo.AutoScroll = $True
$fotmInfo.ClientSize = New-Object System.Drawing.Size($FormWidth,$FormHeight)
$fotmInfo.DataBindings.DefaultDataSourceUpdateMode = 0
$fotmInfo.FormBorderStyle = 1
$fotmInfo.Name = "formInfo"
$fotmInfo.StartPosition = 1
$TI = if($ShowFields -eq $False){0}else{1}
$fotmInfo.Text = "Export-MediaFileDetails - "+$Titles[$TI]
$fotmInfo.Icon = [System.IconExtractor]::Extract("imageres.dll", 76, $False)
$fotmInfo.MaximizeBox = $False
$fotmInfo.MinimizeBox = $False
$rtbInfo.Anchor = 15
$rtbInfo.BackColor = [System.Drawing.Color]::FromArgb(255,240,240,240)
$rtbInfo.BorderStyle = 1
$rtbInfo.DataBindings.DefaultDataSourceUpdateMode = 0
$rtbInfo.Location = New-Object System.Drawing.Point(13,13)
$rtbInfo.Name = "rtbInfo"
$rtbInfo.ReadOnly = $True
$rtbInfo.Cursor = [System.Windows.Forms.Cursors]::Default
$rtbInfo.Size = New-Object System.Drawing.Size($($fotmInfo.Width-30),$($fotmInfo.Height-100))
$rtbInfo.TabIndex = 0
$rtbInfo.TabStop = $False
$rtbInfo.font = New-Object System.Drawing.Font("Lucida Console",12,[System.Drawing.FontStyle]::Regular)
$rtbInfo.Text = `
if($ShowFields -eq $False)
{"`n "+$(Get-MediaInfo $Mode $ShowMediaProperties $ShowMediaFileTypes = $True)}
else
{Get-FieldNames}
$fotmInfo.Controls.Add($rtbInfo)
# Exit Button
$BtnExit = New-Object System.Windows.Forms.Button
$BtnExit.Anchor = 15
$BtnExit.Name = "BtnExit"
$BtnExit.Size = New-Object System.Drawing.Size(80,30)
$BtnExitLeft = $rtbInfo.Right - $BtnExit.Width
$BtnExit.Location = New-Object System.Drawing.Point($BtnExitLeft,$($fotmInfo.Height-75))
$BtnExit.Text = "Exit"
$BtnExit.UseVisualStyleBackColor = $True
$BtnExit_Click = {$fotmInfo.Close()}
$BtnExit.add_Click($BtnExit_Click)
$fotmInfo.Controls.Add($BtnExit)
[Void]$fotmInfo.ShowDialog()
}
function Get-MediaInfo($Mode,$ShowMediaProperties,$ShowMediaFileTypes)
{
switch($Mode)
{
$ValidModes[0] {$MediaHash = $AudioHash; $MediaTypes = $AudioFileTypes}
$ValidModes[1] {$MediaHash = $ImageHash; $MediaTypes = $ImageFileTypes}
$ValidModes[2] {$MediaHash = $VideoHash; $MediaTypes = $VideoFileTypes}
}
$MediaID = $Mode
$RV = if($ShowMediaProperties -eq $True){"$MediaID Properties`n"+"-"*24;"`n";forEach($key in $MediaHash.Keys){-join $key,"`n"}}
$RV += if($ShowMediaFileTypes -eq $True){"`n$MediaID Types`n" +"-"*19;"`n";forEach($type in $MediaTypes){-join $type,"`n"}}
Return $RV
}
function Get-FieldNames
{
$objFieldNames = @()
for($C=1;$C -le $FieldNames[1].Length;$C++)
{
$objFieldName = New-Object PSObject
Add-Member -InputObject $objFieldName -MemberType NoteProperty -Name No -Value $C
Add-Member -InputObject $objFieldName -MemberType NoteProperty -Name Audio -Value ""
Add-Member -InputObject $objFieldName -MemberType NoteProperty -Name Image -Value ""
Add-Member -InputObject $objFieldName -MemberType NoteProperty -Name Video -Value ""
$objFieldNames += $objFieldName
}
for($C=0;$C -le $fieldnames[0].Length-1;$C++){$objFieldNames[$C].Audio = $fieldnames[0][$C]}
for($C=0;$C -le $fieldnames[1].Length-1;$C++){$objFieldNames[$C].Image = $fieldnames[1][$C]}
for($C=0;$C -le $fieldnames[2].Length-1;$C++){$objFieldNames[$C].Video = $fieldnames[2][$C]}
$W=26
$UL= "-"*$W
"`n No.`t{0}`t{1}`t{2}" -F $("Audio").PadRight($W," "),$("Image").PadRight($W," "),"Video"
"`n ---`t{0}`t{0}`t{0}`r`n" -F $UL
$objFieldNames| % `
{"{0:D3}`t{1}`t{2}`t{3}`r`n" -F $_.No,$_.Audio.Padright($W," "),$_.Image.Padright($W," "),$_.Video}
}
function Show-MsgBox($Msg)
{
[System.Windows.Forms.MessageBox]::Show(
$Msg,"Export-MediaFileDetails",
[Windows.Forms.MessageBoxButtons]::Ok,
[Windows.Forms.MessageBoxIcon]::Information)
}
#Call Main function
Export-MediaFileDetails $Mode $Directory $OutFile $Append $Recurse $ShowMediaProperties $ShowMediaFileTypes
<#
Wrapper for VB code calling the ExtractIconEX function from the Windows API
for extracting icons from .dll, .exe, etc.
Obtained verbatim from Kazun's post at -
http://social.technet.microsoft.com/Forums/en/winserverpowershell/thread/16444c7a-ad61-44a7-8c6f-b8d619381a27
EXAMPLES
$Image = [System.IconExtractor]::Extract("Shell32", 297, $False).ToBitmap()
$Form1.Icon = [System.IconExtractor]::Extract("Shell32", 297, $False)
#>
$codeIconExtract = @"
using System;
using System.Drawing;
using System.Runtime.InteropServices;
namespace System
{
public class IconExtractor
{
public static Icon Extract(string file, int number, bool largeIcon)
{
IntPtr large;
IntPtr small;
ExtractIconEx(file, number, out large, out small, 1);
try
{
return Icon.FromHandle(largeIcon ? large : small);
}
catch
{
return null;
}
}
[DllImport("Shell32.dll", EntryPoint = "ExtractIconExW", CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
private static extern int ExtractIconEx(string sFile, int iIndex, out IntPtr piLargeVersion, out IntPtr piSmallVersion, int amountIcons);
}
}
"@
#Add Type to use wrapped Static function for icon extraction
Add-Type -TypeDefinition $codeIconExtract -ReferencedAssemblies System.Drawing
#Script Lrvel Variables
$ShellObjInitialized = $False
$path = ""
$shell = ""
$folder = ""
$file = ""
$shellfolder = ""
$shellfile = ""
$PIL = 500
function Init-ShellObj($TargetPath)
{
#Create Windows Shell Object
if($TargetPath){$Script:path = $TargetPath}
$Script:shell = New-Object -COMObject Shell.Application
$Script:folder = Split-Path $Script:path
$Script:file = Split-Path $Script:path -Leaf
$Script:shellfolder = $Script:shell.Namespace($Script:folder)
$Script:shellfile = $Script:shellfolder.ParseName($Script:file)
$Script:ShellObjInitialized = $True
}
function Get-ExtendedFilePropertyIndex([String]$TargetPath)
{
#To get a list of index numbers and their meaning
if($Script:ShellObjInitialized -eq $False){Init-ShellObj $TargetPath}
$MetadataIndex = 0..$PIL | Foreach-Object {New-MetadataIndexItem -Index $_ -Name $Script:shellfolder.GetDetailsOf($null, $_)}
$MetadataIndex = $MetadataIndex|Where-Object -Property Name -ne -Value ""
$MetadataIndex
}
function New-MetadataIndexItem
{
param(
[Parameter(Mandatory = $False)][Alias('N')][String]$Name='',
[Parameter(Mandatory = $False)][Alias('I')][Int]$Index=0)
New-Object -TypeName PSObject -Property @{Name = $Name; Index = $Index}
}
function Show-MetadataIndex([String]$TargetPath)
{Get-ExtendedFilePropertyIndex $TargetPath}
function Get-IndexByMetadataName([Array]$MDI,[String]$SearchValue)
{$MDI.Index[$MDI.Name.IndexOf($SearchValue)]}
# Sanple Code
<#
$MetadataIndex = Get-ExtendedFilePropertyIndex '\\MYBOOKLIVE\Public\Shared Videos\Movies\'
Get-IndexByMetadataName $MetadataIndex "Path"
$MetadataIndex.Index[$MetadataIndex.Name.IndexOf("Video orientation")]
$MetadataIndex.Index[$MetadataIndex.Name.IndexOf("Masters Keywords (debug)")]
#>
function Get-OSVersion
{
$NewObj = New-Object PSObject
$OSCaption = $((Get-WmiObject -class Win32_OperatingSystem).Caption)
$IsWin7 = $(($OSCaption).Contains("Windows 7"))
$IsWin8 = $(($OSCaption).Contains("Windows 8"))
$IsWin10 = $(($OSCaption).Contains("Windows 10"))
$VersNo = if($IsWin10) {10} elseif($IsWin8) {8} elseif($IsWin7) {7} else {$null}
$OSVersion = [System.Environment]::OSVersion.Version
$IsWin10AE = if($OSVersion.Major -eq 10 -and $OSVersion.build -ge 14393) {$True} else {$False}
Add-Member -InputObject $NewObj -MemberType NoteProperty -Name Caption -Value $($OSCaption)
Add-Member -InputObject $NewObj -MemberType NoteProperty -Name IsWin7 -Value $($IsWin7)
Add-Member -InputObject $NewObj -MemberType NoteProperty -Name IsWin8 -Value $($IsWin8)
Add-Member -InputObject $NewObj -MemberType NoteProperty -Name IsWin10 -Value $($IsWin10)
Add-Member -InputObject $NewObj -MemberType NoteProperty -Name IsWin10AE -Value $($IsWin10AE)
Add-Member -InputObject $NewObj -MemberType NoteProperty -Name Version -Value $($VersNo)
Add-Member -InputObject $NewObj -MemberType NoteProperty -Name Major -Value $($OSVersion.Major)
Add-Member -InputObject $NewObj -MemberType NoteProperty -Name Minor -Value $($OSVersion.Minor)
Add-Member -InputObject $NewObj -MemberType NoteProperty -Name Build -Value $($OSVersion.Build)
Add-Member -InputObject $NewObj -MemberType NoteProperty -Name Revision -Value $($OSVersion.Revision)
Return $NewObj
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment