【发布时间】:2010-11-07 21:55:00
【问题描述】:
有没有办法通过管道将输出分页到more 或less 命令,类似于those that are available in Linux\Unix shells?
【问题讨论】:
-
对于那些不了解的人来说,一些很酷的事情是你可以向后退,使用箭头,使用向上/向下翻页,甚至使用键'/'搜索并得到结果突出显示。
标签: powershell
有没有办法通过管道将输出分页到more 或less 命令,类似于those that are available in Linux\Unix shells?
【问题讨论】:
标签: powershell
是的,有:
some-cmdlet | out-host -paging
【讨论】:
less 只是一个大型文本查看器应用程序,它接受 stdin 的文本。您可以将其通过管道传输到一个临时文件并在nano 或vim 中打开它以获得 EVEN MOAR POWERRRR!不是重点。 PowerShell 就像bash(但更好,恕我直言)。 less 不在bash 中;它是一个单独的二进制文件。所以你的批评是无效的。
oh是Out-Host,如果没有冲突,参数可以缩写,所以命令可以是Some-Cmdlet | oh -p
嗯...有“更多”,这或多或少(...)与您对其他平台的期望相同。试试下面的例子:
dir -rec | more
【讨论】:
dir -rec | more 是个坏建议。
这将导致 powershell 在将整个命令输出到屏幕之前对其进行评估,这对于输出分页之类的东西来说是不需要的
在某些极端情况下,可能会导致系统崩溃(例如dir 'C:\' | more)
另一方面,使用out-host -paging 会将可用的信息输出到屏幕。
【讨论】:
out-host -paging 的管道可以按需要工作。运行远程命令时通过more 管道是没有用的:整个文本一次显示。
out-host -paging 的别名是oh -pa。
Powershell Community Extensions 有一个名为“less”的便捷函数,它提供了更完整的 Unix 风格的功能集,使用 less.exe 的移植副本来实际处理分页。
您可以通过启动 admin shell 并运行来安装它:
Find-Package pscx | Install-Package -Force
(force是升级旧版本)
您可以通过管道将字符串传递给它,或者将文件名作为直接参数。
type foo.txt | less
less foo.txt, bar.txt, baz.txt
它在 ConEmu 和 Powershell 窗口中工作,但不幸的是,它在 v2.0 ISE 下无法正常工作。
【讨论】:
force 是升级旧版本”似乎有点误导。
Find-Package pscx | Install-Package -Force -scope currentuser -allowclobber
我更喜欢“less”命令而不是“more”命令。使用 less 命令,结果也可以向后而不是向前翻页。
Git for Windows 中的“更少”对我有用*
为了节省输入,我在我的 Powershell 配置文件 (notepad $profile) 中为 less 添加了别名“l”:
Set-Alias -Name "l" -Value "${env:ProgramFiles(x86)}\Git\bin\less.exe"
在上述路径或C:\Program Files\Git\usr\bin\less.exe 或类似路径中查找less。
*:我在 Powershell 中遇到了 Gow 版本的“less”错误。
【讨论】:
less 粉丝。但我得到这个错误。有什么建议吗? _______________________________________ 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.OutHostCommand
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
【讨论】:
more 不用于限制输出,它用于分页输出并使其更容易在终端中阅读(如果有的话)。
您是在谈论使用head 和tail 吗? EggHeadCafe 有一个例子:
type my.txt | select-object -first 10
type my.txt | select-object -last 10
模拟head 和tail。
【讨论】:
head 和 tail:stackoverflow.com/a/41626586/1081043
我在默认配置文件中添加了函数定义和别名
%SystemRoot%\system32\windowspowershell\v1.0\profile.ps1
这个函数主要基于this blog entry by Aman Dhally,增加了在分页时按下Q的异常处理。
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
所以我可以像 dir -r | more 一样调用它,并且由于 PowerShell 的管道,它立即开始分页输出(而不是等待 more.com 的完整输出)。
【讨论】:
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
哦 = 主机外
【讨论】:
如果你安装了 VIM,我非常喜欢dir -r | vim -R -。不幸的是,more 也存在同样的问题(即没有流式传输)。
【讨论】:
我确实有这个问题(好吧,我想要更少,而不是更多)并发现@richard-berg 的答案对我有用,对 PowerShell(但不是 Linux)是新手,我发现该答案中缺少的东西(对我来说)是:
我首先需要去:Find-Package pscx | Install-Package
然后提示“安装nuget包”。我这样做了,但后来不得不在 Install-Package 上使用 -AllowClobber 参数。
然后为了少用,我不得不:Set-ExecutionPolicy RemoteSigned
这一切都奏效了:-)
【讨论】:
建议:将文件放入临时/一次性 .txt 文件,然后让操作系统调用您喜欢的编辑器,即链接到 .txt 扩展名的编辑器。
获取进程 |输出文件 temp.txt ; .\temp.txt
注意:每次使用它时,您都会覆盖任何预先存在的 temp.txt 文件。 明智地选择文件名。
以上只是一个基本的想法。
下一步将使用别名或配置文件函数等将其转换为“|更多”。
HTH, 马塞洛·芬基尔斯泰因
【讨论】:
在我看来,最简单的做法是使用Scoop 从 UNIX 安装您习惯使用的任何东西。完成后,只需运行 scoop install less 即可。
【讨论】: