# encoding: ascii
# api: powershell
# title: Select w/ subproperties
# description: Allows to use dots to specify object subproperties in Select-Object.
# version: 0.1
# type: function
# author: Dmitry Sotnikov
# license: CC0
# function: Select-Object
# x-poshcode-id: 1606
# x-archived: 2015-05-06T16:11:00
# x-published: 2010-01-25T04:38:00
#
# For example:
# Set-Process | Select-Object ProcessName, StartTime.DayOfWeek
# This is the only changed behavior (properties with dots get evaluated as expressions) – everything else stays intact.
# For more information see:
# http://dmitrysotnikov.wordpress.com/2010/01/25/select-object-with-subproperties
#
<#
This is a proxy function enhancing Select-Object by adding the
ability to use subproperties in the Property parameters.
For example:
Set-Process | Select-Object ProcessName, StartTime.DayOfWeek
This is the only changed behavior (properties with dots
get evaluated as expressions) - everything else stays intact.
For more information see:
http://dmitrysotnikov.wordpress.com/2010/01/25/select-object-with-subproperties
#>
function Select-Object {
[CmdletBinding(DefaultParameterSetName='DefaultParameter')]
param(
[Parameter(ValueFromPipeline=$true)]
[System.Management.Automation.PSObject]
${InputObject},
[Parameter(ParameterSetName='DefaultParameter', Position=0)]
[System.Object[]]
${Property},
[Parameter(ParameterSetName='DefaultParameter')]
[System.String[]]
${ExcludeProperty},
[Parameter(ParameterSetName='DefaultParameter')]
[System.String]
${ExpandProperty},
[Switch]
${Unique},
[Parameter(ParameterSetName='DefaultParameter')]
[ValidateRange(0, 2147483647)]
[System.Int32]
${Last},
[Parameter(ParameterSetName='DefaultParameter')]
[ValidateRange(0, 2147483647)]
[System.Int32]
${First},
[Parameter(ParameterSetName='DefaultParameter')]
[ValidateRange(0, 2147483647)]
[System.Int32]
${Skip},
[Parameter(ParameterSetName='IndexParameter')]
[ValidateRange(0, 2147483647)]
[System.Int32[]]
${Index})
begin
{
try {
$outBuffer = $null
if ($PSBoundParameters.TryGetValue('OutBuffer', [ref]$outBuffer))
{
$PSBoundParameters['OutBuffer'] = 1
}
#region: Dmitry Sotnikov: substitute dotted properties with expressions
if ($Property -ne $null) {
# Iterate through properties and substitute those with dots
$NewProperty = @()
foreach ( $prop in $Property ) {
if ($prop.GetType().Name -eq 'String') {
if ($prop.Contains('.')) {
[String] $exp = '$_.' + $prop
$prop = @{Name=$prop; Expression = {Invoke-Expression ($exp)}}
}
}
$NewProperty += $prop
}
$PSBoundParameters['Property'] = $NewProperty
}
#endregion
$wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Select-Object',
[System.Management.Automation.CommandTypes]::Cmdlet)
$scriptCmd = {& $wrappedCmd @PSBoundParameters }
$steppablePipeline =
$scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin)
$steppablePipeline.Begin($PSCmdlet)
} catch {
throw
}
}
process
{
try {
$steppablePipeline.Process($_)
} catch {
throw
}
}
end
{
try {
$steppablePipeline.End()
} catch {
throw
}
}
<#
.ForwardHelpTargetName Select-Object
.ForwardHelpCategory Cmdlet
#>
}