Перейти на главную страничку сайта (список статей, файлы для скачивания)

ФОРУМ (здесь можно обсудить эту статью, а также любые проблемы программирования на различных макроязыках и в скриптовых средах)

Обзор Windows Monad Shell (часть 1)

Windows Monad Shell (MSH) - это новый интерактивный командный интерпретатор и скриптовая технология для Windows, позволяющая администраторам эффективно и безопасно автоматизировать управление системными задачами как на рабочих компьютерах, так и на серверах. Monad Shell предоставляет скриптовый язык, позволяющий получить полный контроль над Windows и приложениями. Monad Shell бесплатна и доступна для скачивания на сайте Microsoft. На момент написания статьи актуальна версия v1.0 beta 3, требует наличия .NET Framework 2.0, совместима с Windows Server 2003 Service Pack 1 и Windows XP Service Pack 2.

Данная статья не является систематическим описанием синтаксиса языка, это всего лишь обзор с некоторыми примерами. Довольно много информации по Windows Monad Shell вы можете найти на сайте The Monad Information Centre, и конечно, на сайте Microsoft.

Чтобы запустить Monad Shell, запустите программу MSH.EXE, расположенную в каталоге, куда вы установили Monad Shell.

Cmdlet (произносится "команд-лет", с ударением на втором слоге) - это наименьший модуль функциональных возможностей в MSH, который является прямым аналогом встроенных команд в других оболочках. Cmdlet передаётся парой глагол-существительное (как правило - в единственном числе), разделенной "-", например:

Get-Process

Чтобы получать справочную информацию, пользуйтесь командами, подобными следующим:

Get-Help
Get-Help foreach
Get-Help Get-Process
Get-Process -?
Get-Help about_while

Среда MSH обеспечивает доступ к системным ресурсам через "диски" ("drives"). Эти "диски" обеспечивают доступ ко всем ресурсам подобно путям в файловой системе (например, доступ к ресурсам системного реестра). Чтобы отобразить список дисков MSH, используйте следующую команду:

Get-Drive

Чтобы изменять текущее местоположение (подобно команде cd в CMD.EXE), используйте команду Set-Location:

Set-Location c:\

Можно использовать псевдонимы, чтобы использовать имена команд, к которым вы привыкли, или чтобы для удобства укоротить имена команд, например:

Set-Alias proc Get-Process

Получить список уже назначенных псевдонимов можно так:

Get-Alias

Чтобы убрать псевдоним, удалите его с диска "alias":

remove-item alias:\proc

Список доступных команд можно отобразить с помощью подобных команд:

Get-Command
Get-Command clear*
Get-Command -noun alias

Последняя из вышеприведённых команд отображает все команд-леты с существительным "alias" (вторая часть команд-лета).

Команд-лет Get-Command также может отыскать информацию о выполнимых программах, не являющимися команд-летами, используя переменную среды PATH:

Get-Command notepad

Подсказку среды можно изменить с помощью задания функции prompt:

Function Prompt { "Hello! > " }
Function Prompt { "$(get-location)> " }

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

Команды могут быть объединены в файлы-сценарии, и сценарии языка MSH могут быть выполнены из сеанса MSH.EXE. Файлы-сценарии должны иметь расширение .msh. Чтобы выполнить сценарий MSH, просто напечатайте имя файла сценария без расширения. Оболочка будет разыскивать сценарии, пользуясь переменной $ENV:PATH и выполнит первый сценарий с указанным именем. При вызове сценария после его имени можно указать параметры:

myscript arg1 arg2

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

. mshscript arg1 arg2

Вы можете переадресовать вывод в файл, используя оператор переназначения ">":

Get-Date > test.txt

Если вы хотите дописать вывод в конец существующего файла, используйте ">>".

Текущий beta-релиз не поддерживает ввод в с переназначением, т.е. оператор переназначения "<" в настоящее время не поддерживается.

Обзор синтаксиса языка

Язык MSH подобен многим языкам высокого уровня. Вот несколько примеров работы с числами, строками, переменными и выражениями:

MSH> 2+2 #комментарий (перед решёткой пробел)
4
MSH> "Hello" + " world"
Hello world
MSH> $a = "hi"
MSH> $a.length * 13
26
MSH> (Get-Date).year * 2
4012
MSH> ((Get-Date).year + 25) - (Get-Date).year
25

В отличие от большинства оболочек, которые обрабатывают почти всё как строки, MSH будет пытаться сохранять информацию типа, где это возможно. Синтаксический анализатор будет также пытаться конвертировать объекты одного типа к другому, где это возможно.

Можно преобразовать тип явно:

[int]"001"

Если значение невозможно преобразовать к указанному типу, будет выдано сообщение об ошибке.

Операторы присваивания:    =   +=   -=   *=   /=   %=    (знак процента означает остаток от деления).

Работа с массивами:

MSH> $a = 1,2,3,4
MSH> $a
1
2
3
4
MSH> $a[2]=25
MSH> $a[2]
25
MSH> $a
1
2
25
4
MSH> $a = 1,2,3,4,5,6,7,8,9
MSH> $a[0,3]
1
4
MSH> $a[2..7]
3
4
5
6
7
8
MSH> $a[2,3+6..8]
3
4
7
8
9

Оператор "+" добавляет элемент к массиву:

MSH> $a = 1,2,3
MSH> $a + 4
1
2
3
4

Работа с ассоциативными массивами:

MSH> $a = @{ one = 1; two = 2; three = 3}
MSH> $a

Key                            Value
---                            -----
two                            2
three                          3
one                            1
MSH> $a.two="yes"
MSH> $a

Key                            Value
---                            -----
two                            yes
three                          3
one                            1

MSH> $a['two']
2

Оператор "+" позволяет добавить новую пару ключ-значение к словарю. Важно: порядок, в котором хранятся пары ключ-значение, всегда произволен (пары не сортируются).

MSH> $a = @{ one = 1; two = 2; three = 3}
MSH> $a += @{ four = 4 }
MSH> $a

Key                            Value
---                            -----
four                           4
two                            2
three                          3
one                            1

Работа с шестнадцатеричными значениями:

MSH> $a = 0x10
MSH> $a
16

Конкатенация строк:

MSH> $a="абв"
MSH> $b="где"
MSH> $a+$b
абвгде
MSH> $a *= 3
MSH> $a
абвабвабв

Специальные суффиксы k, m, g:

MSH> $a=2k
MSH> $a
2048
MSH> $a=2m
MSH> $a
2097152
MSH> $a=2g
MSH> $a
2147483648

Команда Set-Variable позволяет устанавливать атрибуты переменной:

MSH> Set-Variable a 25 -Option ReadOnly
MSH> $a
25
MSH> $a=0
Cannot overwrite variable a because it is read-only or constant.
At line:1 char:3
+ $a= <<<< 0
MSH>

Несколько переменных могут получить значения в единственной инструкции. Первая переменная получит первое значение, вторая - второе, и т.д., последняя переменная получит оставшиеся значения. Если определено больше переменных, чем значений, оставшиеся переменные получат null.

MSH> $a = 1,2,3,4,5,6
MSH> $first, $second, $rest = $a
MSH> $first
1
MSH> $rest
3
4
5
6

Вы можете делать цепные присваивания, как на некоторых других языках:

MSH> $a = $b = $c = $d = 1
MSH> $b
1

Переменные MSH могут иметь любой тип .NET. Вы можете определить тип переменной в момент присваивания.

$a = [xml]"<test><a>avalue</a></test>"

Значения типов в квадратных скобках могут быть следующими: array, bool, byte, char, char[], decimal, double, float, int, int[], long, long[], regex, single, scriptblock, string, type, xml.

Кроме того, можно использовать любой полностью квалифицированный тип .NET, доступный в текущем процессе, например:

MSH> $d=[System.DateTime]"31/05/2004"
MSH> $d

31 мая 2004 г. 0:00:00

MSH>

Вы можете явно указать тип переменной, тогда все попытки присвоить этой переменной значения других типов будут терпеть неудачу:

MSH> [int]$a="4"
MSH> $a = "string"
Cannot convert "string" to "System.Int32". Error: "Input string was not in a co
rrect format."

Унарные операторы "++" и "--" имеют различное поведение в зависимости от того, используются ли они в инструкции или в выражении:

MSH> $a = 0
MSH> $a++
MSH> $a
1
MSH> $b = 1,2,3,4
MSH> $b[$a++]
2
MSH> $b[$a]
3
MSH>

