Created
August 8, 2017 01:05
-
-
Save rwilkes/5c8bf29a65646dec1b8e0778260753d0 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<# | |
.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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<# | |
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 |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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)")] | |
#> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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