等价于Powershell中的“更多”或“更少”命令?


Answers:


65

好吧……这里有“更多”,它与您从其他平台获得的期望差不多。请尝试以下示例:

dir -rec | more

1
当您使用gcm来查看函数的定义时,more确实可以做到这一点more | select Definition | fl
Joey

2
实际上,传递给more等于传递给“外部主机分页”,这与more.com实现是分开的。在实践中,没有明显的区别。
Jouni Heikniemi,2009年

1
有趣!对我来说,gcm还返回两个定义,一个是PowerShell函数,当给定一个空参数时,它将执行“ $ input | out-host -p”,这是我在gci -rec |上看到的行为。更多。另一方面,当我执行gci -rec | more.com,我得到了正常的more.com行为。在安装了PS2的W7 RC上,即使只键入“更多”,我似乎也能获得more.com。在带有PS1的Vista上,会发生上述行为。基于huddledmasses.org/…,您不认为该功能也应在W7上执行吗?嗯...
Jouni Heikniemi

1
抱歉,写得不好。因此,我的观点是,在带有PowerShell 1的Vista上,仅将“更多”管道传递给Out-Host -p,而在带有PowerShell 2的W7上,它将调用more.com。
Jouni Heikniemi,2009年

1
嗯,我纠正了。抱歉。是的,确实,在PS 1中,它调用Out-Host -p,而不是more.com(自我注意:即使看起来非常相似,也要始终阅读整个功能)
Joey

102

就在这里:

some-cmdlet | out-host -paging


之前,我已经使用了越来越少的东西,但都没有达到我认为应该的用户友好程度。我发现这种变化比其他变化更有用/更有用。非常感谢。
TheXenocide 2010年

对于打印非常大的文件的内容,这对我来说非常有效,因为Get-Content cmdlet立即开始将内容通过管道传输到主机外cmdlet。
赫尔曼

13
请注意,PowerShell ISE不支持Out-Host的-Paging参数。
Martin Hollingsworth

@BrunoBrant这不是重点。您可以将输出传递给任何东西。less只是一个接受文本的大型文本查看器应用程序stdin。您可以将其管到一个临时文件,并在打开nanovim甚至MOAR POWERRRR!不是重点。PowerShell就像bash(但更好,恕我直言)。less不在bash; 这是一个单独的二进制文件。因此,您的批评是无效的。
艾伦·麦克比

7
另外,请对答案进行评论:别名ohOut-Host,如果没有冲突,则可以缩写参数,因此命令可以是Some-Cmdlet | oh -p
Alan McBee-MSFT

33

dir -rec | more 是不好的建议。

这将使powershell在将整个命令输出到屏幕之前先评估整个命令,这对于输出分页等操作是不需要的

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

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


2
当您使用远程Powershell并希望通过寻呼机将远程Windows服务器上的命令通过管道传输时,可以按需进行管道传输 out-host -pagingmore运行远程命令时管道传输没有用:整个文本立即显示。
IllvilJa

5
的别名out-host -pagingoh -pa
2015年

26

PowerShell的社区扩展有一个名为“少”一个方便的功能,它提供了更完整的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下的预期运行。


5
该安装将覆盖几个基本的Powershell命令(gcb,Expand-Archive,Format-Hex,Get-Hash,help,提示,Get-Clipboard,Get-Help,Set-Clipboard),因此说“这force是升级较旧版本”似乎有点误导。
TNT

只是为当前用户安装而没有错误或警告使用:Find-Package pscx | Install-Package -Force -scope currentuser -allowclobber
Andreas Dietrich

感谢您的提示!
Rui Craveiro

7

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

Git for Windows中的“ less” 对我有用(我的路径是C:\Program Files (x86)\Git\usr\less.exe。使用Gow版本的“ less” 在Powershell中出现错误。

例:

ls|less

为了节省类型,我在Powershell配置文件中添加了别名“ l”,以减少内容:

sal l "C:\Program Files (x86)\Git\bin\less.exe"


2
我也是。除了向后分页外,less允许我对结果执行文本搜索(正斜杠,然后键入文本,然后按Enter,然后按“ n”表示下一个结果,“ p”表示上一个结果)。非常非常方便。
Rui Craveiro

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
奥利斯特曼'19

@olisteadman,这是less.exe的正式Git版本。您是否尝试过Git for Windows的gitforwindows.org以下版本?
乔什

无需使用“外部主机”。我用这个:“获取内容tmpf | C:\ cygwin64 \ bin \ less.exe”
Constantino Cronemberger

1
设置$ env:PAGER =“ C:\ cygwin64 \ bin \ less.exe”也是一个很好的主意,例如,当您键入“ help”时将使用它
Constantino Cronemberger

4
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

3

more不用于限制输出,而是用于对输出进行分页并使其更易于在终端中读取(如果有)。

您在谈论使用headtail吗? EggHeadCafe有以下示例:

type my.txt | select-object -first 10

type my.txt | select-object -last 10

模仿headtail


对于大文件,管道非常慢。有更好的方法(内置选项)做headtail现在在PowerShell中:stackoverflow.com/a/41626586/1081043
wisbucky

2

我在默认配置文件中添加了功能定义和别名 %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提供完整的输出)。


1

如果您已安装VIM,我将非常满意dir -r | vim -R -。不幸的是,这遭受了相同的问题more(即,没有流)。


1
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

哦=外主机


1

我恰好有这个问题(我想要更少,而不是更多),发现@ richard-berg的答案对我有用,对PowerShell(不是Linux)很陌生,我发现了这个答案中缺少的东西(对我来说)是:我首先需要去:

Find-Package pscx | Install-Package

然后提示“安装nuget软件包”。我这样做了,但随后不得不在上使用
-AllowClobber参数Install-Package

然后,为了减少使用量,我必须:

Set-ExecutionPolicy RemoteSigned

全部起作用:-)


欢迎来到该网站。不知道“答案#24”是什么意思。这些数字是投票(可以更改),而不是枚举。
mhhollomon

啊,我明白了...第一次发布堆栈溢出!我的意思是@ richard-berg的回答,对我而言,这将是公认的答案
Bill Naylor

不知道为什么我要投反对票?在我看来,确认某件事何时起作用很有帮助!
Bill Naylor

0

建议:将文件放入一个临时/一次性.txt文件中,然后让操作系统调用您喜欢的编辑器,该编辑器链接到.txt扩展名。

获取流程| 输出文件temp.txt; 。\ temp.txt

注意:每次使用此功能时,都将覆盖任何先前存在的temp.txt文件。明智地选择文件名。

以上只是一个基本思路。
下一步是使用别名或配置文件函数等将其转换为“ | more”。

HTH,Marcelo Finkielsztein

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.