Захват экрана консоли
Просмотр аккуратно отформатированных примеров консоли в предыдущем сообщении подвиг меня на написание сценария, который захватывает буфер экрана консоли непосредственно на хосте консоли 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()
Перевод: Виктор Горбунков