В качестве примера я написал плагин, который позволяет управлять воспроизведением музыки в Monad (полный код можно найти в [4]). Ниже приведена реализация команды play-nextsong на языке C#, которая переключает воспроизведение на следующую композицию:
[Cmdlet(«play», «nextsong»)]
public class PlayNextSongCommand : Cmdlet
protected override void EndProcessing
Media.Player.controls.next;
Этого достаточно чтобы пользователь смог найти команду и узнать, как с ней работать:
Media:\Slayer\Reign In Blood> get-command play*
Command Type Name Definition
– – –
Cmdlet play-nextsong play-nextsong [-Verbose…
Cmdlet play-previoussong play-previoussong [-Ver…
Cmdlet play-song play-song [[-MshPath] S…
Можно усложнить команду, добавив к ней несколько параметров. Даже если разработчик не позаботился о документации, пользователь сможет получить автоматически генерируемую справку о формате ее вызова и типах параметров:
Media:\Slayer\Reign In Blood> get-command play-nextsong –Synopsis
play-nextsong [[-SkipSongCount] Int32] [-Verbose] [-Debug] [-ErrorAction ActionPreference] [-ErrorVariable String] [-OutVariable String] [-OutBuffer Int32]
А вот так выглядит листинг содержимого текущей директории. Директория не обязательно файловая, это может быть контейнер любых объектов, в нашем случае это альбом, а содержимое – композиции:
Media:\Slayer\Reign In Blood> ls
Number Name AlbumName ArtistName Year
– – – –
1 Angel of Death Reign In Blood Slayer 1986
2 Piece By Piece Reign In Blood Slayer 1986
3 Necrophobic Reign In Blood Slayer 1986
Что же дает Monad различным категориям пользователей? Программисты, например, смогут ускорить реализацию интерфейсов управления к разрабатываемым системам. Для того чтобы создать новую команду, достаточно унаследовать свой класс от класса Cmdlet и вызвать из него специфичную функцию системы (см. врезку). Отметим, что, реализовав интерфейс управления к своей программе таким образом, разработчик не ограничивается только командной строкой. Стандартная графическая консоль управления Microsoft Management Console (MMC), используемая в Windows XP и Vista, будет понимать модули, написанные для Monad.
Администраторам разнородных сетей, безусловно, будет удобнее управлять Windows-системами, с помощью привычного интерфейса командной строки. Инструменты управления DNS и Active Directory с навигацией, реализованной в виде иерархической структуры, тоже разрабатываются, и их можно найти в Интернете.
Администраторы смогут скомпоновать из разных блоков командную оболочку для определенных типов задач. Ее можно указать в качестве сценария запуска (login shell) при входе определенной группы пользователей в систему – локально или удаленно. Тем самым можно ограничивать функции, доступные пользователям, а требования к пропускной способности канала в случае распределенной системы будут минимальными, достаточными для протокола telnet.
Ну а продвинутые юзеры, знающие .NET или использующие готовые скрипты (см. ссылки в конце статьи), получают мощный инструмент управления системой и повышения эффективности работы. Не должно вызвать трудностей и освоение команд и синтаксиса нового языка, так как их именование стандартизовано.
Не могу удержаться от соблазна сразу же привести пример. Людям, знающим предметную область, он многое объяснит.
Требуется написать скрипт, принудительно завершающий в системе три процесса, которые отъедают наибольшее количество процессорного времени и у которых значение этого параметра больше трех.
Я попросил специалиста Unix shell быстро, не зарываясь в man, написать такой скрипт.
Решение SH:
%>ps -A -sort ‘%cpu’ -format ‘%cpu,pid’ | egrep -v ‘^ (0|1|2).’ | grep -v ‘%CPU’ | tail –n3 | gawk ‘{print $2;}’ | xargs -r kill
Скрипт написан за семь минут, работает, и я его привожу как есть – без исправлений. Не буду объяснять, как он работает, отмечу лишь, что главной проблемой является необходимость выделения из набора строк, возвращаемых командой ps, нужные нам параметры процессов (в данном случае – процессоное время).
Я уверен, что есть более правильные варианты, но они потребуют детального знания возможностей большого числа утилит.
Решение Monad:
C:\> get-process | where-object { $_.cpu -gt 3 } | sort-object -property cpu | select-object -Last 3 | foreach-object { $_.Kill }
get-process – функция, возвращающая массив объектов типа System.Diagnostics.Process;
where-object – функция условия, которая сравнивает значение свойства с тройкой;
$_ – переменная, содержащая элемент массива – объект класса Process;
sort-object, select-object – сортировка и фильтрация массивов;
foreach-object – выполнить код для каждого элемента, в нашем случае – вызвать метод объекта – Kill
Эту же строку можно написать с использованием алиасов:
C:\> ps | where { $_.cpu -gt 3 } | sort cpu | select -Last 3 | foreach { $_.Kill }
Читаемость варианта Monad даже не имеет смысл сравнивать с SH-скриптом. Написано за минуту.