Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #91, ИЮЛЬ 2006 г.

Могучий шелл

Naked Snake

Хакер, номер #091, стр. 091-040-3


Для удобства использования многие команды можно вызвать так, как если бы ты работал в юниксе. Cat покажет содержимое файла, ls выведет список файлов и папок в текущей директории, а history освежит память пользователя, выдав последние набранные команды. Хотя в PowerShell для этого используется Get-Content, Get-ChildItem, Get-History. Все это осуществляется на базе специальных псевдонимов (алиасов). Узнать соответствия псевдонимов настоящим командам можно, набрав в консоли команду alias.

Псевдонимы и сценарии

Интерпретатор поддерживает С#-подобный скриптовый язык, который использует такие возможности шарпа, как циклы (for,while,foreach), условия(if,switch), определение своих собственных пользовательских функций и ограничение видимости переменных (global/script/local/private). Кроме того, можно использовать регулярные выражения, например, в case-блоках оператора switch:

switch -regex ($var)

{

".*[0-9]+" { "строка заканчивается числом!" }

default { "строка не заканчивается числом." }

}

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

Допустим, у нас в папке вперемешку свалены куча разных файлов и статья для Х с расширением doc. Легким движением руки мы получаем информацию о всех документах Word’а:

Get-ChildItem | sort-object extension | select name, length, extension | where { $_.extension -eq ".doc" }

Name Length Extension

---- ---- ---------

about_msh_for_step.doc 16789 .doc

Чтобы добиться результата, я использовал несколько cmdlets. Данные между ними последовательно передаются с помощью так называемого пайпа (| — полный аналог из bash’а). Если читать команду дословно, то получается такая картина: вывести файлы, отсортированные по расширению, с информацией об имени файла, размере и расширении, которые удовлетворяют требованию «расширение равно .doc». Все просто и логично. Браво, MS!

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

Сценарии PowerShell представляют собой обычные текстовые файлы с расширением ps1 (в старых версиях — .msh). Попробуем написать простенький сценарий, в котором определим функцию для вывода общего количества файлов в заданном каталоге и их общего размера. На практике это реализуется очень просто.

function dir_size

{

param ($dir)

$list = get-childitem $dir

foreach ($ob in $list)

{

$i++;

$size = $size + $ob.Length;

}

write-host "Размер директории: " $size "Она содержит " $i "элементов"

set-alias dsz dir-size

}

С помощью команды param мы присваиваем переменной $dir значение, которое было переделано в качестве параметра функции (если бы их было несколько, то нужно было бы последовательно указывать несколько переменных через запятую), далее получаем список директории и заносим его в переменную $list. Для каждого элемента этого списка делается следующее: увеличивается счетчик общего количества данных (переменная $i), а к переменной $size прибавляется размер текущего объекта. Далее информация выводится на экран посредством команды Write-host, а также назначается короткий алиас для быстрого вызова команды. Запустить скрипт очень просто — ./”DirSize.ps1”. Другой вариант — записать функцию в профайл, речь о котором пойдет ниже.

Назад на стр. 091-040-2  Содержание  Вперед на стр. 091-040-4