Сегодня звездный час 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
Ирина и Зира готовы.
Дополнительных «воображаемых друзей» можно скачать вместе с языком ввода через стандартный интерфейс 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 "путь к файлам с музыкой"
Запуск плеера.
Для управления воспроизведением команду можно запустить с параметрами Shuffle (перемешать), Loop (зациклить воспроизведение) и Stop (остановить воспроизведение), а при переходе к следующему треку в нижнем углу появится системное уведомление.
Уведомление о запуске нового трека.
Полный текст скрипта доступен в репозитории автора.
В блоге у Prateek Singh много скриптов разной степени полезности, поэтому дам ссылки лишь на некоторые из них:
- Декодер ошибок HTTP, кода производителя сетевой карты по MAC-адресу, описания протоколов по порту, и т.п.
- Модуль для построения диаграмм.
- Прогноз погоды с аутентичной консольной графикой.
Прогноз погоды на PowerShell. Потому что можем.
Раз уж мы ударились в мультимедиа, расскажу и про вариант создания объектов для 3D-печати, моделирования и прочей дополненной реальности.
Как нарисовать сову, теперь в 3D!
В январе Cosmos Darwin опубликовал в своем блоге материал Create mixed reality models in PowerShell, в котором рассматривается возможность формирования файлов 3D-моделей при помощи PowerShell.
Если разобрать файл .obj, то можно обнаружить там координаты точек с обозначениями «v», и координаты плоскостей под литерой «f». Например, простой куб будет выглядеть в файле следующим образом:
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.
Например, можно создать бокал вина во славу Диониса или Бахуса. Поскольку бокал является фигурой вращения, достаточно создать лишь половину бокала. Тогда при вращении получится желаемый сосуд.
При вращении этой фигуры получится бокал.
Дальше добавим немного материалов, вспомним школьный курс математики, оформим в виде скрипта и получим прекрасный бокал.
Готовый бокал.
Готовые скрипты и текстуры доступны в аккаунте автора GitHub в проекте obj-in-powershell. Теперь перейдем к более практичному применению PowerShell и 3D.
Мониторинг на Unity
Только представьте: красивая карта на большом экране в кабинете IT, на которой отображаются объекты системы мониторинга и их состояние. А когда нет посторонних глаз, карту можно свернуть и смотреть «Симпсонов».
В качестве поставщика карты могут выступать те же Zabbix или Fpinger. Но несмотря на избыточную информативность, с красотой у них не очень. Исправить это упущение взялся Micky Balladelli, применив для визуализации возможности Unity в виде набора приложений PSUnity.
Идея проста ― на определенном порту запускается сервер, а для добавления объектов мониторинга или изменения их статусов используется набор командлетов PowerShell. Клиент подключается к серверу и отображает получившуюся картину. Статусы объектов можно брать из привычной системы мониторинга – например, из Zabbix или SCOM.
При старте сервера без объектов можно наблюдать одинокого R2D2 в чистом поле:
Дроид, которого мы ищем.
По кнопке View можно переключать режимы ― ЦОД, планета, космос. Довольно пустынно.
Незаселенная планета мониторинга.
Ситуация меняется, когда мы начинаем добавлять объекты при помощи 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."
Указанная выше команда добавит сервер со зловещим описанием.
Добавили сервер на карту, и R2D2 начинает его изучать.
Для добавления города на планету и изменения его статуса можно использовать следующие команды:
Set-PSUnityCity -Session $Session -Name "Moscow" -Status 3
Set-PSUnityCity -Session $Session -Name "Saint Petersburg" -Status 1
Два города добавлены.
Еще один интересный вид ― это два ЦОДа с виртуальными машинами и их статусами. Добавим пару:
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
}
}
На выходе будет такой результат:
Виртуалки крутятся. Красота!
Скачать сам сервер с клиентом, набор командлетов и примеры скриптов можно в разделе releases проекта PSUnity. Раз мы уже добрались до Unity – самое время для пары незамысловатых игр на PowerShell.
Gamedev и PowerShell
Несколько лет назад мир «взорвала» игра под названием 2048. Изначально браузерный вариант получил множество адаптаций, в том числе и под мобильные устройства. Конечно же, нашелся и клон на PowerShell, созданный уже упомянутым Micky Balladelli. Скрипт доступен в блоге автора, в статье 2048 en Powershell.
Интерфейс игры.
В качестве второй популярной игры можно привести Flappy Bird, изначально созданную для мобильных устройств. Если вы уже успели в ярости разбить смартфон и забыть игру как страшный сон ― позвольте напомнить о ней клоном на PowerShell.
Сам клон доступен в репозитории Flappy Shell инженера Apoorv Verma.
Вспоминаем игру, собираем стены, получаем негатив.
В завершении статьи мне хотелось бы привести ссылку на адаптацию любимой игры детства ― Space Invaders. Решение на PowerShell доступно для загрузки в статье Adrian Milliner с говорящим названием Space Invaders. Скрипт – не просто скрипт, а полноценная игра со звуком. Осторожнее на работе.
Ностальгируем с PowerShell, борясь с инопланетными захватчиками.
Если у вас есть свои интересные и неординарные скрипты на PowerShell ― вы знаете что делать.
Автор: Tri-Edge