如何在 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
}
}
}
}
屏幕截图
例如下图,我的环境最大行数是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
}
}
}
}