Перейти на главную страничку сайта (список статей, файлы для скачивания)
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 При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.