PowerShell может быть не только мощным инструментом автоматизации и администрирования, но и инструментом для творчества. Например, инструментом для создания ASCII-графики, который превращает математические формулы и циклы в акцидентную графику на чистом листе консоли. Предлагаю рассмотреть вариант рисования сердца, составленного из букв заданного слова. Этим словом может быть чьё-то имя или скрытое послание.
Для удобства я сразу написал код в виде функции с именем Get-ASCIIHeart, которую можно добавить в профиль PowerShell.
function Get-ASCIIHeart {
<#
.SYNOPSIS
Generates an ASCII heart art using characters from a specified word.
.DESCRIPTION
Creates a heart-shaped ASCII art where the pattern is formed by cycling through
characters of the provided word. Empty space can be customized.
.PARAMETER Word
The word whose characters will be used to form the heart. Default is 'love'.
.PARAMETER Space
The character to use for empty space. Default is a regular space.
.EXAMPLE
Get-ASCIIHeart -Word "PS♥" -Space ' '
.EXAMPLE
Get-ASCIIHeart | Set-Content heart.txt
#>
[CmdletBinding()]
param(
[Parameter(Mandatory = $false)]
[ValidateNotNullOrEmpty()]
[string]$Word = 'love',
[Parameter(Mandatory = $false)]
[char]$Space = ' '
)
$output = [System.Collections.Generic.List[string]]::new()
$wordChars = $Word.ToCharArray()
$wordLength = $wordChars.Count
$yStart = 15
$yEnd = -13
$xStart = -30
$xEnd = 30
$yScale = 0.1
$xScale = 0.05
for ($y = $yStart; $y -ge $yEnd; $y--) {
$line = [System.Text.StringBuilder]::new()
for ($x = $xStart; $x -lt $xEnd; $x++) {
$xScaled = $x * $xScale
$yScaled = $y * $yScale
$heartEquation = [Math]::Pow(($xScaled * $xScaled + $yScaled * $yScaled - 1), 3) -
($xScaled * $xScaled * [Math]::Pow($yScaled, 3))
if ($heartEquation -le 0) {
$index = ($x - $y) % $wordLength
if ($index -lt 0) { $index += $wordLength }
[void]$line.Append($wordChars[$index])
} else {
[void]$line.Append($Space)
}
}
$output.Add($line.ToString())
}
return $output -join [Environment]::NewLine
}
Функция принимает два необязательных параметра:
-Word - параметр типа String, задаёт строку, символами которой будет заполнена фигура сердца. По умолчанию используется строка love;-Space - параметр типа Char, задаёт символ, копиями которого будет заполнено пространство вокруг фигуры сердца. По умолчанию используется символ пробела.
В результате выполнения функции Get-ASCIIHeart возвращается строка, содержащая ASCII-изображение сердца.
Для сведения: проверить тип возвращаемого функцией значения можно при помощи метода GetType().
(Get-ASCIIHeart).GetType()
Результат работы функции Get-ASCIIHeart , вызванной без параметров, выглядит так.

Можно сделать сердце красным. Или использовать другой цвет.
Get-ASCIIHeart | Write-Host -ForegroundColor Red

Для чего использовать параметр-Space функции Get-ASCIIHeart? Например, для того, чтобы изобразить сердце, заполненное цифрами 1, окружённое фоном из цифр 0. Здесь следует использовать сразу оба параметра -Word и -Space.
Get-ASCIIHeart -Word '1' -Space '0'

Для сохранения результата работы функции Get-ASCIIHeart в текстовоый файл, можно использовать конвейер PowerShell.
Get-ASCIIHeart -Word '1' -Space '0' | Set-Content 'heart.txt'

Можно пойти дальше и создать простую анимацию в консоли. Следующий код запустит бесконечный цикл, внутри которого вывод в консоли будет очищаться, затем в консоль будет выводиться сердце, заполненное символами из слов, заданных в массиве слов в переменной $words.
$words = @("♥PS", "♥CODE", "♥PHOTO")
while ($true) {
Clear-Host
Get-ASCIIHeart -Word $words[(Get-Date).Second % $words.Length]
Start-Sleep -Milliseconds 800
}
Можно продолжить экспериментировать с анимацией, изменяя не только заполнение сердца или фона, но и цвет, форму, размеры, положение сердца, добавляя новые параметры для функции Get-ASCIIHeart.
Как видите, PowerShell это не скучно! Даже если выполняете рутинные задачи, всегда можно отвлечься, переключившись на творчество, не покидая консоль PowerShell.