For example, as shown in the figure below, the maximum number of lines in my environment is 47.
Can I measure this value programmatically?
A simpler and slightly more efficient method for obtaining the host object is to
use the
$Host
automatic variable
rather than the
Get-Host
cmdlet.
You're
only
guaranteed
to have access to window-size information
in the
PowerShell
console
host
, i.e., when
running in a
console (terminal) window
It is at a given host's discretion whether to expose this information, and, as Christian states,
the PowerShell ISE does
not
- even though it arguably
should
, given that it has a console subsystem
built in
.
To
test whether your code is running in a
console
(a.k.a
terminal
)
or not, use
$Host.UI.SupportsVirtualTerminal
-
$True
indicates that the host is a console.
If running in the
PowerShell
console
host
:
You
can access the console's properties
either:
via
$Host.UI.RawUI
(as in Christian's answer), which is an object of type
[System.Management.Automation.Internal.Host.InternalHostRawUserInterface]
that -
in the PowerShell console host only
- wraps the .NET
[Console]
class (see below).
via the
.NET
[Console]
class
; e.g., to get the window height (count of rows) this way, use:
[Console]::WindowHeight
Sample
$Host.UI.RawUI
output:
> $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
Written as of PowerShell version 5.1
Most of the properties in $Host.UI.RawUI
are not populated and will return their data type's default value:
> $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
The only size-related information that is available is the buffer width (166
in the sample output above).
Note that if you tried to use [Console]
directly from the ISE, you'd get exceptions:
> [Console]::WindowHeight
The handle is invalid. # EXCEPTION
–
–
–
Using the RawUI
might not be particular "portable", depending on where your script runs. In "ISE" for example, that property returns nothing, while on the console it will work.
For more difference here between the console and ISE, run $(Get-Host).UI.RawUI
and compare the output.
In other PowerShell hosts, besides the console or ISE, it might yet be still different.
There is also a BufferSize
, which can be bigger than the WindowSize. The later being only the part that is currently "viewable" by the user.
Your question sounds a little like a xy problem. Consider explaining (as an edit to your question or a new question), what you're actually trying to achieve, i.e. why you need to know the number of lines?
–
–
The functionality I really need is git status
, git diff
in powershell_ise with highlight and output paging.
It seems that the current version of powershell_ise does not solve the problem itself.
Although not completely satisfactory, I have devised a practical solution and created the following function.
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
Write-Host $_ -ForegroundColor Gray
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
site design / logo © 2019 Stack Exchange Inc; user contributions licensed under cc by-sa 4.0
with attribution required.
rev 2019.10.7.35131