# encoding: ascii
# api: powershell
# title: Add-FormatTableIndexPara
# description: From Windows PowerShell Cookbook (O’Reilly) by Lee Holmes
# version: 0.1
# type: function
# author: Lee Holmes
# license: CC0
# function: Add-IndexParameter
# x-poshcode-id: 2129
# x-archived: 2016-05-17T10:50:27
# x-published: 2011-09-09T21:40:00
#
#
##############################################################################
##
## Add-FormatTableIndexParameter
##
## From Windows PowerShell Cookbook (O'Reilly)
## by Lee Holmes (http://www.leeholmes.com/guide)
##
##############################################################################
<#
.SYNOPSIS
Adds a new -IncludeIndex switch parameter to the Format-Table command
to help with array indexing.
.NOTES
This commands builds on New-CommandWrapper, also included in the Windows
PowerShell Cookbook.
.EXAMPLE
PS >$items = dir
PS >$items | Format-Table -IncludeIndex
PS >$items[4]
#>
Set-StrictMode -Version Latest
New-CommandWrapper Format-Table `
-AddParameter @{
@{
Name = 'IncludeIndex';
Attributes = "[Switch]"
} = {
function Add-IndexParameter {
begin
{
$psIndex = 0
}
process
{
## If this is the Format-Table header
if($_.GetType().FullName -eq `
"Microsoft.PowerShell.Commands.Internal." +
"Format.FormatStartData")
{
## Take the first column and create a copy of it
$formatStartType =
$_.shapeInfo.tableColumnInfoList[0].GetType()
$clone =
$formatStartType.GetConstructors()[0].Invoke($null)
## Add a PSIndex property
$clone.PropertyName = "PSIndex"
$clone.Width = $clone.PropertyName.Length
## And add its information to the header information
$_.shapeInfo.tableColumnInfoList.Insert(0, $clone)
}
## If this is a Format-Table entry
if($_.GetType().FullName -eq `
"Microsoft.PowerShell.Commands.Internal." +
"Format.FormatEntryData")
{
## Take the first property and create a copy of it
$firstField =
$_.formatEntryInfo.formatPropertyFieldList[0]
$formatFieldType = $firstField.GetType()
$clone =
$formatFieldType.GetConstructors()[0].Invoke($null)
## Set the PSIndex property value
$clone.PropertyValue = $psIndex
$psIndex++
## And add its information to the entry information
$_.formatEntryInfo.formatPropertyFieldList.Insert(
0, $clone)
}
$_
}
}
$newPipeline = { __ORIGINAL_COMMAND__ | Add-IndexParameter }
}
}