Довольно автоматизации ― пора нарисовать сову на PowerShell и научить консоль говорить

kmrec7sokfd-jkqe0ue17gruurm.jpeg


Сегодня звездный час PowerShell: время странных скриптов и созданных при помощи «Мощной Оболочки» игр. Если серьезная рутина вам надоела и хочется посмотреть на иные таланты PowerShell ― приглашаю под кат.


Говорящая консоль

Начнем пожалуй с самого простого развлечения ― говорящей консоли. В семействе Windows интерфейс синтеза речи существует уже давно: в библиотеке .Net он называется System.Speech, а для предпочитающих COM-объекты ― SAPI.SpVoice. PowerShell позволяет использовать оба метода.


Проверим работу интерфейса следующим скриптом:


Add-Type -AssemblyName System.Speech
$voice = New-Object System.Speech.Synthesis.SpeechSynthesizer
$voice.Speak("Рио-де-Жанейро — хрустальная мечта моего детства, не трогайте ее руками!")


В системе может быть установлено несколько голосов ― есть варианты разных национальностей, возрастов и полов, каждый со своим именем. Посмотреть общий список можно командой:


$voice.GetInstalledVoices().VoiceInfo


9gzgqxhhrp_-gfcu5fihudc7lmy.jpeg
Ирина и Зира готовы.


Дополнительных «воображаемых друзей» можно скачать вместе с языком ввода через стандартный интерфейс Windows, с сайта Microsoft или из внешних источников.

Выбрать подходящий голос можно командой:


$voice.SelectVoice("имя")


Вооружившись этим знанием можно собрать мониторинг, который говорил бы о падении сервера, или удивить коллег с помощью любимого инструмента удаленного доступа к их машинам. На вооружение можно взять наш материал »1000++ способ запуска команд на удаленном компьютере».


В качестве готовых примеров оставлю несколько ссылок:


  • PowerShell Pranks в блоге Matt Blogs IT.
  • Fun and Games with PowerShell в блоге Mike F Robbins.
  • Скрипт funtalk.ps1 от Jorge Rodríguez Galán.


Но одной возможности говорить нам, конечно, недостаточно. Как насчет того, чтоб консоль еще приветствовала мелодией при открытии?


Привет, %USERNAME%

В PowerShell есть понятие профиля. Почитать об этом подробнее можно в материале Windows PowerShell Profiles на портале TechNet. Отмечу только, что при помощи профилей можно настраивать следующие сущности:


  • Алиасы команд.
  • Размер окна консоли.
  • Цвет и заголовок окна.
  • Начальную папку вместо профиля пользователя.
  • Запуск заданий при открытии консоли.


Последняя опция позволяет, например, проигрывать музыку каждый раз, когда некто открывает окно PowerShell. В качестве подготовки нужно создать профиль, если его до сих пор нет, следующей командой:


New-Item -path $profile -type file -force 


Теперь можно изменить профиль любым редактором — например, PowerShell ISE:


PowerShell_ISE.exe $profile


В качестве примера запуска задания пользователь портала spiceworks Luke Murray предложил проигрывать имперский марш следующим скриптом:


start-job {
[console]::beep(440,500)
[console]::beep(440,500)
[console]::beep(440,500)
[console]::beep(349,350)
[console]::beep(523,150)
[console]::beep(440,500)
[console]::beep(349,350)
[console]::beep(523,150)
[console]::beep(440,1000)
[console]::beep(659,500)
[console]::beep(659,500)
[console]::beep(659,500)
[console]::beep(698,350)
[console]::beep(523,150)
[console]::beep(415,500)
[console]::beep(349,350)
[console]::beep(523,150)
[console]::beep(440,1000)
}


В качестве задачи можно использовать и материал из предыдущего раздела, чтобы консоль при запуске рассказывала сказку или важно приветствовала системного администратора по имени-отчеству. А можно банально открывать DVD-ROM (у кого такие еще остались) командой:


(New-Object -com "WMPlayer.OCX.7").cdromcollection.item(0).eject()


Здесь для открытия «подставки для кофе» используется объект WMPlayer.OCX.7. Его можно использовать и по назначению ― для проигрывания музыки.


