Equivalent of 'more' or 'less' command in Powershell?
PowershellPowershell Problem Overview
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?
Powershell Solutions
Solution 1 - Powershell
Yes there is:
some-cmdlet | out-host -paging
Solution 2 - Powershell
Well... There is "more", which is more or less (...) the same you'd expect from other platforms. Try the following example:
dir -rec | more
Solution 3 - Powershell
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.
Solution 4 - Powershell
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)
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.
Solution 5 - Powershell
I 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".
Solution 6 - Powershell
PS> cd C:\
PS> dir -r -ex 0 | out-Host -paging
PS> dir -file -r -ea 0 c:\Windows | Select FullName,Length,LastWriteTime | out-gridview
Solution 7 - Powershell
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
.
Solution 8 - Powershell
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).
Solution 9 - Powershell
cat 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
Solution 10 - Powershell
If you have VIM installed, I thoroughly enjoy dir -r | vim -R -
. Unfortunately this suffers the same problem with more
(ie. no streaming).
Solution 11 - Powershell
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 :-)
Solution 12 - Powershell
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.
HTH, Marcelo Finkielsztein
Solution 13 - Powershell
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.