在Powershell中,类似于'more'或'less'命令的等效命令是什么?

160

9
对于那些不了解 Less 的人,它的一些酷炫之处在于您可以向后滚动、使用箭头、使用页面上/下键,甚至可以使用键盘上的 "/" 进行搜索,并且搜索结果会被高亮显示。 - Constantino Cronemberger
15个回答

144
有的,命令如下:some-cmdlet | out-host -paging

1
我以前使用过more和less,但都不够用户友好。我发现这种变化比其他的更有用。非常感谢。 - TheXenocide
16
请注意,在 PowerShell ISE 中不支持 Out-Host 的 -Paging 参数。 - Martin Hollingsworth
@BrunoBrant 这不是重点。你可以将输出导向任何地方;less只是一个大型文本查看器应用程序,它接受文本的stdin。你可以将其导向临时文件,并在nanovim中打开它以获得更多的功能!这不是重点。PowerShell就像bash(但更好,我个人认为)。less不在bash中;它是一个单独的二进制文件。因此,你的批评是无效的。 - Alan McBee
14
同时,请评论以下答案:别名oh代表Out-Host,如果没有冲突,参数可以缩写,因此命令可以是Some-Cmdlet | oh -p该答案指出,命令别名ohOut-Host 的缩写,而且在没有冲突的情况下,参数可以使用缩写方式。因此,Some-Cmdlet | oh -p 命令中的 -p 参数使用了缩写形式。 - Alan McBee
1
@TheXenocide,out-host -paging比其他命令更有用/易用吗? - brendan
显示剩余7条评论

106

嗯...还有"更多",这与其他平台上的预期大致相同。请尝试以下示例:

dir -rec | more

2
more 函数正是这样做的,当你查看带有 gcm more|select Definition|fl 的函数定义时。 - Joey
3
实际上,将内容通过管道传输到more命令与将内容通过"out-host -paging"命令传输是相同的,尽管它们的执行方式不同。然而,在实践中两者之间几乎没有区别。 - Jouni Heikniemi
2
有趣!对我来说,gcm返回了两个定义,一个是一个PowerShell函数,当给定一个空参数时,执行"$input | out-host -p",这就是我在gci -rec | more上看到的行为。另一方面,当我用gci -rec | more.com时,我得到了正常的more.com行为。在安装了PS2的W7 RC上,即使只输入"more",我似乎也会得到more.com。在安装了PS1的Vista上,出现了上述描述的行为。根据http://huddledmasses.org/powershell-power-user-tips-get-command-precedence/,你难道不认为该函数在W7上也应该被执行吗?嗯... - Jouni Heikniemi
1
抱歉,这段写得不是很好。我的意思是,在带有PowerShell 1 的Vista上,将管道输出到“more”只会调用Out-Host -p,而在带有PowerShell 2的W7上,它会调用more.com。 - Jouni Heikniemi
1
抱歉,我改正了。是的,在PS 1中它调用的是Out-Host -p,而不是more.com(自己注意:即使看起来非常相似,也要阅读整个函数)。 - Joey
显示剩余3条评论

46

dir -rec | more 是错误的建议。

它会导致 Powershell 在将其输出到屏幕之前评估整个命令,对于像输出分页这样的操作是不必要的。