Делаем консольный плеер

Если старый добрый mpd по каким-то причинам не нравится и хочется непременно изобрести велосипед ―, а точнее посмотреть на готовый ― то инженер, разработчик и просто хороший человек Prateek Singh предложил в своем блоге интересный вариант применения возможностей системного объекта для управления Windows Media Player и PowerShell. Особенность скрипта в том, что он умеет перемешивать воспроизводимые треки.


Скрипт можно сразу добавить в профиль PowerShell, и дальше запускать плеер одной командой:


Music "путь к файлам с музыкой"


szz2tnfl6h5ygzgmyoozntsjacy.png
Запуск плеера.


Для управления воспроизведением команду можно запустить с параметрами Shuffle (перемешать), Loop (зациклить воспроизведение) и Stop (остановить воспроизведение), а при переходе к следующему треку в нижнем углу появится системное уведомление.


ktuqqfqwgkj4wwnzd37ova-dhus.png
Уведомление о запуске нового трека.


Полный текст скрипта доступен в репозитории автора.


В блоге у Prateek Singh много скриптов разной степени полезности, поэтому дам ссылки лишь на некоторые из них:


  • Декодер ошибок HTTP, кода производителя сетевой карты по MAC-адресу, описания протоколов по порту, и т.п.
  • Модуль для построения диаграмм.
  • Прогноз погоды с аутентичной консольной графикой.


hmgm_pxypbt_mzo-lhjkohwy3na.jpeg
Прогноз погоды на PowerShell. Потому что можем.


Раз уж мы ударились в мультимедиа, расскажу и про вариант создания объектов для 3D-печати, моделирования и прочей дополненной реальности.


Как нарисовать сову, теперь в 3D!

В январе Cosmos Darwin опубликовал в своем блоге материал Create mixed reality models in PowerShell, в котором рассматривается возможность формирования файлов 3D-моделей при помощи PowerShell.


Если разобрать файл .obj, то можно обнаружить там координаты точек с обозначениями »v», и координаты плоскостей под литерой ». Например, простой куб будет выглядеть в файле следующим образом:


v 0 0 0
v 0 0 1
v 0 1 1
v 0 1 0
v 1 0 0
v 1 0 1
v 1 1 1
v 1 1 0
f 1 2 3 4
f 8 7 6 5
f 1 5 6 2
f 4 8 5 1
f 2 6 7 3
f 3 7 8 4


Если сохранить получившийся файл и открыть его графическим просмотрщиком (например, «средством просмотра смешанной реальности»), то действительно будет отрисован куб.


g1kouuxpkaqyupk-my1jjeejs-i.jpeg
Свежесозданный куб.


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


Например, можно создать бокал вина во славу Диониса или Бахуса. Поскольку бокал является фигурой вращения, достаточно создать лишь половину бокала. Тогда при вращении получится желаемый сосуд.


hul_npbloji68kztybwasgyt83w.png
При вращении этой фигуры получится бокал.


Дальше добавим немного материалов, вспомним школьный курс математики, оформим в виде скрипта и получим прекрасный бокал.


f04fwixkcjjgbsprhirxcbtnodg.png
Готовый бокал.


Готовые скрипты и текстуры доступны в аккаунте автора GitHub в проекте obj-in-powershell. Теперь перейдем к более практичному применению PowerShell и 3D.


Мониторинг на Unity

Только представьте: красивая карта на большом экране в кабинете IT, на которой отображаются объекты системы мониторинга и их состояние. А когда нет посторонних глаз, карту можно свернуть и смотреть «Симпсонов».


В качестве поставщика карты могут выступать те же Zabbix или Fpinger. Но несмотря на избыточную информативность, с красотой у них не очень. Исправить это упущение взялся Micky Balladelli, применив для визуализации возможности Unity в виде набора приложений PSUnity.


Идея проста ― на определенном порту запускается сервер, а для добавления объектов мониторинга или изменения их статусов используется набор командлетов PowerShell. Клиент подключается к серверу и отображает получившуюся картину. Статусы объектов можно брать из привычной системы мониторинга — например, из Zabbix или SCOM.