Переменные и другие элементы данных могут создаваться в различных контекстах. Данные глобального контекста видимы во всех контекстах. Данные контекста скрипта видимы во всех контекстах в пределах этого файла сценария. Данные локального контекста видимы только в текущем контексте и его дочерних контекстах. Данные приватного контекста видимы только в нём самом. Контекст создаётся в теле функции. Диски могут также быть созданы для определенного контекста; при выходе из контекста такие диски удаляются.

$global:a = 4
$script:a = 5
$local:a  = 3 
$private:a = 6

Переменные могут использоваться как параметры для команд, и их значения будут преобразовываться к типу параметра. Чтобы удалить переменную, используйте команду remove-variable или удалите переменную с диска variable командой remove-item:

MSH> $a = get-process
MSH> remove-variable a
MSH> $a = get-process
MSH> remove-item variable:\a

Вы можете использовать вывод одной команды как параметр другой команды (или часть выражения) с помощью знака $.

Get-ChildItem $(Read-Host –Prompt "Enter FileName: ")
"My location is $(Get-Location)"

Поддерживаются условные выражения If/elseif/else и switch как часть языка. Для блоков сценария, которые следуют после If/elseif/else и switch, требуются фигурные скобки.

if ( $a -lt 5 ) { "$a is less than 5"
} elseif ( $a –gt 10 ) { "$a is greater than 10"
} else { "$a is greater than 5 and less than 10" }
switch ($a) {
1 {"got one"} 
2 {"got two"} 
3 {"got three"}}

В операторе switch специальная переменная $_ представляет текущее оцениваемое значение.

MSH> $a = 123
MSH> switch ($a) {
1 { "один"; break }
default { $_ ; break }}

Обработка исключений:

MSH> $i = 3; while ($i -ge -3) {
trap [DivideByZeroException] {  "деление на ноль"; continue }
1 / $i--
}

Циклы:

MSH> $a = 0; while($a -lt 10) { $a; $a++ }
MSH> $a = 0; do { $a } while ( $a++ -lt 3 )
MSH> $a = 0; do { $a } until ( $a++ -gt 3 )
MSH> foreach ($var in Get-Process |Sort-Object Name) { $var.Name }

Операторы сравнения, которые могут использоваться в конструкциях if/while:


Без учёта регистраС учётом регистраОписание
-lt-cltМеньше чем
-le-cleМеньше или равно чем
-gt-cgtБольше чем
-ge-cgeБольше или равно чем
-eq-ceqРавно
-ne-cneНе равно
-contains-ccontains Определяет элементы в группе, возвращается булев $True или $False.
-notcontains-cnotcontains Определяет элементы не в группе, возвращается булев $True или $False.
-like-clike Подобно - использует подстановочные знаки для сопоставления с образцом.
-notlike-cnotlike Не подобно - использует подстановочные знаки для сопоставления с образцом.
-match-cmatch Соответствие - использует регулярные выражения для сопоставления с образцом.
-notmatch-cnotmatch Несоответствие - использует регулярные выражения для сопоставления с образцом.
-bandПоразрядное И.
-borПоразрядное ИЛИ.
-isИмеет тип.
-isnotНе имеет тип.

Другие операторы:


+
-
*
/
Арифметические действия.
%Остаток от деления.
-not
!
Логическое НЕ.
-band
-bor
-bnot
Двоичное И, ИЛИ, НЕ.
-replace
-ireplace
Замена (нечувствительно к регистру). Пример: "abcde" -replace "b","B"
-сreplaceЗамена (чувствительно к регистру).
-and
-or
И, ИЛИ.
-is
-isnot
Имеет (не имеет) тип. Пример: $a -is [int]
-asПреобразовывает к типу. Пример: 1 -as [string]
..Оператор диапазона. Пример: foreach ($i in 1..10) {$i }
&
. (точка с пробелом)
Оператор вызова. Пример: $a = "Get-ChildItem"; &$a
-F Оператор формата. Пример: foreach ($p in Get-Process) { "{0,-15} has {1,6} handles" –F $p.processname,$p.Handlecount }

Людоговский Александр

Перейти на главную страничку сайта (список статей, файлы для скачивания)

© 2007 http://www.script-coding.com При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.