如何在 powershell 中测量 window 高度(行数)?

How can I measure the window height (number of lines) in powershell?

例如下图,我的环境最大行数是47行。 我可以通过编程方式测量这个值吗?

你可以试试

$(Get-Host).UI.RawUI.WindowSize.Height

但是请注意以下几点:

  • 使用 RawUI 可能并不特别 "portable",具体取决于您的脚本 运行 所在的位置。 例如,在 "ISE" 中,属性 returns 什么都没有,而在控制台上它将起作用。

    有关控制台和 ISE 之间的更多差异,运行 $(Get-Host).UI.RawUI 并比较输出。

    在其他 PowerShell 主机中,除了控制台或 ISE 之外,它可能仍然不同。

  • 还有一个BufferSize,可以大于WindowSize。后者只是用户当前 "viewable" 的部分。

你的问题听起来有点像xy problem。考虑解释(作为对您的问题或新问题的编辑)您实际想要实现的目标,即为什么您需要知道行数?

补充

  • 获取宿主对象的一种更简单且稍微更有效的方法是使用$Host automatic variable而不是Get-Host cmdlet.

  • 保证可以访问 window-尺码信息 PowerShell console 主机,即当 运行 在 控制台(终端)window

    • 是否公开此信息由给定主机自行决定,并且,正如 Christian 所说,PowerShell ISE -尽管可以说它应该,因为它有一个控制台子系统内置
  • 测试您的代码是否在控制台中运行(a.k.a terminal) or not, use
    $Host.UI.SupportsVirtualTerminal - $True表示主机是控制台。


如果 运行 在 PowerShell 控制台 主机:

可以访问控制台的属性

  • via $Host.UI.RawUI(如克里斯蒂安的回答),这是一个 [System.Management.Automation.Internal.Host.InternalHostRawUserInterface] 类型的对象 - 仅在 PowerShell 控制台主机中 - 包装 .NET [Console] class(见下文)。

  • 通过.NET [Console] class;例如,要以这种方式获得 window 高度(行数),请使用:

    • [Console]::WindowHeight

示例 $Host.UI.RawUI 输出:

> $Host.UI.RawUI

ForegroundColor       : DarkYellow
BackgroundColor       : DarkMagenta
CursorPosition        : 0,58
WindowPosition        : 0,0
CursorSize            : 25
BufferSize            : 160,9999
WindowSize            : 160,75
MaxWindowSize         : 160,94
MaxPhysicalWindowSize : 303,94
KeyAvailable          : True
WindowTitle           : Windows PowerShell

如果 运行 在 PowerShell ISE 中:

编写自 PowerShell 5.1 版

$Host.UI.RawUI 中的大多数属性 未填充 并将 return 其数据类型的默认值:

> $Host.UI.RawUI  # in ISE

ForegroundColor       : -1
BackgroundColor       : -1
CursorPosition        : 0,0
WindowPosition        : 
CursorSize            : 
BufferSize            : 166,0
WindowSize            : 
MaxWindowSize         : 
MaxPhysicalWindowSize : 
KeyAvailable          : 
WindowTitle           : Windows PowerShell ISE

可用的只有大小相关信息缓冲区宽度166 在上面的示例输出中)。

请注意,如果您尝试从 ISE 直接使用 [Console] ,您会得到 异常:

> [Console]::WindowHeight
The handle is invalid.     # EXCEPTION
...

我真正需要的功能是 git status,powershell_ise 中的 git diff,带有突出显示和输出分页。 powershell_ise目前的版本似乎并没有解决问题本身。

虽然不完全令人满意,但我设计了一个实用的解决方案并创建了以下功能。




源代码

function hhd-git-diff
{
    [CmdletBinding()]
    param
    (
    )

    $res = git diff
    hhd-git-colored-output -INPUT_OBJECT $res
}



function hhd-git-status
{
    [CmdletBinding()]
    param
    (
    )

    $res = git status
    hhd-git-colored-output -INPUT_OBJECT $res
}



function hhd-git-colored-output
{
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory=$true, ValueFromPipeline=$true, ValueFromPipelinebyPropertyName=$true)]
        [System.Object]
        $INPUT_OBJECT
    )



    $lineNum = 1



    $INPUT_OBJECT | 
    Out-String | 
    foreach {

        $_ -split "\n" |

        foreach {

            if($lineNum % [Console]::WindowHeight -eq 0)
            {
                Read-Host "continue? press any key..."
            }

            $lineNum++

            if($_ -like "diff --git *")
            {
                Write-Host ""
                Write-Host ""
                Write-Host ""
                Write-Host ("#"*80) -ForegroundColor Cyan
                Write-Host $_ -ForegroundColor Cyan
                Write-Host ("#"*80) -ForegroundColor Cyan
                Read-Host "continue? press any key..."
                $lineNum = 1
            }
            elseif($_ -like "--- *")
            {
            }
            elseif($_ -like "+++ *")
            {
            }
            elseif($_ -like "-*")
            {
                Write-Host $_ -ForegroundColor Red
            }
            elseif($_ -like "+*")
            {
                Write-Host $_ -ForegroundColor Green
            }
            elseif($_ -like "On branch *")
            {
                Write-Host ("#"*80) -ForegroundColor Cyan
                Write-Host $_ -ForegroundColor Cyan
            }
            elseif($_ -like "Your branch is*")
            {
                Write-Host $_ -ForegroundColor Cyan
                Write-Host ("#"*80) -ForegroundColor Cyan
            }
            elseif($_ -like "Changes to be committed:*")
            {
                Write-Host ("-"*80) -ForegroundColor Green
                Write-Host $_ -ForegroundColor Green
            }
            elseif($_ -like "Changes not staged for commit:*")
            {
                Write-Host ("-"*80) -ForegroundColor Red
                Write-Host $_ -ForegroundColor Red
            }
            elseif($_ -like "Untracked files:*")
            {
                Write-Host ("-"*80) -ForegroundColor Black
                Write-Host $_ -ForegroundColor Black
            }
            elseif($_ -like "*modified:*")
            {
                Write-Host $_ -ForegroundColor Yellow
            }
            elseif($_ -like "*deleted:*")
            {
                Write-Host $_ -ForegroundColor Red
            }
            else
            {
                Write-Host $_ -ForegroundColor Gray
            }
        }
    }



}



屏幕截图