例如,如下图所示,我环境中的最大行数为47。 我可以通过编程方式测量这个值吗?
答案 0 :(得分:4)
补充Christian.K's helpful answer:
获取宿主对象的一种更简单,更有效的方法是使用$Host
automatic variable 而不是Get-Host
cmdlet。< / p>
PowerShell 控制台主机中 保证可以访问窗口大小信息 ,即在控制台(终端)窗口中运行
要测试您的代码是否在控制台(a.k.a 终端)中运行,请使用
$Host.UI.SupportsVirtualTerminal
- $True
表示主机是控制台。
你可以访问控制台的属性:
通过 $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 版本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 status
,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
}
}
}
}