During last couple of weeks I've spent most of my time developing PSWinDocumentation project. While building that I've came across different problems that needed solutions and consistent output. In this release 0.5.X I've addressed some of them and also built  what I call a building blocks. While not necessary a functionality of Word it allows me to easily built PSWinDocumentation with just one command.
While I'm not sure it will please everyone or will it be functional outside of my personal need it's there for you to use. Keep in mind that this will be further enhanced, changed so may need some revisits later on. Right now there are 5 functions but you should really worry about one…Â New-WordBlock.
Block is combination of multiple Word elements that can be added or not. Seems weird I know… but it's essentially a combination of multiple elements that play well together. For example a TOC Element, a TEXT and TABLE after it is one building block. But that building block doesn't have to have a TOC Element. It can be just TEXT and TABLE. It can also be a TOC, TEXT,TABLE, EMPTY PARAGRAPH, PAGE BREAK and CHART as one building block. In other words if you pass data to function you will get it displayed, if you don't… it will not appear. This allows you to create Word Document (docx) with documentation of your environment in no time. You want Text and a Table great – pass two variables and it's all good. But wait.. there's more. If you use TextNoData element it will display alternative text to the one you defined in Text field if TableData, ListData turns up empty. This allows you to build general documentation without actually knowing what will the output be.
It generally looks like this in code. One command.. that can generate multiple, different type of blocks.
$WordDocument | New-WordBlock ` -TocGlobalDefinition $Section.TocGlobalDefinition` -TocGlobalTitle $Section.TocGlobalTitle ` -TocGlobalSwitches $Section.TocGlobalSwitches ` -TocGlobalRightTabPos $Section.TocGlobalRightTabPos ` -TocEnable $Section.TocEnable ` -TocText $TocText ` -TocListLevel $Section.TocListLevel ` -TocListItemType $Section.TocListItemType ` -TocHeadingType $Section.TocHeadingType ` -TableData $TableData ` -TableDesign $Section.TableDesign ` -TableTitleMerge $Section.TableTitleMerge ` -TableTitleText $TableTitleText ` -TableMaximumColumns $Section.TableMaximumColumns ` -Text $Text ` -TextNoData $TextNoData ` -EmptyParagraphsBefore $Section.EmptyParagraphsBefore ` -EmptyParagraphsAfter $Section.EmptyParagraphsAfter ` -PageBreaksBefore $Section.PageBreaksBefore ` -PageBreaksAfter $Section.PageBreaksAfter ` -TextAlignment $Section.TextAlignment ` -ListData $ListData ` -ListType $Section.ListType ` -ListTextEmpty $Section.ListTextEmpty ` -ChartEnable $Section.ChartEnable ` -ChartTitle $ChartTitle ` -ChartKeys $ChartKeys ` -ChartValues $ChartValues ` -ListBuilderContent $ListBuilderContent ` -ListBuilderType $Section.ListBuilderType ` -ListBuilderLevel $Section.ListBuilderLevel
And those are just examples. Of course it takes a moment to get used to it but when it does…
Another addition is Format-TransposeTable function. Transpose (rotate) data is nicely described by Microsoft in their article here.
Now what the function does in PSWriteWord it allows you to easily convert any HashTable/OrderedDictionary to PSCustomObject and vice versa. How this is useful?
$myitems0 = @( [pscustomobject]@{name = "Joe"; age = 32; info = "Cat lover"}, [pscustomobject]@{name = "Sue"; age = 29; info = "Dog lover"}, [pscustomobject]@{name = "Jason another one"; age = 42; info = "Food lover" } ) $myitems0 | Format-Table -AutoSize $Transposed = Format-TransposeTable -Object $myitems0 $Transposed | Format-Table -AutoSize $TransposedBack = Format-TransposeTable -Object $Transposed $TransposedBack | Format-Table -AutoSize
And final output… (I know, I know it changed order… )
This allows you to easily create HashTables or OrderedDictionaries and still display them differently (which is useful for Word/Excel tables). This command is part of Add-WordTable with switch -Transpose
Import-Module PSWriteWord -Force Import-Module ActiveDirectory $FilePath = "$Env:USERPROFILE\Desktop\PSWriteWord-Example-Tables1.docx" # Get basic AD information $ADSnapshot = @{} $ADSnapshot.RootDSE = $( $Info = Get-ADRootDSE $Info | Select-Object ` @{label = 'Configuration Naming Context'; expression = { $_.configurationNamingContext }}, defaultNamingContext, dnsHostName, domainControllerFunctionality, domainFunctionality, forestFunctionality, supportedLDAPPolicies, subschemaSubentry, supportedLDAPVersion, supportedSASLMechanisms ) $ADSnapshot.ForestInformation = $( Get-ADForest | Select-Object DomainNamingMaster, Domains, ForestMode, Sites ) $ADSnapshot.DomainInformation = $(Get-ADDomain) # Get basic Ad information end Clear-Host $WordDocument = New-WordDocument $FilePath Add-WordText -WordDocument $WordDocument -Text "Active Directory Root DSE with Transpose" ` -FontSize 15 -CapsStyle smallCaps -Alignment both -Supress $True Add-WordParagraph -WordDocument $WordDocument -Supress $True Add-WordTable -WordDocument $WordDocument -DataTable $ADSnapshot.RootDSE ` -Design LightShading -Bold $true -Color Blue -Supress $True -Transpose Add-WordSection -WordDocument $WordDocument -PageBreak -Supress $True Add-WordText -WordDocument $WordDocument -Text "Active Directory Root DSE without Transpose" ` -FontSize 15 -CapsStyle smallCaps -Alignment both -Supress $True Add-WordParagraph -WordDocument $WordDocument -Supress $True Add-WordTable -WordDocument $WordDocument -DataTable $ADSnapshot.RootDSE ` -Design LightShading -Bold $true -Color Blue -Supress $True Add-WordSection -WordDocument $WordDocument -PageBreak -Supress $True Add-WordText -WordDocument $WordDocument -Text "Active Directory ", 'Domain', ' Forest Information' ` -FontSize 12, 12, 12 -StrikeThrough none, strike, none -Alignment center -Supress $True Add-WordParagraph -WordDocument $WordDocument -Supress $True Add-WordTable -WordDocument $WordDocument -DataTable $ADSnapshot.ForestInformation ` -Design LightShading -Italic $true, $false -Bold $true, $false -ContinueFormatting -Supress $True -Verbose Add-WordSection -WordDocument $WordDocument -PageBreak -Supress $True Add-WordText -WordDocument $WordDocument -Text "Active Directory Domain Information" ` -FontSize 15 -Color Green -Supress $True Add-WordParagraph -WordDocument $WordDocument -Supress $True Add-WordTable -WordDocument $WordDocument -DataTable $ADSnapshot.DomainInformation ` -Design LightShading -Supress $True -Transpose Add-WordPageBreak -WordDocument $WordDocument -Supress $True Add-WordTable -WordDocument $WordDocument -DataTable $ADSnapshot.DomainInformation ` -Design LightShading -Supress $True -Transpose ` -ExcludeProperty 'ComputersContainer', 'AllowedDNSSuffixes', 'Item', 'LinkedGroupPolicyObjects' #-Verbose Save-WordDocument $WordDocument -Language 'en-US' -Supress $True ### Start Word with file Invoke-Item $FilePath
It's clearly visible on the next screenshot (left HashTable), right Transpose (and Format-TransposeTable behind scenes) in action…
As you can see thanks to this option I was able to put far more data into Word Table than I would without it.
There were far more functionality changes… but it's been a while since I added them… so well I forgot 🙂 Enjoy this new release… and report bugs as always as there are surely some…