PowerShell“少”工具

Yor*_*ubs 4 console powershell

不是与此相关的其他各种问题的重复(我回顾了它们,但在我看到的问题中没有得到回答)。这些其他问题都围绕着Out-Host -Pagingmore即使它们less在问题标题中提到)。

为了关注这一特定点,有谁知道less在 Microsoft Windows 环境下复制 的功能的 PowerShell 方法吗?即使我们能够向下和向上滚动文档(使用光标键逐行或使用 PgUp / PgDn 键逐页)以查看帮助和其他文件(例如,以便我们可以执行操作Get-Help Get-ChildItem -Full | less)。

这将非常有用。我并不追求lessWindows 的第 3 方可执行工具(因为它不会启用管道等)(当然有很多)。我相信 PSCX 中有这样的东西,但每当我尝试安装它时,我都会看到很多冲突,并且我不确定是否使用它,-AllowClobber以防它破坏其他东西。也许在这一点上,如果有的less话,有没有人能够分离出该功能并独立于 PSCX 使用?

mkl*_*nt0 12

Get-Help Get-ChildItem -Full | lessless使用给定平台的实用程序(通常是) ,在类 Unix 平台上工作得很好/usr/bin/less- 不需要额外的工作。

我不追求第三方可执行less工具(因为它不会启用管道等)

任何从stdin(标准输入)读取并输出到stdout (标准输出)的外部程序(实用程序)根据定义都是启用管道的,尽管总是仅针对文本:发送到此类实用程序的数据将转换为文本,并返回数据来自此类实用程序的内容被解释为文本。

Windows上,默认情况下只有功能有限的more.com寻呼机可用- 见下文。

但是,可以在 Windows 上安装 less

  • 如果您安装了WSL的 Linux 发行版,您可以简单地通过管道连接到wsl less; 例如:

    • Get-Help Get-ChildItem | wsl less
    • 警告:从 PowerShell 调用时PageUp/PageDown似乎不起作用f,但(前进)和b(后退)提供相同的实用程序。
  • 否则,请考虑安装属于GnuWin项目一部分的less.exeWindows 控制台应用程序(选择最新文件夹中的版本)(安装程序需要管理员权限)。

    • 这给你正常PageUp/PageDown支持。

注意:还有另一个lessWindows 端口,它与其他实用程序捆绑在一起;还没有亲自尝试过:UnxUtils

注意事项

  • less显然,无论活动的 OEM 代码页如何,都需要 UTF-8 输入[console]::OutputEncoding],并且如果设置为 UTF-8,则仅正确显示非 ASCII 字符。

    • 因此,必须将$OutputEncoding和 都[console]::OutputEncoding]设置为 UTF-8 ( [Text.Utf8Encoding]::new()) 才能正常显示非 ASCII 字符。(在 PowerShell [Core] v6+ 中,$OutputEncoding默认为 UTF-8,但[console]::OutputEncoding]仍反映系统的 OEM 代码页。)

    • 请参阅底部部分,了解如何通过也确保使用 UTF-8 编码的自定义函数来使用 PowerShell 中的命令more/函数。helplessmore.commore

  • GnuWinless.exe版本394(截至撰写本文时为当前版本,但发布于 2006 年 1 月 3 日)有时会出现异常并且不显示任何内容;开始新的会话可以使问题消失。


- 功能较弱(没有双关语) - Windows 对应的lessmore( more.com),它通过 stdin / 管道或通过文件名参数接受文本。

值得注意的是,more.com似乎只支持向下翻页,space不支持向上翻页;也就是说,您无法向后滚动- 请参阅此处

PowerShell自身也Out-Host -Paging有同样的限制

  • Windows PowerShell提供了一个内置的包装函数,more.com也称为more(这意味着执行时只more执行该函数),它确保指定文件的内容以活动 OEM 代码页的编码输出,这正是所more.com期望的。

  • PowerShell [Core] 6+ 不再提供此包装器。

在这两个版本中,内置help函数本身包装Get-Help,隐式地将后者的输出通过管道传输到more- 在 Windows PowerShell 中总是如此,默认情况下在 Windows 上的 PowerShell 6+ 中(在 Unix 上,它默认为less.

$env:PAGER在 PowerShell 6+ 中,您还可以通过将变量设置为要调用以进行分页输出的命令行来定义自定义分页器help

在 Windows PowerShell 中,您唯一的选择是替换/定义自定义more函数(这也适用于 PowerShell 6+)。

换句话说:默认情况下,类似下面的内容会为您提供交互式分页输出:

help Get-ChildItem  # Effectively the same as: Get-Help Get-ChildItem | more
Run Code Online (Sandbox Code Playgroud)

如果您less在 Windows 上可用并且想要使用它而不是more

覆盖内置/定义函数more如下(在您的$PROFILE文件中):

  • less通过 WSL使用:
# Via WSL
function more { 
  $prevOe, $prevCoe = $OutputEncoding, [console]::OutputEncoding
  try {
    $OutputEncoding = [console]::OutputEncoding = [Text.Utf8Encoding]::new()
    $Input | wsl less
  }
  finally {
    $OutputEncoding, [console]::OutputEncoding = $prevOe, $prevCoe
  }
}

# If running PowerShell Core (v6+):
# Force the `help` function to use the custom function.
if ($IsCoreClr) { $env:PAGER = 'more' }
Run Code Online (Sandbox Code Playgroud)
  • GnuWin 的使用less.exe
# Via GnuWin (assuming the default installation location)
function more { 
  $prevOe, $prevCoe = $OutputEncoding, [console]::OutputEncoding
  try {
    $OutputEncoding = [console]::OutputEncoding = [Text.Utf8Encoding]::new()
    $Input | & 'C:\Program Files (x86)\GnuWin32\bin\less.exe'
  }
  finally {
    $OutputEncoding, [console]::OutputEncoding = $prevOe, $prevCoe
  }
}

# If running PowerShell Core (v6+):
# Force the `help` function to use the custom function.
if ($IsCoreClr) { $env:PAGER = 'more' }
Run Code Online (Sandbox Code Playgroud)

注意:这使得more仅接受管道输入,但扩展该函数以接受文件名参数也不难。


如果满足以下条件,则有一个更简单的解决方案,由David Hatch建议:

  • 您已经安装了 GnuWin less.exe

  • 您不需要对非 ASCII 字符的支持。

  • 确实如此,但您的会话已配置为将$OutputEncoding和 都设置[console]::OutputEncoding为 UTF-8。($OutputEncoding在 PowerShell [Core] v6+ 中默认为 UTF-8,但不是[console]::OutputEncoding])。

    • 请参阅此答案,了解如何通过 切换 PowerShell 会话以一致地使用 UTF-8 $PROFILE

    • 请参阅此答案,了解如何在 Windows 10系统范围内配置使用代码页65001== UTF-8,但请注意,截至撰写本文时,该功能仍处于测试阶段,并且它有副作用和限制;值得注意的是,它使使用活动 ANSI 代码页 ( / ) 的Windows PowerShell命令默认为 UTF-8。Get-ContentSet-Content

Windows PowerShell:

Set-Alias more 'C:\Program Files (x86)\GnuWin32\bin\less.exe'
Run Code Online (Sandbox Code Playgroud)

PowerShell [核心] v6+:

$env:PAGER = 'C:\Program Files (x86)\GnuWin32\bin\less.exe'
Run Code Online (Sandbox Code Playgroud)