Write-FormatViewExpression.ps1
function Write-FormatViewExpression { <# .Synopsis Writes a Format XML View Expression .Description Writes an expression for a Format .PS1XML. Expressions are used by custom format views and controls to conditionally display content. #> [CmdletBinding(DefaultParameterSetName='ScriptBlock')] [OutputType([string])] param( # The name of the control. If this is provided, it will be used to display the property or script block. [Parameter(ValueFromPipelineByPropertyName=$true)] [Alias('ActionName','Name')] [String] $ControlName, # If a property name is provided, then the custom action will show the contents # of the property [Parameter(Mandatory=$true,ParameterSetName='Property',Position=0,ValueFromPipelineByPropertyName=$true)] [Alias('PropertyName')] [String] $Property, # If a script block is provided, then the custom action shown in formatting # will be the result of the script block. [Parameter(Mandatory=$true,ParameterSetName='ScriptBlock',Position=0,ValueFromPipelineByPropertyName=$true)] [ScriptBlock] $ScriptBlock, # If provided, will make the expression conditional. -If it returns a value, the script block will run [Parameter(ValueFromPipelineByPropertyName=$true)] [Alias('ItemSelectionCondition')] [ScriptBlock] $If, # If provided, will output the provided text. All other parameters are ignored. [Parameter(Mandatory=$true,ParameterSetName='Text',ValueFromPipelineByPropertyName=$true)] [string] $Text, # If provided, will output a <NewLine /> element. All other parameters are ignored. [Parameter(Mandatory=$true,ParameterSetName='NewLine',ValueFromPipelineByPropertyName=$true)] [switch] $Newline, # If provided, will output the format using this format string. [string] $FormatString, # If this is set, collections will be enumerated. [Parameter(ValueFromPipelineByPropertyName=$true)] [Alias('EnumerateCollection')] [Switch] $Enumerate, # If provided, will display the content using the given foreground color. # This will only be displayed on hosts that support rich color. [Alias('FG', 'ForegroundColour')] [string] $ForegroundColor, # If provided, will display the content using the given background color. # This will only be displayed on hosts that support rich color. [Alias('BG', 'BackgroundColour')] [string] $BackgroundColor) process { # If this is calling itself recursively in ScriptBlock if ($ScriptBlock -and $ScriptBlock -like "*$($MyInvocation.MyCommand.Name)*") { & $ScriptBlock # run the script and return. return } if ($Newline) { return "<NewLine/>" } if ($ForegroundColor -or $BackgroundColor -or $Bold -or $Underline) { $colorize = [ScriptBlock]::Create(". `$SetOutputStyle -ForegroundColor '$ForeGroundColor' -BackgroundColor '$BackgroundColor' $(if ($Bold) { '-Bold' }) $(if ($Underline) { '-Underline'})") Write-FormatViewExpression -ScriptBlock $colorize } $ControlChunk = if ($ControlName) { "<CustomControlName>$([Security.SecurityElement]::Escape($ControlName))</CustomControlName>" } $EnumerationChunk = if ($Enumerate) { '<EnumerateCollection/>' } else { '' } $formatChunk = if ($FormatString) { "<FormatString>$([Security.SecurityElement]::Escape($FormatString))</FormatString>"} if ($Text) { "<Text>$([Security.SecurityElement]::Escape($Text))</Text>" } else { @" <ExpressionBinding> $(if ($If) { "<ItemSelectionCondition><ScriptBlock>$([Security.SecurityElement]::Escape($if))</ScriptBlock></ItemSelectionCondition>" }) $(if ($Property) { "<PropertyName>$([Security.SecurityElement]::Escape($Property))</PropertyName>" }) $(if ($ScriptBlock) { "<ScriptBlock>$([Security.SecurityElement]::Escape($ScriptBlock))</ScriptBlock>"}) $EnumerationChunk $formatChunk $ControlChunk </ExpressionBinding> "@ } if ($ForegroundColor -or $BackgroundColor -or $Bold -or $Underline) { $(Write-FormatViewExpression -ScriptBlock ([ScriptBlock]::Create('. $ClearOutputStyle'))) } } } |