Наверное, все слышали о PowerShell, но наверняка не всем довелось с ним работать. Для тех, кто только начинает прокладывать свой путь в дебри PowerShell, мы приводим перевод поста, вышедшего на портале 4sysops.com . В нем рассказано о 7 командах, которые помогут тем, кто только начал работать с PowerShell. За подробностями – добро пожаловать под кат.
GET-HELP
Самый первый и самый главный командлет PowerShell – вызов справки. С помощью командлета Get-Help можно проверить синтаксис, посмотреть примеры использования и детальное описание параметров любого PowerShell командлета. Этот командлет примечателен тем, что вы просто можете набрать Get-Help Services, чтобы получить список всех командлетов, которые подходят для работы со службами. Пример:
PS C:\> Get-Help Service
Вы можете выбрать любой командлет из списка, выведенного по запросу выше, чтобы получить справку о нем. Например,
PS C:\> Get-Help -Name Get-Service
Вы получаете всю информацию о командлете Get-Service (будет рассмотрен ниже).
GET-CONTENT
Чтение содержимого файлов – наиболее частое требование для новичков, которые пытаются выучить PowerShell. Процедура чтения файлов с PowerShell упрощается. Даже неспециалист может читать содержимое файла, просто передав его в командлет Get-Content.Пример.
PS C:\> Get-Content C:\scripts\Computers.txt mytestpc1 techibee.com dummynotresolvinghost.com PS C:\>
Необходимо больше информации о командлете? Воспользуйтесь Get-Help:
PS C:\> Get-Help Get-Content -Detailed
GET-SERVICE
Этот командлет перечисляет все службы, установленные на компьютере. Вы можете использовать его для получения информации о конкретной службе, совокупности служб или просто обо всех службах на компьютере.Пример:
PS C:\> Get-Service wwansvc, spooler Status Name DisplayName ------ ---- ----------- Running spooler Print Spooler Stopped wwansvc WWAN AutoConfig PS C:\>
Здесь мы запросили информацию о двух службах wwansvc и spooler
Выводится таблица со статусом службы, ее именем и отображаемым именем.
Мы можем видеть что служба spooler запущена, а wwansvc остановлена
STOP-SERVICE И START-SERVICE
Запуск и остановка служб – достаточно важный момент в работе администратора Windows. В PowerShell имеются встроенные командлеты, которые упрощают работу администратора, не требуя открытия консоли MMC. Используя эти командлеты Вы можете останавливать/запускать службы как на локальных, так и на удаленных компьютерах. Примеры:
Запуск/остановка службы на локальном компьютере (на примере службы spooler):
PS C:\> Stop-Service -Name Spooler PS C:\> Start-Service -Name Spooler
Запуск/остановка службы на удаленном компьютере (spooler):
PS C:\> $ServiceObj = Get-Service -ComputerName MyPC1 -Name spooler
PS C:\> Stop-Service -InputObj $ServiceObj
PS C:\> Start-Service -InputObj $ServiceObj
GET-PROCESS
Этот командлет позволяет быть в курсе, какие процессы запущены на локальных или удаленных компьютерах. Показываются имя и ID процесса, а также путь к исполняемому файлу, имя компании, версия исполняемого файла и память, используемая процессом. Примеры:
Получение информации о процессах, запущенных на локальном компьютере:
PS C:\> Get-Process
Введите следующий командлет для получения подробной информации о запущенных процессах
PS C:\> Get-Process | Format-List * -Force
Получение информации о процессах, запущенных на удаленном компьютере
:
PS C:\> Get-Process -ComputerName MYPC1 | Format-List * -Force
MYPC1 необходимо заменить на имя того компьютера, с которого вы хотите получить информацию о запущенных процессах.
STOP-PROCESS
Этот командлет остановливает процесс на локальном или удаленном компьютере. Он берет имя или ID процесса и завершает этот процесс. Это полезно в тех случаях, когда приложение не отвечает.Пример:
Остановить процесс с ID 22608 на локальном компьютере:
PS C:\> Stop-Process -Id 22608
Остановить все процессы Excel на локальном компьютере:
PS C:\> Stop-Process -name excel
Совет
: Хотя у командлета Stop-Process отсутствует параметр -ComputerName, Вы все равно можете использовать его для завершения удаленных процессов, используя предложенный ниже совет:
PS C:\> $Obj = Get-Process -Name excel -ComputerName MYPC1
PS C:\> Stop-Process -InputObject $Obj
Upd:
В посте приведен перевод статьи с портала
В админиcтрировании всегда есть место творчеству. Хочешь сделать какую-нибудь автоматизацию рутинной задачи? Пожалуйста! Нужно что-то регулярно проверять на активность? Не вопрос! Хочешь обработать какой-нибудь гигантский отчет и вывести только актуальные данные? Тоже можно. Все эти и многие другие задачи лучше всего решать при помощи скриптов, и язык PowerShell в случае с Windows - оптимальный выбор.
Что такое PowerShell и чем он хорош
Пользователи UNIX и Linux, а с какого-то мoмента и macOS привыкли к тому, что под рукой всегда есть Bash - немного старомодное, но универсальное и мощное средство, при помощи которого всего парой строк можно творить удивительные вещи. Прописываешь новый скрипт в cron - и готово, он уже крутится на твоем компьютере или на сервере и незаметно делает что-нибудь полезное.
Возвращаясь в Windows (а без этого иногда никак), понимаешь, что скрипты.bat хоть и хороши, но спасают не всегда: очень уж ограниченны их возможности. И если ты до сих пор считал, что PowerShell - это неведомая штуковина, ради которой нужно что-то там поднимaть и настраивать, то не спеши с выводами - он, если разобраться, совсем неплох.
Windows PowerShell - это расширяемое средство автоматизации с открытыми исходниками, которое состоит из оболочки (командной строки) и скриптового языка. Впервые он был показан в 2003 году (тогда он назывался Monad). PowerShell 2.0 вышел в составе Windows 7 и Windows Server 2008 R2 и с тех пор присутствует в Windows в качестве стандартного компонента. Его даже включили в Windows XP SP3. PowerShell построен на основе.NET Framework и интегрирован с ним. PowerShell может обращаться к COM, WMI и ADSI, а также, конечно же, исполняет консольные команды.
В общем, «пошик» имеет крепкие связи с продуктами Microsoft, будь то Active Directory или почтовый сервер Exchange. Это позволяет без подключения к оснастке сервера обращаться к ним через консоль и отдaвать команды.
Если раньше ты не интересовался PowerShell, то, скорее всего, у тебя стоит вторая версия. Я рекомендую обновиться как минимум до третьей - она содержит куда больше возможностей и полезных фишек. Если не вдаваться в подробности, то в PowerShell 2.0 входит около десятка модулей и примерно 350 команд, а в PowerShell 3.0 уже около 2300 командлетов из более чем 70 модулей. «Хакер» также писал о том, чем отличается самый новый PowerShell пятой версии из Windows 10.
Выбираем среду разработки и инструменты
Теперь давай разберемся, где удобнее всего писать код. Можно, конечно, и в «Блокноте», Notepad++ или Sublime. Но это в данном случае не самый грамотный выбор редактора. Лучше всего начинать знакомство с PowerShell, вооружившись идущим в комплекте .
Это даже не редактор, а практически полноценная среда разработки. Здесь есть функция IntelliSense, которая позволяет просматривать перечень командлетов и их параметров, переменных, утилит и прочего. Поддерживаются сниппеты, есть возможность расширения нaбора функций за счет различных аддонов. Очень полезно и окно Commands. В нем можно составлять команды в визуальном режиме: выбираешь модуль, находишь нужный командлет и задаешь ему необходимые параметры. Получившуюся команду можно скопировать в консоль или сразу запустить на выполнение. В общем, этакий конструктор для админа. Ну и конечно, есть подсветка синтаксиса, дебаггер и многое другое.
Тем не менее у PowerShell ISE есть и достойные конкуренты. Один из них - .
PowerGUI - это визуальное дополнение к PowerShell. Оно упрощает сборку собственных сценариев до выбора необходимых командлетов. Берешь то, что нужно для решения задачи, и перетаскиваешь части кода, пока не получишь скрипт. Одна из главных фишек PowerGUI - это Power Packs, готовые скрипты, опубликованные сообществом пользователей и выложенные в свобoдный доступ. Тут есть и простенькие команды вроде добавления пoльзователей, и сложные - к примеру, управление свитчами и виртуальными машинaми. Все их легко дополнять и модифицировать в соответствии с нуждами.
Фирмы Sapien - бoлее продвинутая среда, которая рассчитана на совместную разработку одного проекта большим количеством участников. Если ты когда-нибудь имел дело с Visual Studio, то, думаю, заметишь сходство. Среди полезных фишек PowerShell Studio - панель Ribbon, поддержка удаленной отладки, а также функции компилятора, которые позволяют включить скрипты в исполняемые файлы. Есть поддержка разных версий PowerShell.
Стоит упомянуть и Script Browser для Windows PowerShell ISE. Это не среда разработки, но вeсьма интересный инструмент, разработанный в Microsoft. Script Browser открывает доступ к базе готовых скриптов, которые можно использовать в качестве образцов для написания своего кода. А еще эта штука умеет анализировать код, который ты пишешь, и подсказывает, как его улучшить.
Несколько полезных трюков
Разобравшись с редактором, можно приступать к написанию кода. PowerShell - несложный язык, и, я думаю, ты быстро разберешься, что к чему. Команды здесь называются командлетами, и каждый из них состоит из двух частей. Сначала идeт действие, например Get, Set, Add, Invoke, Remove. Затем указывается то, на что действие направлено: Service, VM, AzureAccount, DHCPServerSetting. Каждая часть отделяется от другой дефисом. Получается, к примеру, get-process. Это, кстати, полезная команда, которая выводит список процессов. Скажем, если написать
get - process BadTh * |
увидим что-то такое:
Handles NPM (K ) PM (K ) WS (K ) VM (M ) CPU (s ) Id ProcessName ------------------------ 28 4 - 210844 - 201128 - 163 25.67 2792 BadThread |
Теперь можно завершить зависший процесс:
Можно проcмотреть рекурсивно, правда уже чуть с более сложной логикой:
Можно также выполнить
Кстати, к каждому полю в окошке опции учетной записи или компьютера можно обратиться и считать данные. Таким образом можно делать целые срезы. Вот, к примеру, запрос на основе данных о телефонных номерах:
Get - AdUser - Filter * - Properties OfficePhone | FT OfficePhone , UserPrincipalName |
PowerShell в сравнении с bat
Иногда задачу можно решить как старым дедовским методом, так и при помощи PowerShell. Я рекомендую не лениться и использовать PS, хотя бы просто потому, что так ты его быстрее изучишь и сможешь применять в более сложных ситуациях. К тому же ты постепeнно оценишь его синтаксис - более элегантный и консистентный. Вот несколько примеров, как вещи делались раньше и как их можно сделать при помощи PowerShell.
Управлять расширенными событиями SQL Server можно с помощью поставщика SQL Server PowerShell. Вложенная папка XEvent находится на диске SQLSERVER. Получить доступ к папке можно одним из следующих способов.
В дереве папки XEvent можно просматривать существующие сеансы расширенных событий и связанные с ними события, цели и предикаты. Например, если в папке PS SQLSERVER:\XEvent\ServerName \InstanceName > ввести cd sessions , нажать клавишу ВВОД, ввести dir и затем нажать клавишу ВВОД, то можно просмотреть список сеансов, хранящихся в этом экземпляре. Также можно проверить, выполняется ли сеанс в данный момент (и если выполняется, то в течение какого периода), а также задан ли запуск сеанса вместе с запуском экземпляра.
Для просмотра событий, их предикатов и целей, связанных с сеансом, можно изменить имена каталогов на имя сеанса и затем просматривать либо папку событий, либо папку целей. Например, чтобы просмотреть события и их предикаты, связанные с сеансом отслеживания исправности системы по умолчанию, в папке PS SQLSERVER:\XEvent\ServerName \InstanceName \Sessions> введите команду cd system_health\events , нажмите клавишу ВВОД, введите dir и снова нажмите клавишу ВВОД.
Поставщик SQL Server PowerShell предоставляет широкий набор функций для создания, изменения и управления сеансами расширенных событий. В следующем разделе приведены некоторые простые примеры использования скриптов PowerShell с расширенными событиями.
Скрипты должны запускаться из расположения PS SQLSERVER:\> (для перехода в него введите в командной строке sqlps ).
Скрипты используют экземпляр SQL Server по умолчанию.
Скрипты должны сохраняться с расширением PS1.
Политика выполнения PowerShell должна разрешать выполнения скриптов. Чтобы задать политику выполнения, воспользуйтесь командлетом Set-Executionpolicy . (Для получения дополнительных сведений введите get-help set-executionpolicy -detailed и нажмите клавишу ВВОД.)
Следующий скрипт создает новый сеанс с именем «TestSession».
#Script for creating a session. cd XEvent $h = hostname cd $h #Use the default instance. $store = dir | where {$_.DisplayName -ieq "default"} $session = new-object Microsoft.SqlServer.Management.XEvent.Session -argumentlist $store, "TestSession" $event = $session.AddEvent("sqlserver.file_written") $event.AddAction("package0.callstack") $session.Create()
Следующий скрипт добавляет цель «Кольцевой буфер» в сеанс, созданный в предыдущем примере. (В этом примере демонстрируется использование метода Alter . Помните, что добавлять цель можно только после создания сеанса.) #Script for creating a session. cd XEvent $h = hostname cd $h #Use the default instance. $store = dir | where {$_.DisplayName -ieq "default"} $session = new-object Microsoft.SqlServer.Management.XEvent.Session -argumentlist $store, "TestSession2" $event = $session.AddEvent("sqlserver.file_written") #Construct a predicate "equal_i_unicode_string(path, N"c:\temp.log")". $column = $store.SqlServerPackage.EventInfoSet["file_written"].DataEventColumnInfoSet["path"] $operand = new-object Microsoft.SqlServer.Management.XEvent.PredOperand -argumentlist $column $value = new-object Microsoft.SqlServer.Management.XEvent.PredValue -argumentlist "c:\temp.log" $compare = $store.Package0Package.PredCompareInfoSet["equal_i_unicode_string"] $predicate = new-object Microsoft.SqlServer.Management.XEvent.PredFunctionExpr -argumentlist $compare, $operand, $value $event.SetPredicate($predicate) $session.Create()
Наш обзор посвящен использованию ключевых возможностей Windows PowerShell для выполнения различных административных задач. Сначала рассмотрим встроенные средства ознакомления с возможностями Windows PowerShell.
Знакомство с возможностями Windows PowerShell
Итак, вы - администратор, которому необходимо в кратчайший срок освоить Windows PowerShell. Первое, что вы, вероятно, предпримете (естественно, помимо обращения к документации и справочной системе), - воспользуетесь командой Help (рис. 1).
Внимательно изучив выведенную на экран информацию, мы придем к пониманию следующих концептуальных вещей: в Windows PowerShell существуют алиасы, командлеты, провайдеры, а также справочные файлы. Алиасы (alias) служат для упрощения ввода команд (например, clc - это алиас команды Clear-Content ), командлеты (cmdlet) представляют собой реализацию всех встроенных в Windows PowerShell команд, провайдеры (provider) обеспечивают доступ к файловой системе, реестру, хранилищу сертификатов и т.п., а справочные файлы (helpfile) используются для получения дополнительной информации. Для получения подробного описания команды применяется следующий синтаксис:
PS C:> Help Get-Command
В результате выполнения этой команды мы получим полное описание команды Get-Command , включая ее назначение, синтаксис, опции и т.п. (рис. 2).
Для получения списка всех встроенных команд используем следующий синтаксис:
PS C:> Get-Command
Обратите внимание на то, что все команды состоят из глагола и прилагательного (например, Get-Content , Export-Console ) и все команды поддерживают единую систему именования - например для завершения чего-либо всегда используется глагол Stop, а не Kill, Terminate, Halt или другие синонимы, что существенно упрощает изучение возможностей PowerShell (рис. 3).
Команда Get-Service служит для получения списка всех сервисов, запущенных на данном компьютере. Например,
PS C:> Get-Service
возвращает список, представленный на рис. 4.
Для получения списка процессов, запущенных в настоящий момент на компьютере, применяется команда Get-Process (рис. 5):
PS C:> Get-Process
В Windows PowerShell поддерживается автоматическое завершение ввода. Чтобы убедиться в этом, введите Get-P и нажмите клавишу TAB: вы получите возможность выбора всех команд, начинающихся с введенных символов.
Для получения информации только об одном процессе в качестве аргумента команды Get-Process задается имя этого процесса (рис. 6):
PS C:> Get-Process explorer
Для того чтобы получить список всех процессов, названия которых начинаются с определенного символа, достаточно указать этот символ и «*» (рис. 7):
PS C:> Get-Process i*
Обратите внимание на колонки, в которых содержится информация, - Handles, NMP(K) и т.п. По умолчанию информация выводится в виде таблицы, но на самом деле все команды возвращают объекты. Эти объекты могут быть переданы на вход другим командам с помощью символа «|» (рис. 8):
PS C:> Get-Process i* | format-list
Теперь список процессов доступен в другом представлении. Для получения подробной информации о различных форматах можно использовать следующую команду:
PS C:> Help format *
Другие возможные форматы:
PS C:> Get-Process i* | format-wide
PS C:> Get-Process i* | format-custom
Поскольку на выходе всегда получается объект, можно манипулировать им для выполнения дополнительных операций, например фильтрации:
PS C:> Get-Process | where {$_.handlecount -gt 400}
или сортировки:
PS C:> Get-Process | where {$_.handlecount -gt 400} | sort-object Handles
Может возникнуть вполне резонный вопрос: а откуда мы узнали, что у объекта, описывающего процесс, есть свойство handlecount ? Для получения списка всех свойств объекта применяется следующая команда (рис. 9):
PS C:> Get-Process | Get-Member
Выполним команду Get-Process | Get-Member Company - при форматировании по умолчанию невозможно получить желаемые данные. Преобразуем полученную команду в:
PS C:> Get-Process | Get-Member Company | Format-List
Результат ее преобразования представлен на рис. 10.
PS C:> Get-Process | sort-object Company | format-table -Group Company name, description, handles
Результат выполнения данной команды представлен на рис. 11.
Команда stop-process позволяет остановить запущенный процесс, например:
PS C:> Get-process notepad | stop-process
Такая возможность не всегда является безопасной, поэтому лучше использовать подобные команды с опцией whatif , которая показывает, что произойдет при выполнении той или иной команды, но на самом деле команда не выполняется:
PS C:> Get-Process notepad | stop-process –whatif
Кроме того, можно указывать на необходимость подтверждения перед выполнением команды:
PS C:> Get-Process notepad | stop-process –confirm
Результат выполнения команды с подтверждением представлен на рис. 12.
В последнем примере мы получаем описание действий, которые выполняет команда, и можем выбрать, подтверждать ее выполнение или нет.
Помимо этого можно создавать собственные пакетные файлы, представляющие собой файлы с расширением *.ps1, в которые помещаются команды PowerShell, и выполнять их. Для соблюдения безопасности пакетные файлы должны быть подписаны. При тестировании можно отключить требование по запуску только подписанных файлов:
PS C:> Set-ExecutionPolicy Unrestricted
но после окончания тестирования не забудьте снова включить данную опцию с помощью следующей команды:
PS C:> Set-ExecutionPolicy AllSigned
После знакомства с основами Windows PowerShell посмотрим, как с помощью данной утилиты можно решать различные административные задачи.
Работа с файловой системой
Одна из задач, с которой часто сталкиваются многие ИT-специалисты, связана с манипуляциями с файлами, такими как копирование, перемещение, переименование, удаление файлов и каталогов. На рис. 13 показаны основные команды Windows PowerShell, применяемые для манипуляций с файловой системой: new-item , copy-item , move-item , rename-item и remove-item .
В отличие от других оболочек, в которых существует и набор команд для файлов (например, delete или rename), и набор для каталогов (например, rd или md), в Windows PowerShell единый набор команд используется для манипуляций как с файлами, так и с каталогами.
Первая команда в нашем примере - new-item TextFiles –itemtype directory - применяется для создания нового подкаталога TextFiles в текущем каталоге. Если опустить параметр –itemtype , то Windows PowerShell спросит, что мы создаем - файл (file) или каталог (directory). Отметим, что у команды new-item есть алиас - ni. В сокращенном виде наша первая команда будет выглядеть так:
PS C:> ni TextFiles –itemtype directory
Затем мы используем команду copy-item (алиасы - cpi, cp, copy ) для копирования всех файлов с расширением *.txt в подкаталог TextFiles. Если применять данную команду в пакетном файле, имеет смысл сделать ее более понятной, указав параметры –path (источник) и –destination (приемник):
PS C:>copy-item –path ‘.\*.txt’ –destination ‘.\TextFiles’
После выполнения команды копирования мы используем команду set-location для перехода в подкаталог TextFiles. С помощью команды rename-item переименовываем файл psdemo.txt в psdemo.bak. При необходимости можно применять опции –path и –newName . После того как файл переименован, переносим его на один уровень вверх, используя команду move-item . Затем применяем команду set-location , а точнее - ее алиас sl для перехода в другой каталог. Манипуляции с файловой системой мы завершаем удалением всего каталога TextFiles, используя команду remove-item . Поскольку в каталоге TextFiles содержатся файлы, применяется опция –recurse . Если эта опция не указана, Windows PowerShell запросит подтверждение перед выполнением команды remove-item .
Работа с реестром
При выполнении различных настроек и попытках обнаружения каких-либо параметров нам иногда приходится обращаться к системному реестру в поисках ключей, значений и т.п. С использованием возможностей Windows PowerShell эта задача может быть решена достаточно простым способом. Возможности Windows PowerShell показаны на рис. 14.
Наша первая команда использует алиасsl для выполнения команды set-location , изменяющей наше текущее местоположение с файловой системы на ветвь HKEY_CURRENT_USER в системном реестре:
PS C:\> sl hkcu:
Отметим, что, как и в случае работы с файловой системой, PowerShell применяет специальный провайдер для доступа к реестру.
Аналогами приведенной выше команды являются команды:
PS C:\> sl registry:hkcu
PS C:\> sl hkey_current_user
Следующая команда загружает содержимое всей ветви реестра HKEY_CURRENT_USER в переменную reg:
PS HKCU:\> $reg = gci . –rec –ea silentlycontinue
Для этого мы используем команду get-childitem (алиас - gci ), принцип работы которой аналогичен работе с файловой системой. Первый аргумент этой команды - «.» - указывает на то, что мы хотим получить содержимое текущей ветви реестра - HKEY_CURRENT_USER. Второй аргумент является сокращением от опции –recurse и указывает на то, что нам нужен рекурсивный сбор данных из всех подветвей текущей ветви реестра. И наконец, третий аргумент - –ea silentlycontinue - указывает на то, что команда должна продолжать выполняться даже в случае возникновения ошибок, связанных с недостатком прав доступа к определенным подветвям реестра.
Следующая команда в нашем примере:
PS HKCU:\>$s = $reg | % {if (gp $_.pspath) –match ‘PowerShell’){$_.pspath}}
копирует из реестра данные, содержащие строку ‘PowerShell’ . Мы начинаем с того, что берем объект reg и перенаправляем его в команду % , которая является алиасом команды for-each . Она выполняет рекурсивный обход всех элементов реестра, находящихся в объекте reg и на каждом шаге сохраняет элемент в специальном объекте PowerShell с именем ‘_’ . В фигурных скобках мы указываем действия, которые должны выполняться на каждом шаге выполнения команды for-each . Внутри блока for-each мы используем проверку if для того, чтобы узнать, соответствуют ли текущая запись реестра и ее свойство pspath, которые мы получаем через обращение к команде get-itemproperty (через алиас gp ), нашему критерию - наличию строки ‘PowerShell’ . Если соответствие найдено, мы возвращаем значение свойства pspath . Все найденные соответствия сохраняются в объекте s .
Работу с реестром мы завершаем перенаправлением результатов поиска в команду select-object (через алиас select ) и показываем два первых найденных результата. В качестве упражнения вы можете перенаправить финальные результаты в файл с помощью команды out-file .
Доступ к процессам
Еще одна задача, с которой могут столкнуться ИТ-специалисты, связана с обнаружением аномалий в работе системы, например процессов, которые потребляют большие объемы памяти. Давайте посмотрим, как эта задача решается средствами Windows PowerShell (рис. 15).
В первой команде мы сохраняем информацию о всех процессах, запущенных на данном компьютере, в переменной $allprocs :
PS C:\> $allprocs = get-process
После этого мы перенаправляем полученную информацию команде for-each , которая тоже может быть указана алиасом % или foreach . Данная команда перебирает все объекты, связанные с процессом, и на каждом шаге сохраняет информацию во внутреннем объекте $_ . Этот объект можно условно назвать текущим объектом. В качестве параметров для команды for-each мы указываем операцию сравнения значения свойства virtualmemorysize с интересующим нас размером памяти (20 Мбайт в нашем примере). Если значение этого свойства для текущего объекта больше заданного, мы выводим название процесса на экран. Отметим, что в PowerShell поддерживаются основные сокращения для указания размеров - KB, MB, GB, что очень полезно, поскольку не нужно считать нули при указании объемов памяти, дисков и т.п.
Доступ к системному журналу
При попытке обнаружения причин сбоев мы часто обращаемся к системному журналу, в котором хранится множество полезной информации о событиях, происходивших в системе. Обычно для исследования системного журнала применяется утилита Event Viewer (eventvwr.exe). В PowerShell мы можем воспользоваться встроенными командами, например командой get-eventlog , для быстрого исследования содержимого системного журнала (рис. 16).
Наша первая команда загружает ключевую информацию из системного журнала:
PS C:\> get-eventlog –list
Без использования опции –list PowerShell запросит точное указание названия системного журнала. В нашем примере мы видим несколько точек входа в системном журнале: Application, Internet Explorer, System, Windows Power Shell и т.п. Наша следующая команда извлекает записи из системного журнала, которые имеют тип “Error” :
PS C:\> $bad = get-eventlog “System” | where-object { $_.EntryType –eq “Error” }
Мы используем команду get-eventlog , которой указываем параметр “System” для извлечения только системных записей, - мы могли бы более четко задать это, применив параметр logName . Содержимое переменной $bad передается на вход команде where-object для фильтрации только интересующих нас записей. В качестве аргументов команды where-object мы указываем на то, что ищем только записи, у которых свойство EntryType равно “Error” .
Мы завершаем исследование системного журнала выводом на экран пяти последних записей об ошибках, используя для этого команду select-object с параметром –last :
PS C:\> $bad | select-object –last 5
Доступ к WMI
Как мы знаем, Windows Management Instrumentation (WMI) - это реализация компанией Microsoft стандарта Common Information Model (CMI). В большинстве случаев WMI применяется ИT-специалистами для получения информации об аппаратном и программном обеспечении, установленном на данном компьютере. Как мы увидим в следующем примере, использование Windows PowerShell существенно облегчает доступ к информации, хранимой в WMI (рис. 17).
В первой строке мы применяем команду get-wmiobject для получения информации о файле, используемом для свопинга памяти на диск и сохранения этой информации в переменной $pfu :
PS C:\> $pfu = get-wmiobject – class ‘win32_pageFileUsage’
PS C:\> $pfu | get-member –membertype property | where_object { $_.name –nomatch ‘_’ }
Обычно для нахождения информации по определенному классу можно использовать команду get-member без указания параметров, но в нашем примере нас интересуют только доступные свойства и только те из них, которые не содержат в имени символ подчеркивания. У внимательного читателя может возникнуть вопрос: каким образом мы узнали о существовании класса win32_pageFileUsage ? Ведь известно, что в WMI поддерживается более тысячи классов, помимо этого ряд приложений добавляет свои классы. Вы можете применить команду:
PS C:\> get-wmiobject –list
для получения списка всех существующих в системе классов. После того как мы определили доступные нам свойства класса, мы выводим содержимое интересующих нас свойств на экран:
PS C:\> $pfu.caption; $pfu.currentusage
Вторая часть нашего примера посвящена другому классу - win32_DiskDrive , в котором хранится информация о дисках, установленных в системе. Этот класс - пример WMI-класса, содержащего более одного объекта. В нашем примере мы определяем значение свойства caption первого диска, установленного в системе:
PS C:\> $dd.caption
Использование XML-файлов
В последнее время XML-файлы все чаще используются для хранения конфигурационной информации. По мере того как данные в XML-файле накапливаются, он становится все менее удобным для прочтения. Далее мы рассмотрим, как применять функции Windows PowerShell для работы с XML-файлами.
Для примера возьмем конфигурационный файл Windows Calendar, который выглядит так (рис. 18):
и выполним над ним манипуляции, представленные на рис. 19.
В первой строке мы загружаем содержимое всего XML-файла в переменную, используя команду get-content :
PS C:\> $doc = get-content ‘.\settings.xml’
Обратим внимание на применение типа данных : если не указать использование данных этого типа, в переменную будет загружен просто текст.
Во второй строке мы выбираем определенную ветвь XML-файла - для этого применяется метод selectnodes объекта, хранящего XML-данные и XPath-описание адреса ветви:
PS C:\> $settings = $doc.selectnode(‘CalendarSettings/X-Root/VCalendar’)
После этого мы используем команду foreach-object для получения значения свойства Name для всех элементов в данной ветви.
Заключение
Мы рассмотрели основные возможности Windows PowerShell для упрощения задач, возникающих перед ИT-специалистами. Как мы знаем, эти задачи часто решаются с помощью скриптового языка VBScript. В Windows PowerShell есть возможность применения существующего кода на VBScript, а следовательно, миграция значительно упрощена (рис. 20).
В приведенном выше примере показано, как можно использовать существующий код на VBScript в PowerShell. В первой строке мы создаем новый COM-объект, который представляет собой ядро выполнения скриптовых программ - ScriptControl. Затем мы указываем, что будем использовать язык Visual Basic Script. В третьей строке задается собственно код на VBScript - в нашем примере это вызов функции MsgBox, но на практике в переменную можно, например, загрузить код файла. И наконец, в последней строке мы добавляем код на VBScript в наш объект - и код поступает на выполнение.
Сетевые ресурсы
Блог команды разработчиков продукта: http://blogs.msdn.com/PowerShell/ .
Утилиты, редакторы и дополнения: http://www.powershell.com/ .
Блог Дмитрия Сотникова из компании Quest: http://dmitrysotnikov.wordpress.com/ .
PowerGadgets - пример неограниченных возможностей расширения PowerShell: