Is there a way to paginate output by piping it to a more or less command, similar to those that are available in Linux\Unix shells?
-
10For those who don't know less, some cool things about it is that you can go backwards, use arrows, use page up/down and even search using the key '/' and have the results highlighted.Constantino Cronemberger– Constantino Cronemberger2020-03-08 11:47:33 +00:00Commented Mar 8, 2020 at 11:47
15 Answers 15
Yes there is:
some-cmdlet | out-host -paging
oh is for Out-Host, and parameters can be abbreviated if there's no conflict, so the command could be Some-Cmdlet | oh -pWell... There is "more", which is more or less (...) the same you'd expect from other platforms. Try the following example:
dir -rec | more
dir -rec | more is bad advice.
It will cause powershell to evaluate the entire command prior to outputting it to the screen, something that is not needed for something like output paginating
In some extreme cases, it could cause the system to crash (e.g. dir 'C:\' | more)
On the other hand, using out-host -paging will output information to the screen as it is available.
out-host -paging works as desired. Piping through more when running the remote command is of no use: the entire text is displayed at once.out-host -paging is oh -pa.The Powershell Community Extensions have a handy function named 'less' that provides a more complete Unix-style feature set, using a ported copy of less.exe to actually handle the paging.
You can install it by starting an admin shell and running:
Find-Package pscx | Install-Package -Force
(the force is to upgrade older versions)
If you don't have the admin rights, you can install it for the current user :
Find-Package pscx | Install-Package -Force -scope currentuser -allowclobber
You can pipe strings to it, or give filenames as direct parameters.
type foo.txt | less
less foo.txt, bar.txt, baz.txt
It works in ConEmu and Powershell windows, but unfortunately it doesn't work the way you'd expect under the v2.0 ISE.
force is to upgrade older versions" seems a little bit misleading.Find-Package pscx | Install-Package -Force -scope currentuser -allowclobber-allowclobber seems to be required in current powershell versionsI prefer the "less" command over the "more" command. With the less command, results can also be paged backwards instead of just forwards.
The "less" from Git for Windows works for me*
To save typing I added the alias "l" for less in my Powershell profile (notepad $profile):
Set-Alias -Name "l" -Value "${env:ProgramFiles(x86)}\Git\bin\less.exe"
Look for less either in the above path or C:\Program Files\Git\usr\bin\less.exe or similar.
*: I had errors in Powershell with the Gow version of "less".
less fan here. But I get this error. Any advice? ________________________________________ PS C:\Users\oli> Get-Content tmpf | out-host 'C:\Program Files\Git\usr\bin\less.exe' Out-Host : A positional parameter cannot be found that accepts argument 'C:\Program Files\Git\usr\bin\less.exe'. At line:1 char:20 + Get-Content tmpf | out-host 'C:\Program Files\Git\usr\bin\less.exe' + CategoryInfo : InvalidArgument: (:) [Out-Host], ParameterBindingException + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.OutHostCommandAnother option is to use less through the WSL:
some-cmdlet | wsl less
more isn't used to limit output, it's used to paginate output and make it easier to read in a terminal, if anything.
Are you talking about using head and tail? EggHeadCafe has an example of:
type my.txt | select-object -first 10
type my.txt | select-object -last 10
to emulate head and tail.
head and tail in powershell now: stackoverflow.com/a/41626586/1081043cat C:\Temp\test.txt
cat is an alias for Get-Content - with larger files you will get the -- More -- output at the bottom of the terminal
You can also you can add -wait
cat C:\Temp\test.txt -wait
-wait is like using tail but it actually is rerunning the command just refreshing the output
cat C:\Temp\test.txt | oh –Paging
oh = Out-Host
The easiest/most elegant in-built way of paging output without relying on non-standard utilities is to pipe the output through the Out-Host utility. Usually, all output goes through this utility by default but, if manually specified, you can add the -Paging option that provides similar functionality to less or more under Unix-based OS:
Get-Content a_very_long_file.txt | Out-Host -Paging
PowerShell has many predefined aliases. In this case, this can be shortened to:
gc a_very_long_file.txt | oh -P
which means exactly the same (gc == Get-Content; oh == Output-Host)
To read more about the Out-Host utility:
Get-Help Out-Host
Comments
I added a function definition and alias to my default profile at
%SystemRoot%\system32\windowspowershell\v1.0\profile.ps1
This function is mostly based on this blog entry by Aman Dhally with added exception handling for pressing Q while paging.
function more2
{
param(
[Parameter(ValueFromPipeline=$true)]
[System.Management.Automation.PSObject]$InputObject
)
begin
{
$type = [System.Management.Automation.CommandTypes]::Cmdlet
$wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand(‘Out-Host’, $type)
$scriptCmd = {& $wrappedCmd @PSBoundParameters -Paging }
$steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin)
$steppablePipeline.Begin($PSCmdlet)
}
process
{
try
{
$steppablePipeline.Process($_)
}
catch
{
break;
}
}
end
{
$steppablePipeline.End()
}
#.ForwardHelpTargetName Out-Host
#.ForwardHelpCategory Cmdlet
}
New-Alias more more2
so I can just call it like dir -r | more and it immediately starts paged output because of PowerShell's pipeline (as opposed to waiting for the complete output with more.com).
I had exactly this question (well I wanted less, not more) and found the answer of @richard-berg worked for me, being new to PowerShell (but not to Linux), I found the things missing from that answer (for me) were:
I first needed to go:
Find-Package pscx | Install-Package
which then prompted for "installing nuget package". I did this but then had to use the -AllowClobber parameter on Install-Package.
then in order to use less, I had to:
Set-ExecutionPolicy RemoteSigned
which all worked :-)
The easiest thing to do in my opinion is to use Scoop to install anything you're used to using from UNIX. Once you do, just run scoop install less and you're good to go.
Comments
Suggestion: Put the file into a temporary/disposable .txt file, then let the OS invoke your favorite editor, the one that is linked to the .txt extension.
Get-Process | Out-File temp.txt ; .\temp.txt
Note: each time you use this you will overwrite any pre-existent temp.txt file. Pick the file name wisely.
The above is just a basic idea.
Next step would be transforming this into | more using aliases or profile functions, etc.