在 Powershell 等同于“多”还是“少”的命令?

有没有办法通过管道将输出分页到类似于 那些在 Linux Unix shell 中可用的moreless命令?

104376 次浏览

more不习惯于 限制的输出,它习惯于 翻页的输出,如果有的话,它可以使终端更容易读取。

你是在说使用 headtail吗? 蛋头咖啡馆有一个例子:

type my.txt | select-object -first 10


type my.txt | select-object -last 10

模拟 headtail

嗯... 有“更多”,这是或多或少(...)相同,你会期望从其他平台。试试下面的例子:

dir -rec | more

Powershell 社区扩展有一个名为‘ less’的方便函数,它提供了一个更完整的 Unix 风格的特性集,使用 less. exe 的移植副本来实际处理分页。

您可以通过启动 管理层并运行:

Find-Package pscx | Install-Package -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)

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

我在缺省配置文件中添加了一个函数定义和别名 %SystemRoot%\system32\windowspowershell\v1.0\profile.ps1

这个函数主要是基于 这是 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 等待完整的输出)。

如果你有 VIM 安装,我非常喜欢 dir -r | vim -R -。不幸的是,这遇到了同样的问题与 more(即没有流)。

我更喜欢“少”的命令,而不是“多”的命令。使用较少的命令,结果也可以向后分页,而不仅仅是向前分页。

适用于 Windows 的 Git的“少”对我有用 *

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

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

在上面的路径中寻找 less或者 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/> 这一切都奏效了: -)

在我看来,最简单的做法是使用 独家新闻来安装您习惯于从 UNIX 使用的任何东西。一旦你做到了,只要运行 scoop install less,你就可以开始了。

另一种选择是通过 WSL使用较少的内容:

some-cmdlet | wsl less