在某些极端情况下,它可能会导致系统崩溃(例如,dir 'C:\' | more)。

另一方面,使用 out-host -paging 将会在信息可用时将其输出到屏幕上。


3
当您使用远程PowerShell并希望通过分页器管道传输远程Windows服务器上的命令时,通过out-host -paging进行管道传输可以按预期工作。在运行远程命令时通过more进行管道传输是无用的:整个文本会一次性显示。 - IllvilJa
12
out-host -paging 的别名是 oh -pa - Josh

42

Powershell社区扩展有一个方便的函数名为“less”,提供了更完整的类Unix特性集,使用移植的less.exe来处理分页。

您可以通过启动管理员Shell并运行以下命令来安装它:

Find-Package pscx | Install-Package -Force

(该 force 是为了升级旧版本)

您可以将字符串传输到其中,也可以直接将文件名作为参数传递。

type foo.txt | less
less foo.txt, bar.txt, baz.txt

它可以在ConEmu和Powershell 窗口中工作,但不幸的是,在v2.0 ISE下它不能像你期望的那样工作。


9
这个安装会覆盖几个基本的Powershell命令(gcb、Expand-Archive、Format-Hex、Get-Hash、help、prompt、Get-Clipboard、Get-Help、Set-Clipboard),因此说“force是为了升级旧版本”似乎有一点误导。 - TNT
2
只需为当前用户安装,无错误或警告即可使用:Find-Package pscx | Install-Package -Force -scope currentuser -allowclobber - Andreas Covidiot
感谢您提供的绝妙提示! - Rui Craveiro
“-allowclobber” 在当前的 PowerShell 版本中似乎是必需的。 - Zach W

26

相较于“more”命令,我更喜欢使用“less”命令。因为使用“less”命令可以向前或向后翻页结果。

Git for Windows中的“less”命令对我很有效*

为了节省输入,我在我的Powershell配置文件(notepad $profile)中添加了别名“l”来代替less命令:

Set-Alias -Name "l" -Value "${env:ProgramFiles(x86)}\Git\bin\less.exe"

在上述路径或类似路径C:\Program Files\Git\usr\bin\less.exe中查找less


*: 我在使用 Gow 版本的“less”时,遇到了Powershell错误。


2
我也是。除了向后翻页之外,less 还允许我在结果上执行文本搜索(斜杠,然后输入文本,然后按回车键,然后按“n”查看下一个结果,“p”查看上一个结果)。非常非常方便。 - Rui Craveiro
这里又是一个 less 的粉丝。但我遇到了这个错误。有什么建议吗? Out-Host:找不到接受参数“C:\Program Files\Git\usr\bin\less.exe”的位置参数。 在行:1 字符:20 + Get-Content tmpf | out-host 'C:\Program Files\Git\usr\bin\less.exe' + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [Out-Host],ParameterBindingException + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.OutHostCommand``` - olisteadman
@olisteadman,这是less.exe的官方Git版本。您尝试过Git for Windows https://gitforwindows.org/版本的less吗? - Josh
3
将$env:PAGER设置为"C:\cygwin64\bin\less.exe"是个好主意,这样当你键入"help"时就会使用它。 - Constantino Cronemberger
作为 Git 的 core.pager 配置非常好用! - marcelocra
显示剩余2条评论

6
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

5
more 不是用来限制输出的,而是用来分页输出并使终端读取更加容易的。如果有必要的话。
你是在谈论使用 headtail 吗? EggHeadCafe 有一个示例:
type my.txt | select-object -first 10

type my.txt | select-object -last 10

模拟 headtail


管道对于大文件来说非常慢。现在有更好的方法(内置选项)在PowerShell中执行headtail操作:https://dev59.com/iWkw5IYBdhLWcg3wu9Fg#41626586 - wisbucky

3

另一个选项是通过WSL使用less:

some-cmdlet | wsl less

1
请注意,这仅适用于您的默认WSL分发是WSL1。WSL2分发会遇到这些 两个 Github问题提到的问题。您也可以在命令行中手动指定WSL1分发,使用“-d <distro>”参数。 - NotTheDr01ds

2
如果您已经安装了VIM,我非常喜欢使用dir -r | vim -R -命令。不幸的是,它与more一样存在流媒体问题。

2
cat C:\Temp\test.txt

cat是Get-Content的别名 - 当处理大文件时,会在终端底部输出 -- More -- 信息

你也可以添加-wait参数

cat C:\Temp\test.txt -wait 

-wait类似于使用tail命令,但它实际上是重新运行命令,只刷新输出。
cat C:\Temp\test.txt | oh –Paging

oh = 输出-主机


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接