【问题标题】:Equivalent of 'more' or 'less' command in Powershell?等效于 Powershell 中的“更多”或“更少”命令?
【发布时间】:2010-11-07 21:55:00
【问题描述】:

有没有办法通过管道将输出分页到moreless 命令,类似于those that are available in Linux\Unix shells

【问题讨论】:

  • 对于那些不了解的人来说,一些很酷的事情是你可以向后退,使用箭头,使用向上/向下翻页,甚至使用键'/'搜索并得到结果突出显示。

标签: powershell


【解决方案1】:

是的,有:

some-cmdlet | out-host -paging

【讨论】:

  • 我以前使用的越来越少,但都不像我想象的那么友好。我发现这种变体比其他变体更有用/可用。非常感谢。
  • 请注意,PowerShell ISE 不支持 Out-Host 的 -Paging 参数。
  • @BrunoBrant 这不是重点。您可以将输出通过管道传输到任何东西; less 只是一个大型文本查看器应用程序,它接受 stdin 的文本。您可以将其通过管道传输到一个临时文件并在nanovim 中打开它以获得 EVEN MOAR POWERRRR!不是重点。 PowerShell 就像bash(但更好,恕我直言)。 less 不在bash 中;它是一个单独的二进制文件。所以你的批评是无效的。
  • 另外,评论一下答案:别名ohOut-Host,如果没有冲突,参数可以缩写,所以命令可以是Some-Cmdlet | oh -p
【解决方案2】:

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

dir -rec | more

【讨论】:

  • more 正是这样做的,当您使用 gcm 查看函数的定义时 more|select Definition|fl
  • 实际上,管道到 more 等于管道到“out-host -paging”,这与 more.com 实现是分开的。但实际上并没有明显的区别。
  • 有趣!对我来说,gcm more 返回两个定义,一个是 PowerShell 函数,当给定一个空参数时,它会执行“$input | out-host -p”,这是我在 gci -rec | 上看到的行为。更多的。另一方面,当我做 gci -rec | more.com,我得到了正常的 more.com 行为。在安装了 PS2 的 W7 RC 上,即使只输入“更多”,我似乎也能看到 more.com。在带有 PS1 的 Vista 上,会发生上述行为。基于huddledmasses.org/…,您不认为该功能也应该在W7上执行吗?嗯……
  • 抱歉,写得不是特别好。所以我的观点是,在带有 PowerShell 1 的 Vista 上,管道到“更多”会调用 Out-Host -p,而在带有 PowerShell 2 的 W7 上,它会调用 more.com。
  • 哎呀,我的立场是正确的。对不起。是的,确实,在 PS 1 中它调用 Out-Host -p,而不是 more.com(自我注意:始终阅读整个函数,即使它看起来非常相似)
【解决方案3】:

dir -rec | more 是个坏建议。

这将导致 powershell 在将整个命令输出到屏幕之前对其进行评估,这对于输出分页之类的东西来说是不需要的

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

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

【讨论】:

  • 当您使用远程 powershell 并希望通过寻呼机在远程 Windows 服务器上传送命令时,通过out-host -paging 的管道可以按需要工作。运行远程命令时通过more 管道是没有用的:整个文本一次显示。
  • out-host -paging 的别名是oh -pa
【解决方案4】:

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 下无法正常工作。

【讨论】:

  • 安装会覆盖几个基本的 Powershell 命令(gcb、Expand-Archive、Format-Hex、Get-Hash、help、prompt、Get-Clipboard、Get-Help、Set-Clipboard),所以说“the force 是升级旧版本”似乎有点误导。
  • 只为当前用户安装,没有错误或警告使用:Find-Package pscx | Install-Package -Force -scope currentuser -allowclobber
  • 感谢您的精彩提示!
【解决方案5】:

我更喜欢“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 还允许我对结果执行文本搜索(正斜杠,然后键入文本,然后按 enter,然后“n”用于下一个结果,“p”用于上一个结果)。非常非常方便。
  • 这里是另一个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
  • @olisteadman,这是 less.exe 的官方 Git 版本。你试过 Git for Windows gitforwindows.orgless 版本吗?
  • 无需使用“out-host”。我用这个:“Get-Content tmpf | C:\cygwin64\bin\less.exe”
  • 设置$env:PAGER="C:\cygwin64\bin\less.exe" 也是一个很好的主意,所以例如当你输入“帮助”时会用到它跨度>
【解决方案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

【讨论】:

    【解决方案7】:

    more 不用于限制输出,它用于分页输出并使其更容易在终端中阅读(如果有的话)。

    您是在谈论使用headtail 吗? EggHeadCafe 有一个例子:

    type my.txt | select-object -first 10
    
    type my.txt | select-object -last 10
    

    模拟headtail

    【讨论】:

    【解决方案8】:

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

    【讨论】:

      【解决方案9】:
      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
      

      哦 = 主机外

      【讨论】:

        【解决方案10】:

        如果你安装了 VIM,我非常喜欢dir -r | vim -R -。不幸的是,more 也存在同样的问题(即没有流式传输)。

        【讨论】:

          【解决方案11】:

          我确实有这个问题(好吧,我想要更少,而不是更多)并发现@richard-berg 的答案对我有用,对 PowerShell(但不是 Linux)是新手,我发现该答案中缺少的东西(对我来说)是: 我首先需要去:

          Find-Package pscx | Install-Package

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

          然后为了少用,我不得不:

          Set-ExecutionPolicy RemoteSigned

          这一切都奏效了:-)

          【讨论】:

          • 欢迎来到本站。不确定“答案#24”是什么意思。这些数字是选票(可以更改)而不是枚举。
          • 啊,我明白了……我第一次发布到堆栈溢出!我的意思是@richard-berg 的答案,对我来说,这将是公认的答案
          • 不知道为什么我投了反对票?似乎(对我来说)确认某事何时奏效很有帮助!
          【解决方案12】:

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

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

          注意:每次使用它时,您都会覆盖任何预先存在的 temp.txt 文件。 明智地选择文件名。

          以上只是一个基本的想法。
          下一步将使用别名或配置文件函数等将其转换为“|更多”。

          HTH, 马塞洛·芬基尔斯泰因

          【讨论】:

            【解决方案13】:

            在我看来,最简单的做法是使用Scoop 从 UNIX 安装您习惯使用的任何东西。完成后,只需运行 scoop install less 即可。

            【讨论】:

              猜你喜欢
              • 2010-09-08
              • 2012-09-01
              • 2011-12-26
              • 2016-10-02
              • 2018-01-15
              • 1970-01-01
              • 2019-08-16
              • 1970-01-01
              相关资源
              最近更新 更多