- PVSM.RU - https://www.pvsm.ru -

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

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

Сегодня звездный час 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

Довольно автоматизации ― пора нарисовать сову на PowerShell и научить консоль говорить - 2
Ирина и Зира готовы.

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

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

$voice.SelectVoice("имя")

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

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

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

Привет, %USERNAME%

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

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

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

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

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

PowerShell_ISE.exe $profile

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

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 предложил в своем блоге [9] интересный вариант применения возможностей системного объекта для управления Windows Media Player и PowerShell. Особенность скрипта в том, что он умеет перемешивать воспроизводимые треки.

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

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

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

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

Довольно автоматизации ― пора нарисовать сову на PowerShell и научить консоль говорить - 4
Уведомление о запуске нового трека.

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

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

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

Довольно автоматизации ― пора нарисовать сову на PowerShell и научить консоль говорить - 5
Прогноз погоды на PowerShell. Потому что можем.

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

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

В январе Cosmos Darwin опубликовал в своем блоге материал Create mixed reality models in PowerShell [14], в котором рассматривается возможность формирования файлов 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

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

Довольно автоматизации ― пора нарисовать сову на PowerShell и научить консоль говорить - 6
Свежесозданный куб.

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

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

Довольно автоматизации ― пора нарисовать сову на PowerShell и научить консоль говорить - 7
При вращении этой фигуры получится бокал.

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

Довольно автоматизации ― пора нарисовать сову на PowerShell и научить консоль говорить - 8
Готовый бокал.

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

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

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

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

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

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

Довольно автоматизации ― пора нарисовать сову на PowerShell и научить консоль говорить - 9
Дроид, которого мы ищем.

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

Довольно автоматизации ― пора нарисовать сову на PowerShell и научить консоль говорить - 10
Незаселенная планета мониторинга.

Ситуация меняется, когда мы начинаем добавлять объекты при помощи 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." 

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

Довольно автоматизации ― пора нарисовать сову на PowerShell и научить консоль говорить - 11
Добавили сервер на карту, и R2D2 начинает его изучать.

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

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

Довольно автоматизации ― пора нарисовать сову на PowerShell и научить консоль говорить - 12
Два города добавлены.

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

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
    }
}

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

Довольно автоматизации ― пора нарисовать сову на PowerShell и научить консоль говорить - 13
Виртуалки крутятся. Красота!

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

Gamedev и PowerShell

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

Довольно автоматизации ― пора нарисовать сову на PowerShell и научить консоль говорить - 14
Интерфейс игры.

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

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

Довольно автоматизации ― пора нарисовать сову на PowerShell и научить консоль говорить - 15
Вспоминаем игру, собираем стены, получаем негатив.

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

Довольно автоматизации ― пора нарисовать сову на PowerShell и научить консоль говорить - 16
Ностальгируем с PowerShell, борясь с инопланетными захватчиками.

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

Автор: Tri-Edge

Источник [25]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/powershell/276864

Ссылки в тексте:

[1] Microsoft: http://www.microsoft.com/en-us/download/details.aspx?id=27224

[2] внешних источников: http://www.zero2000.com/free-text-to-speech-natural-voices.html

[3] 1000++ способ запуска команд на удаленном компьютере: https://habrahabr.ru/company/pc-administrator/blog/342428/

[4] PowerShell Pranks: http://mattblogsit.com/oob/powershell-pranks-making-work-fun-with-creepy-voices

[5] Fun and Games with PowerShell: http://mikefrobbins.com/2013/09/19/fun-and-games-with-powershell/

[6] funtalk.ps1: https://gist.github.com/jrgcubano/0f9b9d6f7a2dddfdef9e

[7] Windows PowerShell Profiles: https://technet.microsoft.com/en-us/library/bb613488(v=vs.85).aspx

[8] Luke Murray: https://community.spiceworks.com/people/lwbm

[9] блоге: https://geekeefy.wordpress.com/2016/07/19/powershellmediaplayer/

[10] репозитории автора: https://github.com/PrateekKumarSingh/MediaPlayer/blob/master/Start-MediaPlayer.ps1

[11] Декодер: https://geekeefy.wordpress.com/2017/12/14/introducing-psdecode-powershell-module-v0-9-0/

[12] Модуль: https://geekeefy.wordpress.com/2017/09/04/plot-graph-in-powershell-console/

[13] Прогноз погоды: https://geekeefy.wordpress.com/2017/08/24/get-weather-report-using-powershell/

[14] Create mixed reality models in PowerShell: http://www.cosmosdarwin.com/2018/01/12/create-mixed-reality-models-in-powershell.html

[15] obj-in-powershell: https://github.com/cosmosdarwin/obj-in-powershell

[16] Zabbix: https://www.zabbix.com

[17] Fpinger: http://www.kilievich.com/rus/fpinger/

[18] releases: https://github.com/MickyBalladelli/PSUnity/releases

[19] 2048: https://ru.wikipedia.org/wiki/2048_(%D0%B8%D0%B3%D1%80%D0%B0)

[20] 2048 en Powershell: https://balladelli.com/2048-powershell/

[21] Flappy Bird: https://ru.wikipedia.org/wiki/Flappy_Bird

[22] Flappy Shell: https://github.com/avdaredevil/Flappy-Shell

[23] Space Invaders: https://ru.wikipedia.org/wiki/Space_Invaders

[24] Space Invaders: http://ps1.soapyfrog.com/2007/01/02/space-invaders/

[25] Источник: https://habrahabr.ru/post/352726/?utm_campaign=352726