如何测量powershell中的窗口高度(行数)?

时间:2017-07-02 13:21:44

标签: powershell powershell-ise windows-console

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

3 个答案:

答案 0 :(得分:4)

补充Christian.K's helpful answer

  • 获取宿主对象的一种更简单,更有效的方法是使用$Host automatic variable 而不是Get-Host cmdlet。< / p>

  • PowerShell 控制台主机中 保证可以访问窗口大小信息 ,即控制台(终端)窗口中运行

    • 由主持人自行决定是否公开这些信息,并且,正如基督教所说, PowerShell ISE - 即使它可以说应该,因为它有一个控制台子系统内置
  • 测试您的代码是否在控制台(a.k.a 终端中运行,请使用
    $Host.UI.SupportsVirtualTerminal - $True表示主机是控制台。

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

可以访问控制台的属性

  • 通过 $Host.UI.RawUI (如Christian的回答),这是[System.Management.Automation.Internal.Host.InternalHostRawUserInterface]类型的对象 - 仅在PowerShell控制台主机中 - 包装.NET [Console]类(见下文)。

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

    • [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中的大部分属性未填充 ,并将返回其数据类型的默认值:

> $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
...

答案 1 :(得分:2)

您可以尝试类似

的内容
$(Get-Host).UI.RawUI.WindowSize.Height

请注意以下几点:

  • 使用RawUI可能不是特定的“可移植”,具体取决于脚本的运行位置。 例如,在“ISE”中,该属性不返回任何内容,而在控制台上它将起作用。

    如果控制台和ISE之间存在更多差异,请运行$(Get-Host).UI.RawUI并比较输出。

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

  • 还有一个BufferSize,它可以比WindowSize大。后者只是用户当前“可查看”的部分。

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

答案 2 :(得分:0)

我真正需要的功能是powershell_ise中的git statusgit 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
            }
        }
    }



}




屏幕截图