You've already forked SharedScripts
mirror of
https://github.com/jaapbrasser/SharedScripts.git
synced 2025-12-24 21:51:38 +02:00
134 lines
5.7 KiB
PowerShell
134 lines
5.7 KiB
PowerShell
function Get-ExtensionAttribute {
|
|
<#
|
|
.Synopsis
|
|
Retrieves extension attributes from files or folder
|
|
|
|
.DESCRIPTION
|
|
Uses the dynamically generated parameter -ExtensionAttribute to select one or multiple extension attributes and display the attribute(s) along with the FullName attribute
|
|
|
|
.NOTES
|
|
Name: Get-ExtensionAttribute.ps1
|
|
Author: Jaap Brasser
|
|
Version: 1.0
|
|
DateCreated: 2015-03-30
|
|
DateUpdated: 2015-03-30
|
|
Blog: http://www.jaapbrasser.com
|
|
|
|
.LINK
|
|
http://www.jaapbrasser.com
|
|
|
|
.PARAMETER FullName
|
|
The path to the file or folder of which the attributes should be retrieved. Can take input from pipeline and multiple values are accepted.
|
|
|
|
.PARAMETER ExtensionAttribute
|
|
Additional values to be loaded from the registry. Can contain a string or an array of string that will be attempted to retrieve from the registry for each program entry
|
|
|
|
.EXAMPLE
|
|
. .\Get-ExtensionAttribute.ps1
|
|
|
|
Description
|
|
-----------
|
|
This command dot sources the script to ensure the Get-ExtensionAttribute function is available in your current PowerShell session
|
|
|
|
.EXAMPLE
|
|
Get-ExtensionAttribute -FullName C:\Music -ExtensionAttribute Size,Length,Bitrate
|
|
|
|
Description
|
|
-----------
|
|
Retrieves the Size,Length,Bitrate and FullName of the contents of the C:\Music folder, non recursively
|
|
|
|
.EXAMPLE
|
|
Get-ExtensionAttribute -FullName C:\Music\Song2.mp3,C:\Music\Song.mp3 -ExtensionAttribute Size,Length,Bitrate
|
|
|
|
Description
|
|
-----------
|
|
Retrieves the Size,Length,Bitrate and FullName of Song.mp3 and Song2.mp3 in the C:\Music folder
|
|
|
|
.EXAMPLE
|
|
Get-ChildItem -Recurse C:\Video | Get-ExtensionAttribute -ExtensionAttribute Size,Length,Bitrate,Totalbitrate
|
|
|
|
Description
|
|
-----------
|
|
Uses the Get-ChildItem cmdlet to provide input to the Get-ExtensionAttribute function and retrieves selected attributes for the C:\Videos folder recursively
|
|
|
|
.EXAMPLE
|
|
Get-ChildItem -Recurse C:\Music | Select-Object FullName,Length,@{Name = 'Bitrate' ; Expression = { Get-ExtensionAttribute -FullName $_.FullName -ExtensionAttribute Bitrate | Select-Object -ExpandProperty Bitrate } }
|
|
|
|
Description
|
|
-----------
|
|
Combines the output from Get-ChildItem with the Get-ExtensionAttribute function, selecting the FullName and Length properties from Get-ChildItem with the ExtensionAttribute Bitrate
|
|
#>
|
|
[CmdletBinding()]
|
|
Param (
|
|
[Parameter(ValueFromPipeline=$true,
|
|
ValueFromPipelineByPropertyName=$true,
|
|
Position=0)]
|
|
[string[]]
|
|
$FullName
|
|
)
|
|
DynamicParam
|
|
{
|
|
$Attributes = new-object System.Management.Automation.ParameterAttribute
|
|
$Attributes.ParameterSetName = "__AllParameterSets"
|
|
$Attributes.Mandatory = $false
|
|
$AttributeCollection = New-Object -Type System.Collections.ObjectModel.Collection[System.Attribute]
|
|
$AttributeCollection.Add($Attributes)
|
|
$Values = @($Com=(New-Object -ComObject Shell.Application).NameSpace('C:\');1..400 | ForEach-Object {$com.GetDetailsOf($com.Items,$_)} | Where-Object {$_} | ForEach-Object {$_ -replace '\s'})
|
|
$AttributeValues = New-Object System.Management.Automation.ValidateSetAttribute($Values)
|
|
$AttributeCollection.Add($AttributeValues)
|
|
$DynParam1 = New-Object -Type System.Management.Automation.RuntimeDefinedParameter("ExtensionAttribute", [string[]], $AttributeCollection)
|
|
$ParamDictionary = New-Object -Type System.Management.Automation.RuntimeDefinedParameterDictionary
|
|
$ParamDictionary.Add("ExtensionAttribute", $DynParam1)
|
|
$ParamDictionary
|
|
}
|
|
|
|
begin {
|
|
$ShellObject = New-Object -ComObject Shell.Application
|
|
$DefaultName = $ShellObject.NameSpace('C:\')
|
|
$ExtList = 0..400 | ForEach-Object {
|
|
($DefaultName.GetDetailsOf($DefaultName.Items,$_)).ToUpper().Replace(' ','')
|
|
}
|
|
}
|
|
|
|
process {
|
|
foreach ($Object in $FullName) {
|
|
# Check if there is a fullname attribute, in case pipeline from Get-ChildItem is used
|
|
if ($Object.FullName) {
|
|
$Object = $Object.FullName
|
|
}
|
|
|
|
# Check if the path is a single file or a folder
|
|
if (-not (Test-Path -Path $Object -PathType Container)) {
|
|
$CurrentNameSpace = $ShellObject.NameSpace($(Split-Path -Path $Object))
|
|
$CurrentNameSpace.Items() | Where-Object {
|
|
$_.Path -eq $Object
|
|
} | ForEach-Object {
|
|
$HashProperties = @{
|
|
FullName = $_.Path
|
|
}
|
|
foreach ($Attribute in $MyInvocation.BoundParameters.ExtensionAttribute) {
|
|
$HashProperties.$($Attribute) = $CurrentNameSpace.GetDetailsOf($_,$($ExtList.IndexOf($Attribute.ToUpper())))
|
|
}
|
|
New-Object -TypeName PSCustomObject -Property $HashProperties
|
|
}
|
|
} elseif (-not $input) {
|
|
$CurrentNameSpace = $ShellObject.NameSpace($Object)
|
|
$CurrentNameSpace.Items() | ForEach-Object {
|
|
$HashProperties = @{
|
|
FullName = $_.Path
|
|
}
|
|
foreach ($Attribute in $MyInvocation.BoundParameters.ExtensionAttribute) {
|
|
$HashProperties.$($Attribute) = $CurrentNameSpace.GetDetailsOf($_,$($ExtList.IndexOf($Attribute.ToUpper())))
|
|
}
|
|
New-Object -TypeName PSCustomObject -Property $HashProperties
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
end {
|
|
Remove-Variable -Force -Name DefaultName
|
|
Remove-Variable -Force -Name CurrentNameSpace
|
|
Remove-Variable -Force -Name ShellObject
|
|
}
|
|
} |