Download - Deep dive formatting
How Do They Do That?Formatting with PowerShell
Thomas Lee
Agenda
• Review the basics• Composite Formatting and .ToString• Formatting with Format-tables• Using Format XML• EasyOutput (thanks James!)
• DEMOS!!
Who Am I
• Consultant/writer/trainer – living in the UK• Long time PowerShell MVP• 2 blogs– http://tfl09.blogspot.com – Under The Stairs– http://pshscripts.blogspot.com – PowerShell
Scripts Blog
Formatting by Default
• PowerShell formats output by default– controlled by *.PS1XML files– Some default rules if all else fails
• How Default Formatting Works– Objects in the pipeline - send to Out-Default– Out-Default looks at the objects in the pipeline– If formatting instructions – send to Out-Host– If objects - send to Format-List or Format-Table
Formatting Rules
• If format.ps1xml defines format for a type– Use that
• If not, does type.ps1xml define a default property set– Use that and the rules below
• Otherwise table vs list rules– 4 or less properties, output a table– 5 or more output a list
Format-Table and Format-List
Format-List/Format-Table take objects from pipeline Formats those objects
Default contents and ‘shape’ from .ps1xml You can override default properties
GWMI win32_ComputerSystem | fl name,model
Can also take a hash table for precise format control
Occurrence Type Drives Formatting
• An object’s type determine how PowerShell renders instances
• .PS1XML defines the format for many types– Others use the last resort rules (1-4/5+)
Other Stuff I Assume You Know
• Format-Wide and what it’s good for• The basic Format-Table and Format-List
cmdlets• The –autosize parameter on Format-Table– And the implications for larger result sets
• Out-GridView• Other Output mechanisms (XML, CSV, etc.3)
REVIEWING THE BASICSDemo 1
Formatting Strings
• You can use either– -f operator, and format values into a composite
formatting string“This is {0}, formatting with {1}” –f “fun” , ”PowerShell”
– Use .ToString() to format a single value
Composite Formatting String
• Format of anchor– {<number, width:formatspecifier>}– Eg {0, 10: n4}
• Formatting<string with anchors> -f <array of values>• Produces a formatted string of array values• $date=get-date• “Today, {0}, is {1}” –f $date.date, $date.dayofweek
.ToString()
All base types have a .ToString() method Inherited from [Object] Relied on to convert the object to a printable form Can take parameters!
Base types have power over how to format Pass format string in call to .ToString()
$i = 23.123456; $i.tostring("N2") 23.12
.NET Format String Reference
Numeric format strings http://msdn.microsoft.com/en-us/library/427bttx3(VS.71).
aspx
Date and time format strings http://msdn.microsoft.com/en-us/library/97x6twsz(VS.71).
aspx
FORMATTING STRINGS/.TOSTRING()Demo 2
Formatting with Hash Tables
Uses a Hash Table with pre-defined key names: Name (or Label) - <string> Expression - <string> or <script block> FormatString - <string> Width - <int32> Alignment (value can be "Left", "Center", or "Right")
Send FT/FL hash table vs a property name
Hash Table Example$Pn=@{label="Process Name";
Expression={$_.Name}; Alignment="right"}
$Cpu=@{label="CPU Cost"; Expression={($_.CPU) * 21;.23};
FormatString=“C3"}
Get-Process notepad| Format-Table $Pn,$Cpu -auto
FORMAT-TABLE WITH HASH TABLESDemo 3
Formatting and .PS1XML
Two types of ps1xml Define/update types - *.types.ps1xml Define/update formatting - *.format.ps1xml
Default Format XML shipped with PowerShell Apps or OS additions add to this default set Stored in $Pshome
Format driven by object's type
• Discover a variable’s type name(s)– $variable.PSTYPENAMES
• To add a type name– $variable.PSTYPENAMES.ADD(“new name”)
• To clear all type names– $variable.PSTYPENAMES.CLEAR()
Formatting XML
To change how PowerShell formats a type? Create XML file Define views: table, list , etc Run Update-FormatData to add new view
Add this to $profile to persist the changes
XML – Overall Structure <Name>
Identifies the name of the view. <ViewSelectedBy>
Specifies the object type or types to which the view applies.
<GroupBy>
Specifies how items in the view should be combined in groups.
<TableControl> <ListControl> <WideControl> <ComplexControl>
Contain the tags that specify how each item is displayed.
Consider A New TypeAdd-Type @'public class aeroplane{ public string Model = "Boeing 737"; public int InFleet = 12; public int Range = 2400; public int Pax = 135;}'@
But what about the display?
XML File Structure<?xml version="1.0" encoding="utf-8" ?><Configuration> <ViewDefinitions> <View> <Name> … </Name> <ViewSelectedBy> <TypeName> … </TypeName> </ViewSelectedBy>
<TableControl> … </TableControl> <ListControl> … </ListControl>
</ViewDefinitions></Configuration>
TableControl Definition
<TableControl> <TableHeaders> <TableColumnHeader> <label>Passengers Carried</label><width>20</width> </TableColumnHeader> … </TableHeaders> <TableRowEntries> <TableRowEntry> <tableColumnItem><PropertyName>Pax</PropertyName></tablecolumnitem> </TableRowEntry> … </TableRowEntries></TableControl>
ListControl<ListControl> <ListEntries> <ListEntry> <ListItems> <ListItem> <PropertyName>Model</PropertyName> </ListItem> … <ListItems> <ListEntry> </ListEntries></Listcontrol>
Sticking It Together
Author, then save XML Prior to use, update format data
Update-FormatData –Prepend <format file name>
• Consider this pattern of development– PowerShell– PowerShell– Test stuff and find bugs– Exit– Edit the XML– PowerShell– Do it again
DISPLAY XMLDemo 4
But wait
Building XML is hard, boring, and just plain work
Instead of DIY
Easy out Great add on module
EASY OUTDemo 5
Summary
Formatting can be simple or complex Lots of alternatives – have it your way Keep it simple and extend to meet your needs Use EZ-out if you are accessing obscure WMI
classes or using uncommon .NET types• Demo 5