При старте сервера без объектов можно наблюдать одинокого R2D2 в чистом поле:


tojc0_lra_6hjqpjv0s1vdtumri.jpeg
Дроид, которого мы ищем.


По кнопке View можно переключать режимы ― ЦОД, планета, космос. Довольно пустынно.


rypfv71edligcwmz-de_tc7byre.jpeg
Незаселенная планета мониторинга.


Ситуация меняется, когда мы начинаем добавлять объекты при помощи PowerShell.


К самому серверу можно подключиться командой:


$Session = New-PSUnitySession -ComputerName localhost -Port 7777


Добавлять объекты на карту с дроидом можно при помощи командлета Set-PSUnityServer:


Set-PSUnityServer -Session $Session -X 0 -Y 5 -Name EXSRV1 -Role Exchange -Location Maui -Status 0 -Description "EXSRV1 has drifted its configuration." 


Указанная выше команда добавит сервер со зловещим описанием.


z-rsffkb3c7oahxdbej3xiuet-o.jpeg
Добавили сервер на карту, и R2D2 начинает его изучать.


Для добавления города на планету и изменения его статуса можно использовать следующие команды:


Set-PSUnityCity -Session $Session -Name "Moscow" -Status 3
Set-PSUnityCity -Session $Session -Name "Saint Petersburg" -Status 1


ah9jf-s7ilgzkcxwzzb3v6kxilu.jpeg
Два города добавлены.


Еще один интересный вид ― это два ЦОДа с виртуальными машинами и их статусами. Добавим пару:


Set-PSUnityCloudInfo -Session $Session -Site 2 -Name "Амазон" -Role "Ожидаем" -Location "Запасной ДЦ" -Status 4
Set-PSUnityCloudInfo -Session $Session -Site 1 -Name "Хетцнер" -Role "Активный" -Location "Основной ДЦ" -Status 1


Теперь создадим множество виртуальных машин в основном датацентре:


$color = 4
for ($i = 0; $i -lt 1500; $i++)
{
    Set-PSUnityCloud -Session $Session -Site 1 -Name "VM$i" -VMHost "Hostname" -Cluster "ClusterID" -Status $color  -Description Running
    $color++;
    if ($color -eq 5)
    {
        $color = 0
    }
}


На выходе будет такой результат:


ge1b2kxnoplgd3fd3fgd4d0ntq8.jpeg
Виртуалки крутятся. Красота!


Скачать сам сервер с клиентом, набор командлетов и примеры скриптов можно в разделе releases проекта PSUnity. Раз мы уже добрались до Unity — самое время для пары незамысловатых игр на PowerShell.


Gamedev и PowerShell

Несколько лет назад мир «взорвала» игра под названием 2048. Изначально браузерный вариант получил множество адаптаций, в том числе и под мобильные устройства. Конечно же, нашелся и клон на PowerShell, созданный уже упомянутым Micky Balladelli. Скрипт доступен в блоге автора, в статье 2048 en Powershell.


-wfycofxbipcf2ysn4kp8d5f2ku.jpeg
Интерфейс игры.


В качестве второй популярной игры можно привести Flappy Bird, изначально созданную для мобильных устройств. Если вы уже успели в ярости разбить смартфон и забыть игру как страшный сон ― позвольте напомнить о ней клоном на PowerShell.


Сам клон доступен в репозитории Flappy Shell инженера Apoorv Verma.


yjjvnxbqgdxji3bu4epn_evyok4.jpeg
Вспоминаем игру, собираем стены, получаем негатив.


В завершении статьи мне хотелось бы привести ссылку на адаптацию любимой игры детства ― Space Invaders. Решение на PowerShell доступно для загрузки в статье Adrian Milliner с говорящим названием Space Invaders. Скрипт — не просто скрипт, а полноценная игра со звуком. Осторожнее на работе.


lxrhteche76vg2ge1dvhogo9eac.jpeg
Ностальгируем с PowerShell, борясь с инопланетными захватчиками.


Если у вас есть свои интересные и неординарные скрипты на PowerShell ― вы знаете что делать.

© Habrahabr.ru