Введение в оболочку командной строки Windows PowerShell. Введение в оболочку командной строки Windows PowerShell
Скачать 368 Kb.
|
Введение в оболочку командной строки Windows PowerShellНа настоящий момент мы рассмотрели уже три разных инструмента, предназначенных для автоматизации работы в операционной системе Windows: оболочки командной строки Cmd.exe и WMIC, а также сервер сценариев WSH. Зачем же компании Microsoft понадобилась разработка еще одной полностью новой оболочки командной строки со своим языком сценариев? Причины и цели создания новой оболочкиЧтобы ответить на этот вопрос, вспомним основные требования к "идеальному" средству автоматизации, которые мы обсуждали в первой лекции, и посмотрим, в какой степени удовлетворяют этим требованиям перечисленные выше инструменты (табл.16.1).
Как мы видим, у каждого из рассмотренных нами ранее инструментов автоматизации присутствовали довольно серьезные недостатки, не позволявшие сказать, что Windows обладает по-настоящему мощным и эффективным средством для работы с командной строкой и написания сценариев. Новая оболочка Windows PowerShell (предварительно она была названа Monad) была задумана разработчиками Microsoft как более мощная среда для написания сценариев и работы из командной строки. Разработчики PowerShell преследовали несколько целей. Главная и самая амбициозная из них – создать среду составления сценариев, которая наилучшим образом подходила бы для современных версий операционной системы Windows и была бы более функциональной, расширяемой и простой в использовании, чем какой-либо аналогичный продукт для любой другой операционной системы. В первую очередь эта среда должна была подходить для решения задач, стоящих перед системными администраторами (тем самым Windows получила бы дополнительное преимущество в борьбе за сектор корпоративных платформ), а также удовлетворять требованиям разработчиков программного обеспечения, предоставляя им средства для быстрой реализации интерфейсов управления к создаваемым приложениям. Для достижения этих целей были решены следующие задачи: Обеспечение прямого доступа из командной строки к объектам COM, WMI и .NET. В новой оболочке присутствуют команды, позволяющие в интерактивном режиме работать с COM-объектами, а также с экземплярами классов, определенных в информационных схемах WMI и .NET. Организация работы с произвольными источниками данных в командной строке по принципу файловой системы. Например, навигация по системному реестру или хранилищу цифровых сертификатов выполняется из командной строки с помощью аналога команды CD интерпретатора Cmd.exe. Разработка интуитивно понятной унифицированной структуры встроенных команд, основанной на их функциональном назначении. В новой оболочке имена всех внутренних команд (в PowerShell они называются командлетами) соответствуют шаблону "глагол-существительное", например, Get-Process (получить информацию о процессе), Stop-Service (остановить службу), Clear-Host (очистить экран консоли) и т.д. Для одинаковых параметров внутренних команд используются стандартные имена, структура параметров во всех командах идентична, все команды обрабатываются одним синтаксическим анализатором. В результате облегчается запоминание и изучение команд. Обеспечение возможности расширения встроенного набора команд. Внутренние команды PowerShell могут дополняться командами, создаваемыми пользователем. При этом они полностью интегрируются в оболочку, информация о них может быть получена из стандартной справочной системы PowerShell. Организация поддержки знакомых команд из других оболочек. В PowerShell на уровне псевдонимов собственных внутренних команд поддерживаются наиболее часто используемые стандартные команды из оболочки Cmd.exe и Unix-оболочек. Например, если пользователь, привыкший работать с Unix-оболочкой, выполнит ls, то он получит ожидаемый результат: список файлов в текущем каталоге (то же самое относится к команде dir). Разработка полноценной встроенной справочной системы для внутренних команд. Для большинства внутренних команд в справочной системе дано подробное описание и примеры использования. В любом случае встроенная справка по любой внутренней команде будет содержать краткое описание всех ее параметров. Реализация автоматического завершения при вводе с клавиатуры имен команд, их параметров, а также имен файлов и папок. Данная возможность значительно упрощает и ускоряет ввод команд с клавиатуры. Главной особенностью среды PowerShell, отличающей ее от всех других оболочек командной строки, является то, что единицей обработки и передачи информации здесь является объект, а не строка текста. Отличие PowerShell от других оболочек – ориентация на объектыПри разработке любого языка программирования одним из основных является вопрос о том, какие типы данных и каким образом будут в нем представлены. При создании PowerShell разработчики решили не изобретать ничего нового и воспользоваться унифицированной объектной моделью .NET. Данный выбор был сделан по нескольким причинам. Во-первых, платформа .NET повсеместно используется при разработке программного обеспечения для Windows и представляет, в частности, общую информационную схему, с помощью которой разные компоненты операционной системы могут обмениваться данными друг с другом. Во-вторых, объектная модель .NET является самодокументируемой: каждый объект .NET содержит информацию о своей структуре. При интерактивной работе это очень полезно, так как появляется возможность непосредственно из командной строки выполнить запрос к определенному объекту и увидеть описание его свойств и методов, то есть понять, какие именно манипуляции можно проделать с данным объектом, не изучая дополнительной документации с его описанием. В-третьих, работая в оболочке с объектами, можно с помощью их свойств и методов легко получать нужные данные, не занимаясь разбором и анализом символьной информации, как это происходит во всех традиционных тексто-ориентированных оболочках командной строки. Рассмотрим пример. В Windows XP есть консольная утилита tasklist.exe, которая выдает информацию о процессах запущенных в системе: C:\>tasklist Имя образа PID Имя сессии № сеанса Память ========================= ====== ================ ======== ============ System Idle Process 0 0 16 КБ System 4 0 32 КБ smss.exe 560 0 68 КБ csrss.exe 628 0 4 336 КБ winlogon.exe 652 0 3 780 КБ services.exe 696 0 1 380 КБ lsass.exe 708 0 1 696 КБ svchost.exe 876 0 1 164 КБ svchost.exe 944 0 1 260 КБ svchost.exe 1040 0 10 144 КБ svchost.exe 1076 0 744 КБ svchost.exe 1204 0 800 КБ spoolsv.exe 1296 0 1 996 КБ kavsvc.exe 1516 0 9 952 КБ klnagent.exe 1660 0 5 304 КБ klswd.exe 1684 0 64 КБ Предположим, что мы в командном файле интерпретатора Cmd.exe с помощью этой утилиты хотим определить, сколько оперативной памяти тратит процесс kavsvc.exe. Для этого нужно выделить из выходного потока команды tasklist соответствующую строку, извлечь из нее подстроку, содержащую нужное число и убрать пробелы между разрядами (при этом следует учесть, что в зависимости от настроек операционной системы разделителем разрядов может быть не пробел, а другой символ). В PowerShell аналогичная задача решается с помощью команды get-process, которая возвращает коллекцию объектов, каждый из которых соответствует одному запущенному процессу. Для определения памяти, затрачиваемой процессом kavsvc.exe, нет необходимости в дополнительных манипуляциях с текстом, достаточно просто взять значение свойства WS объекта, соответствующего данному процессу. Наконец, объектная модель .NET позволяет PowerShell напрямую использовать функциональность различных библиотек, являющихся частью платформы .NET. Например, чтобы узнать, каким днем недели было 9 ноября 1974 года, в PowerShell можно выполнить следующую команду: (get-date "09.11.1974").DayOfWeek В этом случае команда get-date возвращает .NET-объект DateTime, имеющий свойство, при обращении к которому вычисляется день недели для соответствующей даты. Таким образом, разработчикам PowerShell не нужно создавать специальную библиотеку для работы с датами и временем – они просто берут готовое решение в .NET. Загрузка и установка PowerShellОболочка PowerShell может работать не во всех версиях операционной системы, ее можно использовать в Windows XP SP 2, Windows Server 2003 SP 1 и более поздних версиях. Кроме этого, в системе должна быть установлена платформа .NET Framework 2.0 (в Windows XP данную среду придется устанавливать дополнительно, дистрибутив можно загрузить с сайта Microsoft по адресу http://msdn.microsoft.com/netframework/downloads/updates/default.aspx). Загрузить PowerShell можно с сайта Microsoft, открыв страницу http://microsoft.com/powershell, где имеются ссылки на файл установки последней версии и пакеты документации на разных языках. Запустив загруженный файл, следуйте указаниям мастера установки. В 32-разрядных версиях Windows оболочка PowerShell устанавливается по умолчанию в каталог %SystemRoot%\System32\WindowsPowerShell\v1.0. В 64-разрядных версиях Windows 32-разрядная версия PowerShell устанавливается в каталог %SystemRoot%\SystemWow64\WindowsPowerShell\v1.0, а 64-разрядная версия Windows PowerShell устанавливается в каталог %SystemRoot%\System32\WindowsPowerShell\v1.0. Запуск оболочки. Выполнение командУстановив оболочку в системе, можно начать новый интерактивный сеанс. Для этого следует нажать на кнопку Пуск (Start), открыть меню Все программы (All Programs) и выбрать элемент Windows PowerShell. Другой вариант запуска оболочки – пункт Выполнить… (Run) в меню Пуск (Start), ввести имя файла powershell и нажать кнопку OK. В результате откроется новое командное окно с приглашением вводить команды (рис. 16.1). увеличить изображение Рис. 16.1. Командное окно оболочки PowerShell Выполним первую команду в PowerShell. Пусть это будет что-то знакомое, например dir (команды в PowerShell обрабатываются без учета регистра). На экран будет выведен список файлов в текущем каталоге: PS C:\Documents and Settings\User> dir Каталог: Microsoft.PowerShell.Core\FileSystem::C:\Documents and Settings\User Mode LastWriteTime Length Name ---- ------------- ------ ---- d---s 14.12.2007 10:10 Cookies d---- 12.05.2005 17:16 DoctorWeb d---- 06.11.2004 13:03 Phone Browser d---s 22.09.2004 23:49 UserData d-r-- 04.10.2004 15:33 Главное меню d-r-- 05.12.2007 0:49 Избранное d-r-- 31.10.2007 21:03 Мои документы d---- 05.12.2007 10:54 Рабочий стол -a--- 24.05.2006 21:22 8304 gsview32.ini Типы команд PowerShellВ оболочке PowerShell поддерживаются команды четырех типов: командлеты, функции, сценарии и внешние исполняемые файлы. Первый тип – так называемые командлеты (cmdlet). Этот термин используется пока только внутри PowerShell. Командлет представляет собой класс .NET, порожденный от базового класса Cmdlet ; разрабатываются командлеты с помощью пакета PowerShell Software Developers Kit (SDK). Единый базовый класс Cmdlet гарантирует совместимый синтаксис всех командлетов, а также автоматизирует анализ параметров командной строки и описание синтаксиса командлетов для встроенной справки. Данный тип команд компилируется в динамическую библиотеку (DLL) и подгружается к процессу PowerShell во время запуска оболочки (то есть сами по себе командлеты не могут быть запущены как приложения, но в них содержатся исполняемые объекты). Так как компилированный код подгружается к процессу оболочки, данный тип команд выполняется наиболее эффективно. Командлеты – это аналог внутренних команд традиционных оболочек. Следующий тип команд – функции. Функция – это блок кода на языке PowerShell, имеющий название и находящийся в памяти до завершения текущего сеанса командной оболочки. Функции, как и командлеты, поддерживают именованные параметры. Анализ синтаксиса функции производится один раз при ее объявлении. Сценарий – это блок кода на языке PowerShell, хранящийся во внешнем файле с расширением ps1. Анализ синтаксиса сценария производится при каждом его запуске. Последний тип команд – внешние исполняемые файлы, которые выполняются обычным образом операционной системой. Имена и структура командлетовКак уже было отмечено выше, в PowerShell аналогом внутренних команд являются командлеты. Командлеты могут быть очень простыми или очень сложными, но каждый из них разрабатывается для решения одной, узкой задачи. Работа с командлетами становится по-настоящему эффективной при использовании их композиции (конвейеризации объектов между командлетами). Подробнее об этом мы поговорим на следующей лекции. Имена командлетов всегда соответствуют шаблону "глагол-существительное", где глагол задает определенное действие, а существительное определяет объект, над которым это действие будет совершено. Например, Get-Process (получить информацию о процессе), Stop-Service (остановить службу), Clear-Host (очистить экран консоли) и т.д. Чтобы просмотреть список командлетов, доступных в ходе текущего сеанса, нужно выполнить командлет Get-Command: PS C:\> Get-Command CommandType Name Definition ----------- ---- ---------- Cmdlet Add-Content Add-Content [-Path] Cmdlet Add-History Add-History [[-InputObject] ] [-Pass... Cmdlet Add-Member Add-Member [-MemberType] [-Name]... Cmdlet Add-PSSnapin Add-PSSnapin [-Name] Cmdlet Clear-Content Clear-Content [-Path] Cmdlet Clear-Item Clear-Item [-Path] ... 16.1. По умолчанию командлет Get-Command выводит сведения в трех столбцах: CommandType, Name и Definition. При этом в столбце Definition отображается синтаксис командлетов (многоточие ( … ) в столбце синтаксиса указывает на то, что данные обрезаны). Командлеты могут иметь параметры, к которым можно обратиться по имени, перед которым ставится дефис ( - ), или по позиции (в последнем случае интерпретация параметра будет выполняться в зависимости от его местоположения в командной строке). Замечание Косые черты ( / и \ ) вместе с параметрами в оболочке Windows PowerShell не используются. В общем случае синтаксис командлетов имеет следующую структуру: имя_командлета –параметр1 -параметр2 аргумент1 аргумент2 Здесь параметр1 – параметр (переключатель), не имеющий значения; параметр2 – имя параметра, имеющего значение аргумент1 ; аргумент2 – параметр, не имеющий имени. Например, командлет Get-Process имеет параметр Name, который определяет имя процесса, информацию о котором нужно вывести. Имя этого параметра указывать необязательно. Таким образом, для получения сведений о процессе Far можно ввести либо команду Get-Process -Name Far, либо команду Get-Process Far. Автоматическое завершение командНаходясь в оболочке PowerShell, можно ввести часть какой-либо команды, нажать клавишу Подобное автоматическое завершение срабатывает, во-первых, для имен файлов и путей файловой системы. При нажатии клавиши Во-вторых, в PowerShell реализовано автозавершение имен командлетов и их параметров. Если ввести первую часть имени командлета (глагол) и дефис, нажать после этого клавишу Наконец, PowerShell позволяет автоматически завершать имена используемых переменных (объектов) и имена свойств объектов . Псевдонимы командМеханизм псевдонимов, реализованный в оболочке PowerShell, дает возможность пользователям выполнять команды по их альтернативным именам (например, вместо команды Get-Childitem можно пользоваться псевдонимом dir ). В PowerShell заранее определено много псевдонимов, можно также добавлять собственные псевдонимы в систему. Псевдонимы в PowerShell делятся на два типа. Первый тип предназначен для совместимости имен с разными интерфейсами. Псевдонимы этого типа позволяют пользователям, имеющим опыт работы с другими оболочками (Cmd.exe или Unix-оболочки), использовать знакомые им имена команд для выполнения аналогичных операций в PowerShell, что упрощает освоение новой оболочки, позволяя не тратить усилий на запоминание новых команд PowerShell. Например, пользователь хочет очистить экран. Если у него есть опыт работы с Cmd.exe, то он, естественно, попробует выполнить команду cls. PowerShell при этом выполнит командлет Clear-Host, для которого cls является псевдонимом и который выполняет требуемое действие – очистку экрана. Для пользователей Cmd.exe в PowerShell определены псевдонимы cd, cls, copy, del, dir, echo, erase, move, popd, pushd, ren, rmdir, sort, type ; для пользователей Unix – псевдонимы cat, chdir, clear, diff, h, history, kill, lp, ls, mount, ps, pwd, r, rm, sleep, tee, write. Узнать, какой именно командлет скрывается за знакомым псевдонимом, можно с помощью командлета Get-Alias: PS C:\> Get-Alias cd CommandType Name Definition ----------- ---- ---------- Alias cd Set-Location Псевдонимы второго типа (стандартные псевдонимы) в PowerShell предназначены для быстрого ввода команд. Такие псевдонимы образуются из имен командлетов, которым они соответствуют. Например, глагол Get сокращается до g, глагол Set сокращается до s, существительное Location сокращается до l и т.д. Таким образом, для командлету Set-Location соответствует псевдоним sl, а командлету Get-Location – псевдоним gl. Просмотреть список всех пседонимов, объявленных в системе, можно с помощью командлета Get-Alias без параметров. Определить собственный псевдоним можно с помощью командлета Set-Alias. Справочная система PowerShellВ PowerShell предусмотрено несколько способов получения справочной информации внутри оболочки. Краткую справку по одному командлету можно получить с помощью параметра ? (вопросительный знак), указанного после имени этого командлета. Например: PS C:\> get-process -? ИМЯ Get-Process ОПИСАНИЕ Отображает процессы, выполняющиеся на локальном компьютере. СИНТАКСИС Get-Process [[-name] Get-Process -id Get-Process -inputObject [ ПОДРОБНОЕ ОПИСАНИЕ Командлет Get-Process извлекает объект-процесс для каждого процесса. При использовании командлета "Get-Process" без указания параметров происходит отображение всех процессов, выполняющихся на компьютере, что эквивалентно команде "Get-Process *". Процесс можно определить по имени или идентификатору (PID) или передав объект по ковнейеру в командлет Get-Process. Для Get-Process по умолчанию передается имя процесса. Для Stop-Process по умолчанию передается идентификатор процесса. ССЫЛКИ ПО ТЕМЕ Stop-Process ЗАМЕЧАНИЯ Для получения дополнительных сведений введите: "get-help Get-Process -detailed". Для получения технических сведений введите: "get-help Get-Process -full". Более подробную информацию можно получить с помощью специального командлета Get-Help с параметрами Detailed или Full (например, Get-Help Get-Process -Full ). Запустив данный командлет с параметром *, можно увидеть все доступные разделы справочной системы. Командлет Get-Help позволяет просматривать справочную информацию не только о разных командлетах, но и о синтаксисе языка PowerShell, о псевдонимах, о различных аспектах работы оболочки функциям и т.д. Список тем, обсуждение которых представлено с справочной службе PowerShell, можно увидеть следующим образом: PS C:\> Get-Help about_* Name Category Synopsis ---- -------- -------- about_alias HelpFile Использование альтернативных имен ко... about_arithmetic_operators HelpFile Операторы, которые используются в ко... about_array HelpFile Компактная структура размещения элем... about_assignment_operators HelpFile Операторы, используемые в оболочке W... about_associative_array HelpFile Компактная структура данных для хран... about_automatic_variables HelpFile Переменные, автоматически задаваемые... about_break HelpFile Инструкция для немедленного завершен... about_command_search HelpFile Как оболочка Windows PowerShell обна... about_command_syntax HelpFile Формат команд в Windows PowerShell . . . 16.2. Таким образом, чтобы прочитать справочную информацию об использовании массивов в PowerShell, нужно выполнить следующую команду: Get-Help about_array. Командлет Get-Help выводит содержимое раздела справки на экран сразу целиком. Функции man и help позволяют справочную информацию выводить поэкранно (аналогично команде MORE интерпретатора Cmd.exe), например: man about_array. Конвейеризация и управление выводом команд Windows PowerShellРанее в "лекции 2" мы рассматривали понятие конвейеризации (или композиции) команд интерпретатора Cmd.exe, когда выходной поток одной команды перенаправлялся во входной поток другой, объединяя тем самым две команды вместе. Подобные конвейеры команд используются в большинстве оболочек командной строки и являются средством, позволяющим передавать информацию между разными процессами. Механизм композиции команд представляет собой, вероятно, наиболее ценную концепцию, используемую в интерфейсах командной строки. Конвейеры не только снижают усилия, прилагаемые при вводе сложных команд, но и облегчают отслеживание потока работы в командах. Полезной чертой конвейеров является то, что они не зависят от числа передаваемых элементов, так как конвейер действует на каждый элемент отдельно. Кроме того, каждая команда в конвейере (называемая элементом конвейера) обычно передает свой вывод следующей команде в конвейере, элемент за элементом. Благодаря этому, как правило, снижается потребление ресурсов для сложных команд и возникает возможность получать выводимую информацию немедленно. В оболочке PowerShell также очень широко используется механизм конвейеризации команд, однако здесь по конвейеру передается не поток текста, как во всех других оболочках, а объекты. При этом с элементами конвейера можно производить различные манипуляции: фильтровать объекты по определенному критерию, сортировать и группировать объекты, изменять их структуру (ниже мы подробнее рассмотрим операции фильтрации и сортировки элементов конвейера). Конвейеризация и управление выводом команд Windows PowerShell Конвейеризация объектов в PowerShellКонвейер в PowerShell – это последовательность команд, разделенных между собой знаком | (вертикальная черта). Каждая команда в конвейере получает объект от предыдущей команды, выполняет определенные операции над ним и передает следующей команде в конвейере. С точки зрения пользователя, объекты упаковывают связанную информацию в форму, в которой информацией проще манипулировать как единым блоком и из которой при необходимости извлекаются определенные элементы. Передача данных между командами в виде объектов имеет большое преимущество над обычным обменом информацией посредством потока текста. Ведь команда, принимающая поток текста от другой утилиты, должна его проанализировать, разобрать и выделить нужную ей информацию, а это может быть непросто, так как обычно вывод команды больше ориентирован на визуальное восприятие человеком (это естественно для интерактивного режима работы), а не на удобство последующего синтаксического разбора. При передаче по конвейеру объектов этой проблемы не возникает, здесь нужная информация извлекается из элемента конвейера простым обращением к соответствующему свойству объекта. Однако теперь возникает новый вопрос: каким образом узнать, какие именно свойства есть у объектов, передаваемых по конвейеру? Ведь при выполнении того или иного командлета мы на экране видим только одну или несколько колонок отформатированного текста. Например, запустим командлет Get-Process, который выводит информацию о запущенных в системе процессах: PS C:\> Get-Process Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 158 11 45644 22084 126 159.69 2072 AcroRd32 98 5 1104 284 32 0.10 256 alg 39 1 364 364 17 0.26 1632 ati2evxx 57 3 1028 328 30 0.38 804 atiptaxx 434 6 2548 3680 27 21.96 800 csrss 64 3 812 604 29 0.22 1056 ctfmon 364 11 14120 9544 69 11.82 456 explorer 24 2 1532 2040 29 5.34 2532 Far Фактически на экране мы видим только сводную информацию (результат форматирования полученных данных), а не полное представление выходного объекта. Из этой информации не понятно, сколько точно свойств имеется у объектов, генерируемых командой Get-Process, и какие имена имеют эти свойства. Например, мы хотим найти все "зависшие" процессы, которые не отвечают на запросы системы. Можно ли это сделать с помощью командлета Get-Process, какое свойство нужно проверять у выводимых объектов? Для ответа на подобные вопросы нужно, прежде всего, научиться исследовать структуру объектов PowerShell, узнавать, какие свойства и методы имеются у этих объектов. Просмотр структуры объектовДля анализа структуры объекта, возвращаемого определенной командой, проще всего направить этот объект по конвейеру на командлет Get-Member (псевдоним gm ), например: PS C:\> Get-Process | Get-Member TypeName: System.Diagnostics.Process Name MemberType Definition ---- ---------- ---------- Handles AliasProperty Handles = Handlecount Name AliasProperty Name = ProcessName NPM AliasProperty NPM = NonpagedSystemMemorySize PM AliasProperty PM = PagedMemorySize VM AliasProperty VM = VirtualMemorySize WS AliasProperty WS = WorkingSet . . . Responding Property System.Boolean Responding {get;} . . . Здесь мы видим имя .NET-класса, экземпляры которого возвращаются в ходе работы исследуемого командлета (в нашем примере это класс System.Diagnostic.Process), а также полный список элементов объекта (в частности, интересующее нас свойство Responding, определяющего "зависшие" процессы). При этом на экран выводится очень много элементов, просматривать их неудобно. Командлет Get-Member позволяет перечислить только те элементы объекта, которые являются его свойствами. Для этого используется параметр MemberType со значением Properties: PS C:\> Get-Process | Get-Member -MemberType Property TypeName: System.Diagnostics.Process Name MemberType Definition ---- ---------- ---------- BasePriority Property System.Int32 BasePriority {get;} Container Property System.ComponentModel.IContainer... EnableRaisingEvents Property System.Boolean EnableRaisingEvents... ExitCode Property System.Int32 ExitCode {get;} ExitTime Property System.DateTime ExitTime {get;} Handle Property System.IntPtr Handle {get;} HandleCount Property System.Int32 HandleCount {get;} HasExited Property System.Boolean HasExited {get;} Id Property System.Int32 Id {get;} MachineName Property System.String MachineName {get;} . . . Responding Property System.Boolean Responding {get;} . . . Как мы видим, процессам операционной системы соответствуют объекты, имеющие очень много свойств, на экран же при работе командлета Get-Process выводятся лишь несколько из них (способы отображения объектов различных типов задаются конфигурационными файлами в формате XML, находящимися в каталоге, где установлен файл powershell.exe). Теперь, когда мы знаем, какие свойства имеют объекты, передаваемые по конвейеру, перейдем к рассмотрению наиболее часто используемых операций над элементами конвейера: фильтрации и сортировки. Фильтрация объектов в конвейереВ PowerShell поддерживается возможность фильтрации объектов в конвейере, т.е. удаление из конвейера объектов, не удовлетворяющих определенному условию. Данную функциональность обеспечивает командлет Where-Object, позволяющий проверить каждый объект, находящийся в конвейере, и передать его дальше по конвейеру, только если объект удовлетворяет условиям проверки. Например, для вывода информации о "зависших" процессах (объекты, возвращаемые командлетом Get-Process, у которых свойство Responding равно False ) можно использовать следующий конвейер: Get-Process | Where-Object {-not $_.Responding} Другой пример – оставим в конвейере только те процессы, у которых значение идентификатора (свойство Id ) больше 1000: Get-Process | Where-Object {$_.Id -gt 1000} В блоках сценариев командлета Where-Object для обращения к текущему объекту конвейера и извлечения нужных свойств этого объекта используется специальная переменная $_, которая создается оболочкой PowerShell автоматически. Данная переменная используется и в других командлетах, производящих обработку элементов конвейера. Условие проверки в Where-Object задается в виде блока сценария – одной или нескольких команд PowerShell, заключенных в фигурные скобки {}. Результатом выполнения данного блока сценария должно быть значение логического типа: True (истина) или False (ложь). Как можно понять из примеров, в блоке сценария используются специальные операторы сравнения. Замечание В PowerShell для операторов сравнения не используются обычные символы > или <, так как в командной строке они обычно означают перенаправление ввода/вывода. Основные операторы сравнения приведены в табл. 17.1.
Операторы сравнения можно соединять друг с другом с помощью логических операторов (см. табл. 17.2).
Сортировка объектовСортировка элементов конвейера – еще одна операция, которая часто применяется при конвейерной обработке объектов. Данную операцию осуществляет командлет Sort-Object: ему передаются имена свойств, по которым нужно произвести сортировку, а он возвращает данные, упорядоченные по значениям этих свойств. Например, для вывода списка запущенных в системе процессов, упорядоченного по затраченному процессорному времени (свойство cpu ), можно воспользоваться следующим конвейером: PS C:\> Get-Process | Sort-Object cpu Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 0 0 0 16 0 0 Idle 36 2 728 32 23 0.05 1792 klswd 98 5 1104 764 32 0.09 252 alg 21 1 164 60 4 0.09 748 smss 30 2 672 724 27 0.11 1700 WinCinemaMgr 39 1 364 464 17 0.12 1644 ati2evxx 163 6 1536 1404 35 0.12 1612 svchost 55 3 1088 852 27 0.14 1220 svchost 22 2 504 712 23 0.14 772 winampa 120 4 2364 1228 35 0.26 1876 svchost 170 5 4516 796 44 0.27 1260 GoogleToolbarNotifier 193 5 2916 1488 59 0.29 1040 svchost 64 3 812 1080 29 0.30 1252 ctfmon 140 5 3208 1220 41 0.32 1524 spoolsv 281 14 1764 1688 37 0.34 1120 svchost 57 3 1028 996 30 0.39 932 atiptaxx 503 52 7296 3596 51 2.47 836 winlogon 259 6 1432 1340 19 2.48 880 services 341 8 3572 1856 40 5.36 892 lsass 240 158 29536 10388 175 5.58 1780 outpost 149 4 2940 1108 41 9.29 1248 kav 398 5 36140 26408 137 9.97 1984 powershell 375 12 15020 10456 75 14.03 1116 explorer 376 0 0 36 2 14.97 4 System 409 6 2500 3192 26 20.10 812 csrss 1513 54 13528 9800 95 25.78 1156 svchost 717 75 37432 704 145 56.97 1748 kavsvc 152 4 2372 2716 38 58.09 2028 wmiprvse 307 13 10952 27080 173 9128.03 1200 WINWORD 17.1. Для сортировки в обратном порядке используется параметр Descending: PS C:\> Get-Process | Sort-Object cpu -Descending Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName ------- ------ ----- ----- ----- ------ -- ----------- 307 13 10956 27040 173 9152.23 1200 WINWORD 152 4 2372 2716 38 59.19 2028 wmiprvse 717 75 37432 1220 145 57.15 1748 kavsvc 1524 54 13528 9800 95 26.13 1156 svchost 410 6 2508 3224 26 20.62 812 csrss 376 0 0 36 2 15.11 4 System 377 13 15020 10464 75 14.20 1116 explorer 374 5 36484 26828 137 10.53 1984 powershell 149 4 2940 1108 41 9.34 1248 kav 240 158 29536 10388 175 5.61 1780 outpost 344 8 3572 1856 40 5.40 892 lsass 512 53 7324 3608 51 2.51 836 winlogon 259 6 1432 1340 19 2.48 880 services 57 3 1028 996 30 0.39 932 atiptaxx 281 14 1764 1688 37 0.34 1120 svchost 140 5 3208 1220 41 0.32 1524 spoolsv 64 3 812 1080 29 0.30 1252 ctfmon 193 5 2916 1488 59 0.29 1040 svchost 170 5 4516 796 44 0.27 1260 GoogleToolbarNotifier 120 4 2364 1228 35 0.26 1876 svchost 22 2 504 712 23 0.15 772 winampa 55 3 1088 852 27 0.14 1220 svchost 39 1 364 464 17 0.13 1644 ati2evxx 163 6 1536 1404 35 0.12 1612 svchost 30 2 672 724 27 0.11 1700 WinCinemaMgr 21 1 164 60 4 0.09 748 smss 98 5 1104 764 32 0.09 252 alg 36 2 728 32 23 0.05 1792 klswd 0 0 0 16 0 0 Idle 17.2. В рассмотренных нами примерах конвейеры состояли из двух командлетов. Это не обязательное условие, конвейер может объединять и большее количество команд, например: Get-Process | Where-Object {$_.Id -gt 1000} | Sort-Object cpu -Descending Управление выводом команд в PowerShellРаботая в оболочке PowerShell, мы пока не задумывались, каким образом система формирует строки текста, которые выводятся на экран в результате выполнения той или иной команды (напомним, что командлеты PowerShell возвращают .NET-объекты, которые, как правило, не знают, каким образом отображать себя на экране). На самом деле в PowerShell имеется база данных (набор XML-файлов), содержащая модули форматирования по умолчанию для различных типов .NET-объектов. Эти модули определяют, какие свойства объекта отображаются при выводе и в каком формате: списка или таблицы. Когда объект достигает конца конвейера, PowerShell определяет его тип и ищет его в списке объектов, для которых определено правило форматирования. Если данный тип в списке обнаружен, то к объекту применяется соответствующий модуль форматирования; если нет, то PowerShell просто отображает свойства этого .NET-объекта. Также в PowerShell можно явно задавать правила форматирования данных, выводимых командлетами, и подобно командному интерпретатору Cmd.exe перенаправлять эти данные в файл, на принтер или в пустое устройство. Форматирование выводимой информацииВ традиционных оболочках команды и утилиты сами форматируют выводимые данные. Некоторые команды (например, dir в интерпретаторе Cmd.exe) позволяют настраивать формат вывода с помощью специальных параметров. В оболочке PowerShell вывод форматируют только четыре специальных командлета Format (табл. 17.3). Это упрощает изучение, так как не нужно запоминать средства и параметры форматирования для других команд (остальные командлеты вывод не форматируют).
Как уже отмечалось выше, если ни один из командлетов Format явно не указан, то используется модуль форматирования по умолчанию, который определяется по типу отображаемых данных. Например, при выполнении командлета Get-Service данные по умолчанию выводятся как таблица с тремя столбцами (Status, Name и DisplayName): PS C:\> Get-Service Status Name DisplayName ------ ---- ----------- Stopped Alerter Оповещатель Running ALG Служба шлюза уровня приложения Stopped AppMgmt Управление приложениями Stopped aspnet_state ASP.NET State Service Running Ati HotKey Poller Ati HotKey Poller Running AudioSrv Windows Audio Running BITS Фоновая интеллектуальная служба пер... Running Browser Обозреватель компьютеров Stopped cisvc Служба индексирования Stopped ClipSrv Сервер папки обмена Stopped clr_optimizatio... .NET Runtime Optimization Service v... Stopped COMSysApp Системное приложение COM+ Running CryptSvc Службы криптографии Running DcomLaunch Запуск серверных процессов DCOM Running Dhcp DHCP-клиент ... Для изменения формата выводимых данных нужно направить их по конвейеру соответствующему командлету Format. Например, следующая команда выведет список служб с помощью командлета Format-List: PS C:\> Get-Service | Format-List Name : Alerter DisplayName : Оповещатель Status : Stopped DependentServices : {} ServicesDependedOn : {LanmanWorkstation} CanPauseAndContinue : False CanShutdown : False CanStop : False ServiceType : Win32ShareProcess Name : ALG DisplayName : Служба шлюза уровня приложения Status : Running DependentServices : {} ServicesDependedOn : {} CanPauseAndContinue : False CanShutdown : False CanStop : True ServiceType : Win32OwnProcess . . . Как мы видим, при использовании формата списка выводится больше сведений о каждой службе, чем в формате таблицы (вместо трех столбцов данных о каждой службе в формате списка выводятся девять строк данных). Однако это вовсе не означает, что командлет Format-List извлекает дополнительные сведения о службах. Эти данные содержатся в объектах, возвращаемых командлетом Get-Service, однако командлет Format-Table, используемый по умолчанию, отбрасывает их, потому что не может вывести на экран более трех столбцов. При форматировании вывода с помощью командлетов Format-List и Format-Table можно указывать имена свойства объекта, которые должны быть отображены (напомним, что просмотреть список свойств, имеющихся у объекта, позволяет рассмотренный ранее командлет Get-Member ). Например: PS C:\> Get-Service | Format-List Name, Status, CanStop Name : Alerter Status : Stopped CanStop : False Name : ALG Status : Running CanStop : True Name : AppMgmt Status : Stopped CanStop : False . . . Вывести все имеющиеся у объектов свойства можно с помощью параметра *, например: PS C:\> Get-Service | Format-table * Перенаправление выводимой информацииВ оболочке PowerShell имеются несколько командлетов, с помощью которых можно управлять выводом данных. Эти командлеты начинаются со слова Out, их список можно увидеть следующим образом: PS C:\> Get-Command out-* | Format-Table Name Name ---- Out-Default Out-File Out-Host Out-Null Out-Printer Out-String По умолчанию выводимая информация передается командлету Out-Default, который, в свою очередь, делегирует всю работу по выводу строк на экран командлету Out-Host. Для понимания данного механизма нужно учитывать, что архитектура PowerShell подразумевает различие между собственно ядром оболочки (интерпретатором команд) и главным приложением (host), которое использует это ядро. В принципе, в качестве главного может выступать любое приложение, в котором реализован ряд специальных интерфейсов, позволяющих корректно интерпретировать получаемую от PowerShell информацию. В нашем случае главным приложением является консольное окно, в котором мы работаем с оболочкой, и командлет Out-Host передает выводимую информацию в это консольное окно. Параметр Paging командлета Out-Host, подобно команде more интерпретатора Cmd.exe, позволяет организовать постраничный вывод информации, например: Get-Help Get-Process –Full | Out-Host -Paging Сохранение данных в файлКомандлет Out-File позволяет направить выводимые данные вместо окна консоли в текстовый файл. Аналогичную задачу решает оператор перенаправления (>), однако командлет Out-File имеет несколько дополнительных параметров, с помощью которых можно более гибко управлять выводом: задавать тип кодировки файла (параметр Encoding ), задавать длину выводимых строк в знаках (параметр Width ), выбирать режим перезаписи файла (параметры Append, noClobber ). Например, следующая команда направит информацию о зарегистрированных на компьютере службах в файл C:\service.txt, причем данный файл будет записан в формате ASCII: Get-Process | Out-File -FilePath C:\Process.txt -Encoding ASCII Печать данныхДанные можно вывести непосредственно на принтер с помощью командлета Out-Printer. При этом печать может производиться как на принтере по умолчанию (никаких специальных параметров для этого указывать не нужно), так и на произвольном принтере (в этом случае отображаемое имя принтера должно быть указано в качестве значения параметра Name ). Например: PS C:\script> Get-Process | Out-Printer -Name "Xerox Phaser 3500 PCL 6" Подавление выводаКомандлет Out-Null служит для отбрасывания любых своих входных данных. Это может пригодиться для подавления вывода на экран ненужных сведений, полученных в качестве побочного эффекта выполнения какой-либо команды. Например, при создании каталога командой mkdir на экран выводится его содержимое: PS C:\> mkdir klop Каталог: Microsoft.PowerShell.Core\FileSystem::C:\ Mode LastWriteTime Length Name ---- ------------- ------ ---- d---- 03.12.2007 1:01 klop Если вы не желаете видеть эту информацию, то результат выполнения команды mkdir нужно передать по конвейеру командлету Out-Null: mkdir klop | Out-Null |