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

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

Настройка Windows Monad Shell

Здесь рассматриваются некоторые практические приёмы работы с Windows Monad Shell, которые помогут сохранить время и повысить удобство работы с этой оболочкой.

Использование скриптов (сценариев)

Подобно cmd.exe, MSH может исполнить команды из файла (вместо ввода команд с клавиатуры). Это даёт возможность создать сценарии любой сложности, сохранив эти сценарии на диск. Можно создать библиотеку сценариев, которые решают рутинные повторяющиеся задачи. Сценарии MSH могут быть сохранены в простых текстовых файлах с расширением .msh точно так же, как сценарии cmd.exe могут быть сохранены в текстовых файлах с расширением .bat или .cmd.

Пример простейшего сценария:

get-process | where-object { $_.Handles -gt 500 }

После сохранения сценарий может быть исполнен в оболочке простым указанием его пути и имени. Кроме того, если сценарий расположен в текущем рабочем каталоге, текущий путь может быть определен как .\ИмяФайла.msh.

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

MSH> .\test.msh | sort-object Handles | format-list ProcessName,Handles

Можно добавить к сценарию комментарии, используя символ #. Любые символы после этого (на той же самой строке) при выполнении сценария игнорируются.

Любой сценарий можно подписать. Для этого необходимо выполнить такие команды:

MSH> $cert = get-childitem cert:\CurrentUser\My -CodeSigning
MSH> Set-AuthenticodeSignature myscript.msh $cert

Чтобы выполнить сценарий из командной строки (меню "Пуск" - "Выполнить"), напечатайте команду, подобную следующей:

msh C:\test.msh

Программа msh.exe выполнит скрипт и завершит работу. Если папка сценария находится в переменной среды %PATH%, будет достаточно указать только имя файла.

Для отладки скриптов можно воспользоваться командой set-mshdebug (см. встроенную справку по ней, например, командой get-help set-mshdebug). Например, следующая команда включает режим вывода сообщений о каждой выполненной строке сценария:

set-mshdebug -trace 1

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

set-mshdebug -trace 2

Следующая команда включает режим пошагового исполнения:

set-mshdebug -step

Следующая команда выключает режим отладки:

set-mshdebug -off

Назначение псевдонимов

Для удобства можно установить ваши собственные псевдонимы для любых часто используемых команд, например, чтобы сократить написание этих команд. Однако, если функционирование вашего сценария зависит от целого списка пользовательских псевдонимов, без длинной последовательности команд set-alias в начале сценария может быть затруднено перемещение этого сценария на другие машины или его совместное использование.

Команда get-alias, вызванная без параметров, перечисляет все активные псевдонимы. Можно просмотреть значение конкретного псевдонима, передав его команде get-alias, например:

get-alias echo

Чтобы создать псевдоним, используется команда set-alias, и требуется два параметра: сначала псевдоним, а затем произвольное целевое имя:

MSH> set-alias e write-object
MSH> e "Hello, World!"
"Hello, World!"

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

Поскольку псевдоним может указать только на одного адресата одновременно, set-alias перезапишет любое предыдущее значение псевдонима. Можно удалить определяемые пользователем псевдонимы с помощью команды remove-item alias:myalias, но встроенные псевдонимы не могут быть изменены. Встроенные псевдонимы устанавливаются при запуске оболочки и всегда доступны.

Поскольку имена файлов, псевдонимов, команд и других программ могут потенциально совпасть, MSH интерпретирует их в следующем порядке:

Псевдонимы не могут включать параметры команд (эту проблему можно решить с помощью функций). Несколько псевдонимов могут указывать на один и тот же команд-лет (команду). Например, вот так можно увидеть все псевдонимы команды get-process:

get-alias | where-object {$_.Definition -eq "get-process"}

Работа с командной строкой

Возможность редактировать текущую команду различными способами и быстро выбирать предыдущие команды является полезным инструментом при работе в оболочке (и эти возможности cmd.exe продолжают работать в MSH). MSH унаследовала также и работу функциональных клавиш (например, F7 - список последних введённых команд).

Команд-лет get-history выдаёт содержание буфера хронологии команд. Вот, например, некоторая выборка ранее введённых команд (со словом "get-"):

get-history | where-object {$_.CommandLine -like "get-*"}

Вышеприведённая команда выдаёт список команд с номерами (Id), и мы можем использовать номер ранее выполненной команды для её немедленного повторного выполнения с помощью команды

invoke-history НомерКоманды

При работе со многими командами часто бывает удобным помещать команду на нескольких строках. Чтобы остановить попытку MSH выполнить первую строку, как только её ввели, используется escape-символ (`) в конце первой строки многострочной команды. В конце, для выхода из многострочного режима и выполнения команды просто вводится пустая строка:

MSH> get-childitem `
>>| sort Name

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

По умолчанию буфер хронологии хранит последние 64 команды, но это легко изменить. Значение лимита сохранено в переменной MSH с именем $MaximumHistoryCount.

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

get-history -Count 6 | format-table -HideTableHeader CommandLine

Можно переадресовать этот вывод в файл, добавив к этой команде путь к файлу через символ >. Если команды, которые вы хотите сохранить, рассеяны по хронологии, возможно проще вызвать get-history без параметров, а затем отредактировать полученный файл в текстовом редакторе.

MSH предоставляет авто-завершение по нажатию Tab. В пустой командной строке нажатие клавиши табуляции вставит в командную строку имя первого файла в текущем каталоге. Следующее нажатие заменит это следующим файлом, и так далее. MSH также предлагает авто-завершение названий команд-летов. Например, используйте get-[Tab], чтобы циклически обойти все get-* команд-леты.

Сценарии, выполняемые при запуске оболочки

Создадим файл с именем profile.msh в каталоге MSH папки Мои Документы. При запуске MSH ищет такой сценарий и выполняет его. Пример такого сценария:

# псевдонимы
set-alias ms get-member
set-alias prop get-property
set-alias displaytext write-object

# функции
function prompt { "$((get-date).Month)/$((get-date).Day) " }
function day { (get-date).Day }

# размер истории буфера команд
$MaximumHistoryCount=1024

# приветственное сообщение
"Welcome to MSH, " + $env:Username

Примечание: функция prompt выполняется каждый раз при отображении подсказки.

Перечень сценариев, разыскиваемых и запускаемых при старте MSH, можно найти в этой статье.

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

MSH вводит несколько так называемых "вездесущих" параметров, которые являются доступными во всех командах. Команды -Verbose, -WhatIf и -Confirm помогают вам определить заранее, что произойдёт при выполнении команды (прежде, чем команда выполнится).

Пример использования параметра -WhatIf (что, если...?) для команды, удаляющей файлы:

get-childitem . *.bak -Recurse | remove-item -WhatIf

Вышеприведённая команда не удалит файлы, а только сообщит, какие файлы были бы удалены при настоящем выполнении.

Параметр -Verbose поможет сохранить лог выполнения команды (можно перенаправить вывод в файл). Например, remove-item будет явно сообщать о файлах, которые она удаляет (не запускайте это):

get-childitem -Recurse -Filter *.bak | remove-item -Verbose

Параметр -Confirm будет требовать подтверждения от пользователя для выполнения каждой операции. Например, вот так может выглядеть закрытие всех окон iexplore.exe:

get-process iexplore | stop-process -Confirm

Переменные $WhatIfPreference и $ConfirmPreference могут использоваться, чтобы изменить параметры по умолчанию -WhatIf, и -Confirm для тех команд-летов, которые их поддерживают (т.е. практически для всех команд-летов).

Параметр -? также доступен везде и эквивалентен вызову get-help с именем команд-лета.

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

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

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