To complement Zilog80's helpful answer with background information:
Get-Command
help
reveals that help
is not a mere alias of the Get-Help
cmdlet, but a (built-in) function (submit $function:help
to see its definition).
As you've noticed yourself:
while Get-Help
outputs an object ([pscsustomobject]
) with properties that reflect help-topic metadata such as Category
, which is then rendered as display text by PowerShell's output-formatting system,
the help
function returns strings - a stream of text lines representing the rendered help topic - of necessity.
You can observe the difference in output type by piping to the Get-Member
cmdlet (help firewall | Get-Member
vs. Get-Help firewall | Get-Member
)
The purpose of the help
function is to wrap Get-Help
with interactive paging, to allow convenient navigation through lengthy help topics that don't fit onto a single console (terminal) screen.
This paging is provided via an external program (by default, more.com
on Windows, and less
on Unix-like platforms, configurable via $env:PAGER
, but only in PowerShell (Core) 7+), and since PowerShell only "speaks text" when communicating with external programs, help
must send a stream of strings (lines for display) to them, which it does via
Out-String
-Stream
.
Note:
When the external paging programs find that their stdout stream isn't connected to a console (terminal), they take no action other than simply passing the input through (in Unix terms, they then behave like cat
).
Hypothetically, the help
function itself could determine this condition and then (a) not pipe to the paging program and (b) relay the object output by Get-Help
as-is.[1] However, determining a command's output target from inside that command, using PowerShell code, may not even be possible.
[1] The function actually already takes this action when a custom pager defined via $env:PAGER
is found to be a PowerShell command rather than an external program.