Converting PowerShell data into an HTML report and save it to disk with no need for extra pipeline has long been my dream. Unfortunately, there’s no native Export-HTML
cmdlet (unlike, say, Export-CSV
), and ConvertTo-HTML
does not have -Path
parameter and only displays the html code on the screen (very useful ;)) unless you pipe it to Out-File
.
So being inspired by Kirk adding parameters to Import-CSV and using PowerShell 2.0 code-snippets, I created my Export-HTML
function, which behaves exactly like ConvertTo-HTML
but adds optional -Path parameter to specify the output file.
Download it, copy/paste the function into PowerShell (or dot-source it, or include it in your PowerShell profile) and you will be able to do something like:
Get-Process | Export-Html -Path C:\pr.htm or Get-Process | Export-Html C:\pr.htm -Title ‘My Processes’ or Get-Process | Export-Html C:\pr.htm -Property Name, Handles -Title ‘My Processes’
You can download the code here, or copy/paste it from the text below.
You may also consider renaming the function name from Export-HTML to ConvertTo-HTML (or use set-alias to make them the same thing), because the -Path parameter is optional, and old behavior of outputting HTML code to the console/pipeline is supported as well as all native parameters.
Here’s how I created this proxy function:
- Downloaded and installed PowerShell 2.0 code snippets.
- Used the function (proxy) snippet to generate the proxy for
ConvertTo-
.
HTML - Added Path to the parameters section:
- Added a variable to store modified PowerShell code to be executed:
- Added parameter handling in which I (if Path is present) append the Out-File code to the pipeline:
- Got the original command-line for ConvertTo-HTML
- And added this new pipeline to it:
[Parameter(Position=0)] [Alias('PSPath', 'FilePath')] [ValidateNotNullOrEmpty()] [System.String] ${Path},
$scriptCmdPipeline = ''
if ($Path) { $PSBoundParameters.Remove('Path') | Out-Null $scriptCmdPipeline += " | Out-File -FilePath $Path" }
$scriptCmd = {& $wrappedCmd @PSBoundParameters}
$scriptCmd = $ExecutionContext.InvokeCommand.NewScriptBlock( [string]$scriptCmd + $scriptCmdPipeline )
The rest was handled by the code snippet.
Here’s the resultant code:
#Requires -Version 2.0 <# Export-Html behaves exactly like native ConvertTo-HTML However it has one optional parameter -Path Which lets you specify the output file: e.g. Get-Process | Export-Html C:\temp\processes.html #> function Export-Html { [CmdletBinding(DefaultParameterSetName='Page')] param( [Parameter(ValueFromPipeline=$true)] [System.Management.Automation.PSObject] ${InputObject}, # Adding Path parameter # (made it Position 0, and incremented Position for others) [Parameter(Position=0)] [Alias('PSPath', 'FilePath')] [ValidateNotNullOrEmpty()] [System.String] ${Path}, [Parameter(Position=1)] [ValidateNotNullOrEmpty()] [System.Object[]] ${Property}, [Parameter(ParameterSetName='Page', Position=4)] [ValidateNotNullOrEmpty()] [System.String[]] ${Body}, [Parameter(ParameterSetName='Page', Position=2)] [ValidateNotNullOrEmpty()] [System.String[]] ${Head}, [Parameter(ParameterSetName='Page', Position=3)] [ValidateNotNullOrEmpty()] [System.String] ${Title}, [ValidateSet('Table','List')] [ValidateNotNullOrEmpty()] [System.String] ${As}, [Parameter(ParameterSetName='Page')] [Alias('cu','uri')] [ValidateNotNullOrEmpty()] [System.Uri] ${CssUri}, [Parameter(ParameterSetName='Fragment')] [ValidateNotNullOrEmpty()] [Switch] ${Fragment}, [ValidateNotNullOrEmpty()] [System.String[]] ${PostContent}, [ValidateNotNullOrEmpty()] [System.String[]] ${PreContent}) begin { try { $outBuffer = $null if ($PSBoundParameters.TryGetValue('OutBuffer', [ref]$outBuffer)) { $PSBoundParameters['OutBuffer'] = 1 } $wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('ConvertTo-Html', [System.Management.Automation.CommandTypes]::Cmdlet) # define string variable to become the target command line #region Initialize helper variable to create command $scriptCmdPipeline = '' #endregion # add new parameter handling #region Process and remove the Path parameter if it is present if ($Path) { $PSBoundParameters.Remove('Path') | Out-Null $scriptCmdPipeline += " | Out-File -FilePath $Path" } #endregion $scriptCmd = {& $wrappedCmd @PSBoundParameters} # redefine command invocation #region Append our pipeline command to the wrapped command script block $scriptCmd = $ExecutionContext.InvokeCommand.NewScriptBlock( [string]$scriptCmd + $scriptCmdPipeline ) #endregion $steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin) $steppablePipeline.Begin($PSCmdlet) } catch { throw } } process { try { $steppablePipeline.Process($_) } catch { throw } } end { try { $steppablePipeline.End() } catch { throw } } <# .ForwardHelpTargetName ConvertTo-Html .ForwardHelpCategory Cmdlet #>}
Hope you find this useful and it gets you the feature you wanted without waiting for PowerShell v3. 😉
Tags: ConvertTo-HTML, Examples, Export-HTML, PowerGUI, PowerShell, PowerShell v2, Proxy functions, cmdlets
1 Response to “Add filepath to ConvertTo-HTML”