Захват экрана консоли

Просмотр аккуратно отформатированных примеров консоли в предыдущем сообщении подвиг меня на написание сценария, который захватывает буфер экрана консоли непосредственно на хосте консоли Windows PowerShell. Используя этот сценарий, вы можете делать снимки консоли для демонстрации своих любимых концепций Windows PowerShell, а затем публиковать их в своем блоге или выкладывать на своем веб-сайте.

Как это сделать? Хост консоли имеет мощный API, который большинство программистов сценариев, игнорирует. Это API позволяет вам захватывать прямоугольники экрана консоли или выводить цветной текст в произвольные области экрана. Функции API консоли доступны в Windows PowerShell как свойства и методы объектов $Host.UI и $Host.UI.RawUI.

Сценарий правильно использует один из этих методов – $Host.UI.RawUI.GetBufferContents. Этот метод извлекает прямоугольную область буфера экрана. Мы будем использовать его для захвата содержимого буфера экрана от левого верхнего угла до положения курсора.

Учтите, что $Host.UI и $Host.UI.RawUI полностью поддерживаются только в консоли Windows PowerShell, которая запускается при старте powershell.exe. ISE Windows PowerShell не реализует все эти интерфейсы, и поэтому не может использоваться для запуска этого сценария.

Для использования сценария просто откройте консоль Windows PowerShell, запустите команды, которые хотите продемонстрировать, а потом запустите этот сценарий, чтобы захватить буфер экрана консоли.

 Windows PowerShell V2                                                                                                  
Copyright (C) 2008 Microsoft Corporation. All rights reserved.                                                         
                                                                                                                       
PS C:\Users\Vladimir> cd E:\MyScripts                                                                                  
PS E:\MyScripts> .\RunMyCoolDemo.ps1                                                                                   
                                                                                                                       
Here are colors which you can use in Windows PowerShell console:                                                       
                                                                                                                       
   Black                                                                                                               
   DarkBlue                                                                                                            
   DarkGreen                                                                                                           
   DarkCyan                                                                                                            
   DarkRed                                                                                                             
   DarkMagenta                                                                                                         
   DarkYellow                                                                                                          
   Gray                                                                                                                
   DarkGray                                                                                                            
   Blue                                                                                                                
   Green                                                                                                               
   Cyan                                                                                                                
   Red                                                                                                                 
   Magenta                                                                                                             
   Yellow                                                                                                              
   White                                                                                                               
                                                                                                                       
Note that DarkMagenta and DarkYellow colors are redefined to produce these nice tints of white and blue which are used 
as default Foreground and Background colors.                                                                           
                                                                                                                       
PS E:\MyScripts> $textFileName = "$env:temp\ConsoleBuffer.txt"                                                         
PS E:\MyScripts> .\Get-ConsoleAsText | out-file $textFileName -encoding ascii                                          
PS E:\MyScripts> $null = [System.Diagnostics.Process]::Start("$textFileName")                                          
PS E:\MyScripts>                                                                                                       

И не забудьте просмотреть код и понять, как в нем используется класс System.Management.Automation.Host. У вас могут появиться замечательные идеи для вашего следующего проекта.

 

Наслаждайтесь!
Владимир Аверкин (Vladimir Averkin)
Windows PowerShell Team

#################################################################################################################
# Get-ConsoleAsText.ps1
#
# The script captures console screen buffer up to the current cursor position and returns it in plain text format.
#
# Returns: ASCII-encoded string.
#
# Example:
#
# $textFileName = "$env:temp\ConsoleBuffer.txt"
# .\Get-ConsoleAsText | out-file $textFileName -encoding ascii
# $null = [System.Diagnostics.Process]::Start("$textFileName")
#

# Check the host name and exit if the host is not the Windows PowerShell console host.
if ($host.Name -ne 'ConsoleHost')
{
  write-host -ForegroundColor Red "This script runs only in the console host. You cannot run this script in $($host.Name)."
  exit -1
}

# Initialize string builder.
$textBuilder = new-object system.text.stringbuilder

# Grab the console screen buffer contents using the Host console API.
$bufferWidth = $host.ui.rawui.BufferSize.Width
$bufferHeight = $host.ui.rawui.CursorPosition.Y
$rec = new-object System.Management.Automation.Host.Rectangle 0,0,($bufferWidth - 1),$bufferHeight
$buffer = $host.ui.rawui.GetBufferContents($rec)

# Iterate through the lines in the console buffer.
for($i = 0; $i -lt $bufferHeight; $i++)
{
  for($j = 0; $j -lt $bufferWidth; $j++)
  {
    $cell = $buffer[$i,$j]
    $null = $textBuilder.Append($cell.Character)
  }
  $null = $textBuilder.Append("`r`n")
}

return $textBuilder.ToString()

 

Перевод: Виктор Горбунков