有没有办法通过管道将输出分页到类似于 那些在 Linux Unix shell 中可用的的 more或 less命令?
more
less
more不习惯于 限制的输出,它习惯于 翻页的输出,如果有的话,它可以使终端更容易读取。
你是在说使用 head和 tail吗? 蛋头咖啡馆有一个例子:
head
tail
type my.txt | select-object -first 10 type my.txt | select-object -last 10
模拟 head和 tail。
嗯... 有“更多”,这是或多或少(...)相同,你会期望从其他平台。试试下面的例子:
dir -rec | more
Powershell 社区扩展有一个名为‘ less’的方便函数,它提供了一个更完整的 Unix 风格的特性集,使用 less. exe 的移植副本来实际处理分页。
您可以通过启动 管理层并运行:
Find-Package pscx | Install-Package -Force
(force是为了升级旧版本)
force
您可以将字符串通过管道传递给它,或者将文件名作为直接参数给出。
type foo.txt | less less foo.txt, bar.txt, baz.txt
它可以在 ConEmu 和 Powershell 窗口中工作,但不幸的是,它的工作方式与您在 v2.0 ISE 下期望的不一样。
是的:
some-cmdlet | out-host -paging
dir -rec | more是个糟糕的建议。
它将导致 powershell 在将整个命令输出到屏幕之前对其进行评估,而输出分页之类的事情并不需要这样做
在某些极端情况下,它可能导致系统崩溃(例如 dir 'C:\' | more)
dir 'C:\' | more
另一方面,使用 out-host -paging将在屏幕可用时将信息输出到屏幕上。
out-host -paging
我在缺省配置文件中添加了一个函数定义和别名 %SystemRoot%\system32\windowspowershell\v1.0\profile.ps1
%SystemRoot%\system32\windowspowershell\v1.0\profile.ps1
这个函数主要是基于 这是 Aman Dhally 的博客,增加了异常处理,用于在分页时按 Q。
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 等待完整的输出)。
dir -r | more
如果你有 VIM 安装,我非常喜欢 dir -r | vim -R -。不幸的是,这遇到了同样的问题与 more(即没有流)。
dir -r | vim -R -
我更喜欢“少”的命令,而不是“多”的命令。使用较少的命令,结果也可以向后分页,而不仅仅是向前分页。
适用于 Windows 的 Git的“少”对我有用 *
为了节省输入,我在 Powershell 配置文件(notepad $profile)中添加了别名“ l”,代表 less:
notepad $profile
Set-Alias -Name "l" -Value "${env:ProgramFiles(x86)}\Git\bin\less.exe"
在上面的路径中寻找 less或者 C:\Program Files\Git\usr\bin\less.exe或者类似的路径。
C:\Program Files\Git\usr\bin\less.exe
* : 我在 Powershell 使用 abc0版本的“ less”时犯了错误。
建议: 将文件放入临时/一次性文件夹。Txt 文件,然后让操作系统调用您喜欢的编辑器,该编辑器链接到。短信分机。
Get-Process | Out-File tem.txt; . tem.txt
注意: 每次使用这个命令时,都会覆盖任何已经存在的 tem.txt 文件。 明智地选择文件名。
以上只是一个基本的想法。 下一步是使用别名或配置文件函数等将其转换为“ | more”。
HTH, Marcelo Finkielsztein
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
cat C:\Temp\test.txt
Cat 是 Get-Content 的别名,对于较大的文件,您将在终端的底部获得—— More ——输出
您也可以添加-等待
cat C:\Temp\test.txt -wait
- wait 类似于使用 tail,但它实际上是重新运行命令,只是刷新输出
cat C:\Temp\test.txt | oh –Paging
主持人出局
我正好有这个问题(好吧,我想要的更少,而不是更多) ,发现@richard-berg 的答案对我很有用,对 PowerShell (但不是 Linux) ,我发现这个答案缺少的东西(对我来说)是: 我首先需要去: < br/> < br/> Find-Package pscx | Install-Package < br/> < br/> 我这样做了,但是必须在 Install-Package上使用 < br/> -AllowClobber参数。 然后为了减少使用,我不得不: < br/> < br/> Set-ExecutionPolicy RemoteSigned < br/> < br/> 这一切都奏效了: -)
Find-Package pscx | Install-Package
Install-Package
-AllowClobber
Set-ExecutionPolicy RemoteSigned
在我看来,最简单的做法是使用 独家新闻来安装您习惯于从 UNIX 使用的任何东西。一旦你做到了,只要运行 scoop install less,你就可以开始了。
scoop install less
另一种选择是通过 WSL使用较少的内容:
some-cmdlet | wsl less