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

в 9:03, , рубрики: 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 или из внешних источников.

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

$voice.SelectVoice("имя")

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

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

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

Привет, %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 "путь к файлам с музыкой"

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

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

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

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

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

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

Довольно автоматизации ― пора нарисовать сову на PowerShell и научить консоль говорить - 5
Прогноз погоды на 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

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

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

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

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

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

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

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

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

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

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

В качестве поставщика карты могут выступать те же Zabbix или Fpinger. Но несмотря на избыточную информативность, с красотой у них не очень. Исправить это упущение взялся 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 проекта PSUnity. Раз мы уже добрались до Unity – самое время для пары незамысловатых игр на PowerShell.

Gamedev и PowerShell

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

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

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

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

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

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

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

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

Автор: Tri-Edge

Источник

Поделиться

* - обязательные к заполнению поля