Аннотация: Описываются возможности оболочки Windows PowerShell и отличие ее от традиционных оболочек и языков сценариев. Обсуждаются основные концепции PowerShell (типы команд, структура командлетов, псевдонимы команд). Рассматриваются особенности справочной системы PowerShell
Введение в оболочку командной строки Windows PowerShell
На настоящий момент мы рассмотрели уже три разных инструмента, предназначенных для автоматизации работы в операционной системе Windows: оболочки командной строки Cmd.exe и WMIC, а также сервер сценариев WSH. Зачем же компании Microsoft понадобилась разработка еще одной полностью новой оболочки командной строки со своим языком сценариев?
Причины и цели создания новой оболочки
Чтобы ответить на этот вопрос, вспомним основные требования к «идеальному» средству автоматизации, которые мы обсуждали в первой лекции, и посмотрим, в какой степени удовлетворяют этим требованиям перечисленные выше инструменты (табл.16.1).
Требование | Cmd.exe | WSH | WMIC |
---|---|---|---|
Работа во всех версиях операционной системы без установки дополнительного программного обеспечения | Да | Да | Нет (только Windows XP и выше) |
Интеграция с командной строкой | Да | Нет | Да |
Согласованный и непротиворечивый синтаксис команд и утилит | Нет | Нет | Да |
Поддержка псевдонимов (кратких синонимов) для длинных названий команд | Нет | Нет | Да |
Автоматическое завершения команд и имен файлов при вводе их с клавиатуры | Частично (автоматическое завершение имен файлов и папок) | Нет | Нет |
Поддержка истории введенных команд с возможностью их повторного вызова, просмотра и редактирования | Да | Нет | Да |
Наличие подробной встроенной справки по командам с примерами использования | Частично | Нет | Да |
Возможность автоматического выполнения сценариев | Да (язык командных файлов) | Да (языки сценариев VBScript, JScript и т.д.) | Частично (команды WMIC можно встраивать в командные файлы) |
Доступ и использование всех технологий и возможностей, поддерживаемых операционной системой | Нет (нет прямого доступа к объектам COM, WMI, ADSI, .NET) | Да | Нет (доступ только к объектам WMI) |
Как мы видим, у каждого из рассмотренных нами ранее инструментов автоматизации присутствовали довольно серьезные недостатки, не позволявшие сказать, что 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).
Выполним первую команду в 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. Анализ синтаксиса сценария производится при каждом его запуске.
Последний тип команд – внешние исполняемые файлы, которые выполняются обычным образом операционной системой.
#Руководства
-
0
Рассказываем о языке программирования, с помощью которого можно творить чудеса в Windows (и не только).
Иллюстрация: Francesca Tosolini / Unsplash / Annie для Skillbox Media
Журналист, изучает Python. Любит разбираться в мелочах, общаться с людьми и понимать их.
Рядовые пользователи общаются со своими ПК через графический интерфейс: нажимают иконки и кнопки, переключаются между окнами и вкладками.
А системные администраторы используют для этого командную строку. Чтобы компьютер понимал их указания, интерпретатор, он же командная оболочка, переводит всё на машинный язык.
Есть десятки оболочек под разные нужды, предпочтения и операционные системы. В Linux обычно используют Bash, в macOS по умолчанию установлен Zsh, а для Windows (но не только) есть PowerShell.
Из статьи вы узнаете:
- Что такое Windows PowerShell
- Как открыть PowerShell в Windows
- Какие у неё есть команды (они же командлеты)
- Что такое объекты и конвейеры (пайплайны)
- Как запустить выполнение задач в фоновом режиме
- Как работать в PowerShell ISE
- О переменных
- О логических операторах
- Об условиях в Power Shell
- Как работать с циклами
- О массивах, хеш-таблицах, функциях и классах
Windows PowerShell — это одновременно командная оболочка и язык сценариев, основанный на .NET. PowerShell используют для управления компьютером и автоматизации задач. Это полноценный объектно-ориентированный язык, в котором есть переменные, функции, классы и объекты.
В отличие от других командных оболочек, PowerShell работает не со строками, а с объектами. Благодаря этому можно создавать сложную логику. При этом интерпретатор полностью совместим со стандартными командами cmd.exe и может выполнять их.
Команды пишут в интерактивном режиме внутри терминала. Но если вы хотите сохранить какой-то часто используемый скрипт, удобнее использовать ISE.
Windows PowerShell ISE — это интегрированная среда сценариев для PowerShell. В ней можно писать, сохранять и запускать скрипты, есть подсветка синтаксиса, автодополнение, справочник команд и инструменты отладки. PowerShell ISE — легаси-инструмент, он работает для версии языка 5.1 и ниже. Для более поздних обновлений используют IDE общего назначения с плагинами.
С 2016 года язык стал кросс-платформенным. Его можно использовать не только в Windows, но и в macOS (начиная с версии 10.13) и популярных дистрибутивах Linux (каких именно, можно узнать в документации).
Обычно PowerShell предустановлен по умолчанию. Но если у вас его нет, можете воспользоваться инструкцией от Microsoft. Также в документации есть руководства по установке для macOS и Linux.
PowerShell не зависит от версии операционной системы и одинаково работает как на Windows 10, так и на Windows Server.
Есть два основных способа открыть PowerShell или PowerShell ISE в Windows: меню «Пуск» и приложение «Выполнить».
В меню «Пуск» долистайте до папки Windows PowerShell, откройте её и выберите нужное приложение. Здесь есть 32-разрядные (у них х86 в скобках) и 64-разрядные версии терминала и ISE.
Скриншот: Skillbox Media
Приложение «Выполнить» открывается сочетанием клавиш Win + R. В появившемся окне введите powershell или powershell ise (в зависимости от того, что вам нужно) и нажмите ОК.
Скриншот: Skillbox Media
Команды в PowerShell называются командлетами (от английского cmdlet). Все они состоят из связки «Глагол-Существительное», или по-другому «Действие-Объект». Например, Get-Services и Start-Process. Благодаря такой структуре можно понять назначение команды, даже если вы с ней ещё не сталкивались.
После самого командлета ему передаются параметры и их значения. Между всеми словами в команде ставится пробел. Вот пример синтаксиса команды, чтобы перейти в каталог C:\:
Set-Location -LiteralPath C:\ -PassThru
Препарируем её:
- Set-Location — буквально «установить местоположение». Переходит в нужный каталог.
- -LiteralPath C:\ — в этом параметре мы прописываем путь до каталога, в который хотим перейти. У командлета Set-Location это аргумент по умолчанию, поэтому -LiteralPath можно не прописывать отдельно: Set-Location C:\ -Passthru сработает точно так же.
- -PassThru — обычно командлет Set-Location просто меняет местоположение и ничего не возвращает. Этот параметр говорит, что нужно вывести на экран расположение каталога, в который мы перешли.
При этом в PowerShell не важен регистр. Эту же команду можно записать только заглавными буквами, только строчными и даже «лесенкой» — она всё равно сработает.
sEt-loCATion -PATH c:\ -passthru
Если в одной строке написаны сразу несколько команд, они разделяются точкой с запятой ;.
Иногда команда может получиться слишком длинной. Чтобы разбить её на несколько строк, в месте переноса ставится гравис `. Создать новую строку можно сочетанием клавиш Shift + Enter (появится ниже текущей) или Ctrl + Enter (появится выше текущей).
Разделим предыдущую команду:
Set-Location `
-LiteralPath C:\ `
-PassThru
Совет
Стрелки вверх и вниз позволяют прокручивать историю команд, которые вы вводили. Это удобно, если нужно выполнить одну из предыдущих команд ещё раз или внести в неё небольшие изменения.
При работе с терминалом в интерактивном режиме бывает неудобно каждый раз вводить полные названия командлетов. Поэтому у самых распространённых есть псевдонимы, или алиасы, — их сокращённые версии.
Получить список доступных алиасов можно командой Get-Alias (у неё тоже есть свой псевдоним — gal).
Чтобы узнать список алиасов для отдельного командлета, воспользуйтесь параметром -Definition. Например:
Get-Alias -Definition Get-ChildItem
Если вы по алиасу хотите узнать полное название командлета, примените параметр -Name. Это аргумент по умолчанию, поэтому писать его необязательно.
# Оба варианта равноправны Get-Alias -Name clear Get-Alias clear
Многим командлетам для работы нужно передать путь до файла или каталога. Делается это в виде строки, например: C:\Windows\System32.
Но если в этом адресе встретится пробел или другой спецсимвол, PowerShell воспримет его как разделитель. Например:
# Эта команда не будет работать Set-Location C:\Program Files
PowerShell «видит» пробел и думает, что путь до папки закончился на слове Program, а files — это уже значение какого-то другого параметра.
Есть два способа избежать таких ситуаций:
- Экранировать проблемные символы обратным грависом `: C:\Program` Files. Если путь длинный, то это может быть неудобно.
- Поместить весь путь в одинарные или двойные кавычки: ‘C:\Program Files’ или «C:\Program Files» (лучше одинарные).
Также в PowerShell есть сокращения для быстрого доступа к ближайшим директориям:
- Точка . указывает на текущий каталог. Например, Get-ChildItem . позволяет посмотреть все папки и файлы в нынешнем местоположении.
- Две точки .. указывают на родительский каталог. Например, Set-Location .. позволяет быстро к нему перейти. Это может быть полезно, если вы находитесь где-то в глубоко вложенной директории.
У многих командлетов есть сразу два параметра, в которых можно указать путь до папки или файла: -Path и -LiteralPath. Разница между ними в том, что в -Path можно подставлять переменные, а -LiteralPath воспринимает символы буквально, даже если в них указано имя переменной. О переменных в PowerShell мы рассказываем ниже.
Чтобы узнать подробную информацию о командлете, используйте Get-Help Название-Командлета. Например:
Get-Help Get-Childitem
У Get-Help есть несколько полезных параметров:
- -Detailed даёт более детальную справку.
- -Full даёт полную справку.
- -Examples приводит примеры использования командлета.
- -Online перенаправляет на веб-страницу с документацией.
Командлеты PowerShell возвращают в терминал не строки, а объекты — структуру данных с набором свойств и методов. Подробно об объектах можно прочитать в нашей статье.
Строка, которую вы видите в терминале после выполнения команды — только визуальное представление объекта. PowerShell в виде таблицы показывает некоторые свойства, но не все.
Так же, как командлеты возвращают объекты, они могут принимать и обрабатывать их. Можно написать команду, на выходе получить объект, передать его другому командлету, получить объект уже от него, передать — и так до бесконечности. Это и есть конвейеры, или пайплайны.
Чтобы передать результат командлета другому командлету, между ними ставят вертикальную черту |.
Get-Process возвращает список процессов, запущенных на компьютере. Если передать ему название процесса (или шаблон, написанный с помощью регулярных выражений), командлет выведет только нужные элементы списка.
Вызовем запущенный процесс powershell.
Get-Process powershell
Мы получили объект и таблицу с некоторыми его свойствами. Чтобы узнать все свойства и методы, передадим объект командлету Get-Member. Для этого нам и понадобится конвейер.
Get-Process powershell | Get-Member
Get-Member получил объект от Get-Process и вывел таблицу со всем его содержимым. Результат работы Get-Member — тоже объект (вернее, список объектов), который можно передать по конвейеру дальше.
Например, мы хотим отобразить только те строки, в которых MemberType — это Property. Для этого используем командлет Where-Object.
Get-Process powershell | Get-Member | Where-Object {$_.MemberType -eq 'Property'}
Where-Object по очереди перебирает каждый объект, полученный от Get-Member. Выражение в фигурных скобках — логическое:
- $_ ссылается на текущий объект (то есть на отдельную строку в таблице);
- .MemberType обращается к значению свойства MemberType в этом объекте;
- -eq сравнивает, равно ли выражение слева от него выражению справа от него;
- ‘Property’ — это значение, которое мы ожидаем увидеть у свойства MemberType.
О логических выражениях мы рассказываем ниже.
Командлет Format-Table позволяет настроить отображение таблицы, которую PowerShell выводит в терминале: выбрать свойства и методы, которые в ней будут, установить ширину столбцов, сгруппировать данные по нескольким таблицам и так далее.
Отформатируем таблицу, которую получили от командлета Get-Member.
Get-Process powershell | Get-Member | Format-Table -AutoSize -Wrap -GroupBy MemberType -Property Name, Definition
Расшифруем параметры Format-Table:
- -AutoSize выравнивает ширину столбцов по размеру их содержимого;
- -Wrap переносит содержимое ячейки на следующую строку, если она не помещается в размеры экрана (по умолчанию текст обрезается);
- -GroupBy разделяет одну таблицу на несколько, сгруппированных по значению какого-либо свойства (в нашем случае для каждого MemberType создана отдельная таблица);
- -Property указывает, какие свойства объекта будут отображаться в таблице в качестве столбцов (в нашем случае Name и Definition).
Командлет Sort-Object позволяет отсортировать список объектов (то есть таблицу) по значениям её свойств (то есть столбцов). Отсортируем результат работы GetMember по столбцу Name в алфавитном порядке. Для этого используем параметр -Property (работает как у Format-Table).
Get-Process powershell | Get-Member | Sort-Object -Property Name
У Sort-Object есть и другие полезные параметры:
- -Descending сортирует объекты в порядке убывания.
- -Unique удаляет дубликаты и возвращает только уникальные объекты.
- -Top получает число N и отображает первые N объектов в таблице.
- -Bottom получает число N и отображает последние N объектов в таблице.
Некоторые задачи могут занимать много времени. Это, например, установка и обновление ПО, поиск файла в большой директории. Пока PowerShell выполняет одну команду, писать другие нельзя.
К примеру, попытаемся найти на всём диске C файл powershell.exe. Используем для этого командлет Get-ChildItem с параметром -Recurse. Так он будет искать не только в текущем каталоге, но и во всех подкаталогах.
PowerShell может попытаться зайти в папки, к которым у него нет доступа, поэтому добавим -ErrorAction SilentlyContinue. Если случится ошибка, команда не станет сообщать об этом и просто продолжит выполняться.
Получается так:
Get-ChildItem -Path C:\ -Name powershell.exe -Recurse -ErrorAction SilentlyContinue
Как видим, пока задача не завершена, командная строка недоступна. Чтобы принудительно прервать её выполнение, нажмите сочетание клавиш Ctrl + C (при этом ничего не должно быть выделено, иначе компьютер воспримет это как команду «Копировать»).
Чтобы не ждать выполнения долгих задач и сразу приступать к следующим, их можно запускать в фоновом режиме. Делается это командлетом Start-Job, а сама команда помещается в фигурные скобки.
Start-Job {Get-ChildItem -Path C:\ -Name powershell.exe -Recurse -ErrorAction SilentlyContinue}
Одновременно можно выполнять любое количество фоновых задач. Помимо Start-Job для работы с фоновыми задачами есть другие командлеты:
- Get-Job выдаёт отчёт со статусом фоновых задач.
- Wait-Job делает консоль недоступной, пока выполняется фоновая задача.
- Stop-Job прерывает выполнение фоновой задачи.
- Receive-Job выводит результат фоновой задачи и удаляет его из памяти. Чтобы сохранить результат в памяти, используйте параметр -Keep.
Wait-Job, Stop-Job и Receive-Job ожидают, что вы примените их к конкретной задаче (или нескольким). Для этого укажите название Name или идентификатор Id. Делать это можно и в связке с Get-Job.
Get-Job Job1
Терминал PowerShell удобен для выполнения небольших коротких однострочных задач. Чтобы создавать и сохранять сложные скрипты, есть интегрированная среда сценариев.
Важно!
PowerShell ISE предназначен для версий языка 5.1 и младше. Для более старших версий Microsoft рекомендует использовать Visual Studio Code с расширением PowerShell.
PowerShell ISE состоит из трёх основных окон:
- область сценариев в верхней части экрана — в ней пишут скрипты;
- область консоли в нижней части экрана — работает так же, как обычный терминал, здесь можно писать команды в интерактивном режиме;
- панель команд в правой части экрана — полный справочник команд PowerShell с конструктором, в котором можно указать значения нужных параметров.
PowerShell позволяет вставлять в код комментарии. Они никак не влияют на выполнение скрипта и нужны людям, которые будут читать вашу программу. Однострочный комментарий начинается с символа #, а многострочный обрамляется с двух сторон символами <# и #>.
Любой код чаще читают, чем пишут, и важно делать его понятным для человека. Разработчики PowerShell договорились между собой о едином своде правил и выпустили стайлгайд. Вот несколько правил оттуда.
Используйте нотацию PascalCase в названиях командлетов, функций, параметров, свойств, методов, переменных и классов. Неправильно писать: get-service, Get-service, GET-SERVICE. Правильно: Get-Service.
Пишите полные названия командлетов. Алиасы удобны для работы в интерактивном режиме, но в скриптах могут затруднять чтение команд. Неправильно: dir, gci, ls. Правильно: Get-ChildItem.
One True Brace Style при оформлении вложенности. Если вы где-то используете фигурные скобки, то код внутри них отбивается табуляцией (четыре пробела), а сами скобки ставятся так:
if ($var1 -eq $var2) { # Код внутри условия } else { # Код внутри условия # Ещё код внутри условия }
Исключение из прошлого правила — когда код в фигурных скобках совсем небольшой, его можно записать в одну строку. Например:
Get-ChildItem | Where-Object { $_.Length -gt 10mb }
Комментируйте код. Так будет гораздо проще разобраться, что он делает и как работает. Причём как другому человеку, так и вам самим через полгода.
В PowerShell ISE можно выполнить код целиком или частично, есть инструменты отладки. Скрипты сохраняются в файлах с расширением .ps1. Но запустить их двойным кликом не получится — нужно нажать правую кнопку мыши и в появившемся окне выбрать Выполнить с помощью PowerShell.
Также запустить скрипт можно из оболочки. Например, в каталоге C:\Scripts есть файл test_script.ps1. Выполнить его можно:
- командой PowerShell -File C:\Scripts\test_script.ps1, запущенной из любого места;
- командой .\test_script.ps1, запущенной, когда вы находитесь в каталоге C:\Scripts.
По умолчанию запускать любые файлы с PowerShell-скриптами запрещено. Сделано это в целях безопасности. Узнать нынешнюю политику выполнения можно с помощью командлета Get-ExecutionPolicy. Вот какая она может быть:
- Restricted (установлена по умолчанию) — запрещено запускать любые скрипты.
- AllSigned — разрешено запускать только скрипты, которые были подписаны доверенным разработчиком.
- RemoteSigned — разрешено запускать подписанные доверенным разработчиком и собственные скрипты.
- Unrestricted — разрешено запускать любые скрипты.
Чтобы ваши ps1-файлы запускались, нужно заменить политику выполнения на RemoteSigned. Для этого откройте PowerShell от имени администратора и выполните команду:
Set-ExecutionPolicy RemoteSigned
Чтобы подтвердить действие, введите y.
Чтобы сохранять данные и обращаться к ним в будущем, в PowerShell есть переменные. Перед их названием ставится знак доллара $, а сами они могут содержать латинские буквы (заглавные и строчные), цифры и нижние подчёркивания.
Переменная может хранить данные любого типа, и их можно перезаписывать.
Переменную можно привести к определённому типу данных. Создадим переменную со строкой 2023 и преобразуем её в число. Чтобы узнать тип данных, воспользуемся методом .GetType().
Чтобы удалить переменную, используется метод .Clear().
Переменные можно подставлять в строки, если они оформлены двойными кавычками. Если же кавычки одинарные, то PowerShell воспринимает символы в строке буквально. Сравните:
Помимо пользовательских также есть системные переменные. Например, $PSVersionTable хранит информацию о версии PowerShell.
PowerShell позволяет проводить с объектами арифметические операции и сравнивать их друг с другом. Для этого он использует логические операторы.
Арифметические операторы:
- + — сложение;
- — — вычитание;
- * — умножение;
- / — деление;
- % — деление по модулю;
- ( и ) — скобки для группировки операций.
Операторы сравнения оформляются так же, как параметры командлетов. Их названия произошли от английских выражений, указанных в скобках.
- -eq — равно (от equal);
- -ne — не равно (от not equal);
- -gt — больше (от greater than);
- -ge — больше либо равно (от greater than or equal);
- -lt — меньше (от less than);
- -le — меньше либо равно (от less than or equal).
Условия в PowerShell создаются с помощью ключевых слов if, elseif и else. В обычных скобках указывается само условие, в фигурных — код, который запускается при его выполнении. Например:
$Number = 123 if ($Number -gt 0) { Write-Host 'Число больше нуля' } elseif ($Number -lt 0) { Write-Host 'Число меньше нуля' } else { Write-Host 'Число равно нулю' } >>> Число больше нуля
Также условия можно задавать с помощью ключевого слова switch. Например:
$Day = 2 switch ($Day) { 1 {Write-Host 'Понедельник'} 2 {Write-Host 'Вторник'} 3 {Write-Host 'Среда'} 4 {Write-Host 'Четверг'} 5 {Write-Host 'Пятница'} 6 {Write-Host 'Суббота'} 7 {Write-Host 'Воскресенье'} } >>> Вторник
Windows PowerShell — язык программирования, на котором администрируют операционные системы и автоматизируют процессы. Он поддерживает объектно-ориентированное программирование и позволяет работать в интерактивном режиме, а также писать, сохранять и выполнять полноценные скрипты.
- PowerShell предустановлен в Windows, но его можно скачать на macOS и Linux.
- У языка есть собственная интегрированная среда сценариев PowerShell ISE, предназначенная для старых версий языка (5.1 и ниже).
- PowerShell работает не со строками, а с объектами. Он обрабатывает их с помощью командлетов, построенных по принципу «Глагол-Существительное».
- Результат выполнения одного командлета можно передавать другому в конвейере.
- Задачи можно выполнять в фоновом режиме.
- PowerShell — высокоуровневый язык, на котором можно работать с переменными, логическими операторами, условиями, циклами, массивами, хеш-таблицами, функциями и классами.
Жизнь можно сделать лучше!
Освойте востребованную профессию, зарабатывайте больше и получайте от работы удовольствие. А мы поможем с трудоустройством и важными для работодателей навыками.
Посмотреть курсы
Исторически утилиты командной строки в Unix-системах развиты лучше чем в Windows, однако с появлением нового решения ситуация изменилась.
Windows PowerShell позволяет системным администраторам автоматизировать большинство рутинных задач. С ее помощью можно менять настройки, останавливать и запускать сервисы, а также производить обслуживание большинства установленных приложений. Воспринимать синее окошко как еще один интерпретатор команд было бы неправильно. Такой подход не отражает сути предложенных корпорацией Microsoft инноваций. На самом деле возможности Windows PowerShell гораздо шире: в небольшом цикле статей мы попробуем разобраться, чем решение Microsoft отличается от более привычных нам средств.
Основные возможности
Разумеется Windows PowerShell — это в первую очередь командная оболочка с языком сценариев, изначально созданная на основе платформы .NET Framework, а позднее — на .NET Core. В отличие от принимающих и возвращающих текстовые данные оболочек, Windows PowerShell работает с классами .NET, у которых есть свойства и методы. PowerShell позволяет выполнять обычные команды, а также дает доступ к объектам COM, WMI и ADSI. В ней используются различные хранилища, вроде файловой системы или реестра Windows, для доступа к которым созданы т.н. поставщики (providers). Стоит отметить возможность встраивания исполняемых компонентов PowerShell в другие приложения для реализации различных операций, в т.ч. через графический интерфейс. Верно и обратное: многие приложения для Windows предоставляют доступ к своим интерфейсам управления через PowerShell.
Windows PowerShell позволяет:
- Менять настройки операционной системы;
- Управлять службами и процессами;
- Настраивать роли и компоненты сервера;
- Устанавливать программное обеспечение;
- Управлять установленным ПО через специальные интерфейсы;
- Встраивать исполняемые компоненты в сторонние программы;
- Создавать сценарии для автоматизации задач администрирования;
- Работать с файловой системой, реестром Windows, хранилищем сертификатов и т.д.
Оболочка и среда разработки
Существует Windows PowerShell в двух ипостасях: помимо эмулятора консоли с командной оболочкой есть интегрированная среда сценариев (Integrated Scripting Environment — ISE). Чтобы получить доступ к интерфейсу командной строки достаточно выбрать соответствующий ярлык в меню Windows или запустить powershell.exe из меню «Выполнить». На экране появится синее окошко, заметно отличающееся по возможностям от допотопного cmd.exe. Там есть автодополнение и другие фишки, привычные пользователям командных оболочек для Unix-систем.
Для работы с оболочкой нужно запомнить некоторые сочетания клавиш:
- Стрелки вверх и вниз прокручивают историю для повтора ранее набранных команд;
- Стрелка вправо в конце строки перенабирает предыдущую команду посимвольно;
- Ctrl+Home удаляет набранный текст от позиции курсора до начала строки;
- Ctrl+End удаляет текст от курсора до конца строки.
F7 показывает окно с набранными командами и позволяет выбрать одну из них. В консоли также работает выделение текста мышью, копипаст, позиционирование курсора, удаление, backspace — все как мы любим.
Windows PowerShell ISE является полноценной средой разработки с поддерживающим вкладки и подсветку синтаксиса редактором кода, конструктором команд, встроенным отладчиком и другими программистскими радостями. Если в редакторе среды разработки после имени команды написать знак дефис, вы получите в выпадающем списке все доступные параметры с указанием типа. Запустить PowerShell ISE можно либо через ярлык из системного меню, либо с помощью исполняемого файла powershell_ise.exe.
Командлеты
В Windows PowerShell появились т.н. командлеты (cmdlets). Это специализированные классы .NET, в которые заложена разнообразная функциональность. Именуются они по принципу «Действие-Объект» (или «Глагол-Существительное, если вам так больше нравится), а разделенная дефисом связка напоминает сказуемое и подлежащее в предложениях естественных языков. Например, Get-Help буквально означает «Получить-Помощь» или в контексте PowerShell: «Показать-Справку». По сути это аналог команды man в Unix-системах и мануалы в PowerShell нужно запрашивать именно так, а не вызывая командлеты с ключом —help или /?.. Не стоит забывать и об онлайн-документации по PowerShell: у Microsoft она достаточно подробная.
Помимо Get в командлетах для обозначения действий используются и другие глаголы (и не только глаголы, строго говоря). В списке ниже мы приведем несколько примеров:
Add
— добавить;
Clear
— очистить;
Enable
— включить;
Disable
— выключить;
New
— создать;
Remove
— удалить;
Set
— задать;
Start
— запустить;
Stop
— остановить;
Export
— экспортировать;
Import
— импортировать.
Есть системные, пользовательские и опциональные командлеты: в результате выполнения все они возвращают объект или массив объектов. К регистру они не чувствительны, т.е. с точки зрения интерпретатора команд нет разницы между Get-Help и get-help. Для разделения используется символ ‘;’, но ставить его обязательно только если в одной строке выполняется несколько командлетов.
Командлеты Windows PowerShell группируются в модули (NetTCPIP, Hyper-V и т.д.), а для поиска по объекту и действию существует командлет Get-Command. Показать справку по нему можно так:
Get-Help Get-Command
По умолчанию команда отображает краткую справку, но в командлеты при необходимости передаются параметры (аргументы). С их помощью можно, например, получить детальную (параметр -Detailed) или полную (параметр -Full) справку, а также вывести на экран примеры (параметр -Examples):
Get-Help Get-Command -Examples
Справка в Windows PowerShell обновляется командлетом Update-Help. Если строка команд получается слишком длинной, аргументы командлета можно перенести на следующую, написав служебный символ ‘`’ и нажав Enter — просто закончить писать команду на одной строке и продолжить на другой не получится.
Ниже приведем несколько примеров распространенных командлетов:
Get-Process
— показать запущенные в системе процессы;
Get-Service
— показать службы и их статус;
Get-Content
— вывести содержимое файла.
Для часто используемых командлетов и внешних утилит в Windows PowerShell есть короткие синонимы — алиасы (от англ. Alias). Например, dir — алиас Get-ChildItem. Есть в списке синонимов и аналоги команд из Unix-систем (ls, ps и т.д.), а командлет Get-Help вызывается командой help. Полный список синонимов можно посмотреть с помощью командлета Get-Alias:
Сценарии, функции, модули и язык PowerShell
Скрипты Windows PowerShell хранятся в виде обычных текстовых файлов с расширением .ps1. Запустить их двойным кликом нельзя: нужно правой кнопкой мыши вызвать контекстное меню и выбрать пункт «Запустить в PowerShell». Из консоли придется либо указать полный путь к скрипту, либо перейти в соответствующий каталог и написать имя файла. Запуск сценариев также ограничен системной политикой, а для проверки текущих настроек можно использовать командлет Get-ExecutionPolicy, который выдаст одно из следующих значений:
Restricted
— запуск сценариев запрещен (по умолчанию);
AllSigned
— разрешен только запуск подписанных доверенным разработчиком сценариев;
RemoteSigned
— разрешен запуск подписанных и собственных сценариев;
Unrestricted
— разрешен запуск любых сценариев.
У администратора есть два варианта действий. Наиболее безопасный предполагает подписание скриптов, но это довольно серьезное колдунство — мы будем разбираться с ним в следующих статьях. Сейчас пойдем по пути наименьшего сопротивления и поменяем политику:
Set-ExecutionPolicy RemoteSigned
PowerShell для этого придется запустить от имени администратора, хотя с помощью специального параметра можно изменить политику и для текущего пользователя.
Пишутся скрипты на объектно-ориентированном языке программирования, команды которого именуются по тому же принципу, что и рассмотренные ранее командлеты: «Действие-Объект» («Глагол-Существительное»). Основное его предназначение — автоматизация задач администрирования, но это полноценный интерпретируемый язык, в котором есть все необходимые конструкции: условный переход, циклы, переменные, массивы, объекты, обработка ошибок и т.д. Для написания сценариев годится любой текстовый редактор, но удобнее всего запустить Windows PowerShell ISE.
В скрипт можно передавать параметры, делать их обязательными, а также задавать значения по умолчанию. Кроме того Windows PowerShell позволяет создать функции и вызывать их точно так же, как и командлеты: для этого используется конструкция Function и фигурные скобки. Сценарий с функциями называется модулем и имеет расширение .psm1. Модули должны храниться в каталогах, определенных в переменных окружения PowerShell. Посмотреть их можно при помощи следующей команды:
Get-ChildItem Env:\PSModulePath | Format-Table -AutoSize
Конвейеры
В последнем примере мы применили знакомую пользователям оболочек для Unix-систем конструкцию. В Windows PowerShell вертикальная черта также позволяет передать выход одной команды на вход другой, но в реализации конвейера есть и существенная разница: речь здесь идет уже не о наборе символов или каком-то тексте. Встроенные командлеты или пользовательские функции возвращают объекты или массивы объектов, а также могут получать их на входе. Как в Bourne shell и его многочисленных последователях, в PowerShell с помощью конвейера упрощается выполнение сложных задач.
Простейший пример конвейера выглядит так:
Get-Service | Sort-Object -property Status
Сначала выполняется командлет Get-Service, а потом все полученные им службы передаются на сортировку по свойству Status командлету Sort-Object. В какой именно аргумент передается результат работы предыдущего участка конвейера, зависит от его типа — обычно это InputObject. Подробнее этот вопрос будет рассматриваться в посвященной языку программирования PowerShell статье.
При желании цепочку можно продолжить и передать результат работы Sort-Object еще одному командлету (выполняться они будут слева направо). Кстати, пользователям Windows доступна и привычная всем юниксоидам конструкция для постраничного вывода:
Get-Service | Sort-Object -property Status | more
Запуск задач в фоновом режиме
Довольно часто бывает нужно запустить некую команду в фоне, чтобы не дожидаться результата ее выполнения в сессии оболочки. В Windows PowerShell есть несколько командлетов на такой случай:
Start-Job
— запуск фоновой задачи;
Stop-Job
— остановка фоновой задачи;
Get-Job
— просмотр списка фоновых задач;
Receive-Job
— просмотр результата выполнения фоновой задачи;
Remove-Job
— удаление фоновой задачи;
Wait-Job
— перевод фоновой задачи обратно в консоль.
Для запуска фоновой задачи мы используем командлет Start-Job и в фигурных скобках указываем команду или набор команд:
Start-Job {Get-Service}
Фоновыми задачами в Windows PowerShell можно манипулировать, зная их имена. Для начала научимся их отображать:
Get-Job
Теперь покажем результат работы задания Job1:
Receive-Job Job1 | more
Всё довольно просто.
Удаленное выполнение команд
Windows PowerShell позволяет выполнять команды и сценарии не только на локальном, но и на удаленном компьютере и даже на целой группе машин. Для этого существует несколько способов:
- У многих командлетов есть параметр
-ComputerName
, но таким способом не получится, например, создать конвейер; - Командлет
Enter-PSSession
позволяет создать на удаленной машине интерактивный сеанс; - С помощью командлета
Invoke-Command
можно выполнять команды или сценарии на одном или нескольких удаленных компьютерах.
Версии PowerShell
С момента первого релиза в 2006 году PowerShell серьезно изменился. Инструмент доступен для множества систем, работающих на разных аппаратных платформах (x86, x86-64, Itanium, ARM): Windows XP, Windows Server 2003, Windows Vista, Windows Server 2008/2008 R2, Windows 7, Windows 8, Windows 8.1, Windows RT, Windows RT 8.1, Windows Server 2012/2012 R2, Windows 10, Windows Server 2016, GNU/Linux и OS X. Последний релиз 6.2 выпущен 10 января 2018 года. Написанные для более ранних версий скрипты с высокой вероятностью будут работать в более поздних, а вот с обратным переносом могут возникнуть проблемы, поскольку за годы развития в PowerShell появилось большое количество новых командлетов. Узнать версию установленной на компьютере командной оболочки можно с помощью свойства PSVersion встроенной переменной $PSVersionTable:
$PSVersionTable.PSVersion
Также можно воспользоваться командлетом:
Get-Variable -Name PSVersionTable –ValueOnly
То же самое делается и с помощью командлета Get-Host. На самом деле вариантов множество, но для их применения нужно изучить язык программирования PowerShell, чем мы и займемся в следующей статье.
Итоги
Корпорации Microsoft удалось создать действительно мощную командную оболочку с удобной интегрированной средой для разработки скриптов. От привычных нам по миру Unix средств ее отличает глубокая интеграция с операционными системами семейства Windows, а также с программным обеспечением для них и платформой .NET Core. PowerShell можно назвать объектно ориентированной оболочкой, потому что командлеты и пользовательские функции возвращают объекты или массивы объектов и могут получать их на входе. Думаем, этим инструментом должны владеть все администраторы серверов на Windows: прошло время, когда они могли обойтись без командной строки. Продвинутая консольная оболочка особенно необходима на наших недорогих VPS, работающих под управлением Windows Server Core, но это уже совсем другая история.
Часть 2: введение в язык программирования Windows PowerShell
Часть 3: передача параметров в скрипты и функции, создание командлетов
Часть 4: Работа с объектами, собственные классы
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Какие темы стоит в первую очередь затронуть в следующих статьях цикла?
53.47%
Программирование в PowerShell
154
40.28%
Функции и модули PowerShell
116
21.53%
Как подписывать собственные скрипты?
62
10.07%
Работа с хранилищами через поставщиков (providers)
29
54.86%
Автоматизация администрирования компьютеров с помощью PowerShell
158
30.56%
Управление программным обеспечением и встраивание исполняемых компонентов PowerShell в сторонние продукты
88
Проголосовали 288 пользователей.
Воздержались 55 пользователей.
Windows PowerShell. Общие сведения.
Windows PowerShell — это командная оболочка Windows,
разработанная в первую очередь для системных администраторов. Она включает
интерактивную командную строку и среду исполнения сценариев, которые можно
использовать вместе или по отдельности.
В Windows PowerShell реализована новая концепция
командлетов — простых, узкоспециализированных средств командной строки,
встроенных в оболочку.
Командлеты можно использовать и по отдельности, однако
по-настоящему их достоинства проявляются тогда, когда эти простые средства
используются в комбинации друг с другом для решения сложных задач. Windows
PowerShell включает более ста основных командлетов, к тому же есть возможность
создавать собственные командлеты и обмениваться ими с другими пользователями.
Как и многие другие оболочки, Windows PowerShell
обеспечивает доступ к файловой системе на компьютере. Кроме того, в состав
оболочки Windows PowerShell входят поставщики, позволяющие столь же легко
работать с другими хранилищами данных, такими как реестр и хранилища
сертификатов цифровых подписей.
В отличие от большинства оболочек, которые принимают и
возвращают текст, оболочка Windows PowerShell, разработанная на основе среды
CRL .NET и платформы .NET Framework, принимает и возвращает объекты .NET.
Структуры папок, или службы, к которым обращаются сценарии PowerShell, в
сущности, являются экземплярами объектов, которые представляют эти папки и
службы.
Конвейерная обработка позволяет получить результаты работы
одной команды и передать их на вход следующей команды при композиции. Например,
команда getmailbox используется для получения списка почтовых объектов,
которыми можно впоследствии манипулировать самыми разными способами. Команда
get-mailbox возвращает не список названий почтовых ящиков; а список объектов,
которые представляют собой почтовые ящики. В этом и состоит отличие
рассматриваемого продукта от других командных оболочек, которые способны только
обрабатывать тексты. Таким образом, PowerShell по своей мощности и эффективности
намного превосходит традиционные командные оболочки.
Политики выполнения.
Сценарии обеспечивают пользователям оболочки Windows
PowerShell широчайшие возможности, но их можно использовать со злым умыслом.
Для защиты пользовательских данных и целостности операционной системы в
оболочке Windows PowerShell реализованы некоторые средства обеспечения
безопасности, в том числе политика выполнения.
Политика выполнения оболочки Windows PowerShell определяет,
можно ли выполнять сценарии, и если да, должны ли они быть подписаны цифровой
подписью.
Кроме того, она
определяет, можно ли загружать конфигурационные файлы.
Политика выполнения по умолчанию (Restricted) обеспечивает
максимальную защиту из всех политик. Она не разрешает выполнять сценарии и
загружать какиелибо конфигурационные файлы, в том числе профиль Windows
PowerShell. Тем не менее, при этом можно работать с оболочкой Windows
PowerShell в интерактивном режиме.
Если нужно выполнять сценарии или загружать
конфигурационные файлы, политику выполнения можно изменить. Чтобы получить
сведения об этом и соответствующие инструкции, выполните следующую команду:
get-help about_signing
Чтобы вывести активную политику выполнения,
введите следующую команду: get-executionpolicy
Для изменения политики выполнения
используйте командлет Set-
ExecutionPolicy.
Например, чтобы сделать действующей политикой выполнения
политику RemoteSigned, введите следующую команду:
set-executionpolicy
remotesigned
Если установлена политика выполнения RemoteSigned,
PowerShell не будет запускать неподписанные сценарии, загруженные из Интернета
(включая электронную почту и программы мгновенного обмена сообщениями).
Если попытаться выполнить загруженный сценарий, PowerShell
выдаст такое сообщение об ошибке:
Нельзя загрузить файл C:\remote.ps1. Файл
C:\remote.ps1 не содержит цифровой подписи. Сценарий не будет выполнен.
Более подробные сведения, см. в
разделе «Get-Help about_signing»
Перед выполнением сценария, просмотрите исходный код, чтобы
убедиться в его надѐжности. Сценарии позволяют сделать то же, что и
исполняемые программы. Для выполнения неподписанного сценария необходимо будет
его разблокировать с помощью свойств файла в оболочке Windows. Если файл
сценария имеет цифровую подпись, но ее издатель не помечен как надежный,
PowerShell выполнит сценарий с запросом подтверждения.
Политика выполнения Windows PowerShell хранится в реестре
Windows и не удаляется даже при переустановке оболочки Windows PowerShell.
Обзор возможностей Windows PowerShell.
В любом интерфейсе командной строки (CLI), к которым
относится и Windows PowerShell, для получения информации используется подход
основанный на вводе команд. Перед использованием команд необходимо знать их
имена. Хотя можно вводить сложные команды, необходимо ознакомиться с
наиболее употребительными командами и параметрами команд.
Большинство интерфейсов командной строки не содержит
структур, которые могли бы помочь пользователю освоить интерфейс. Так как интерфейсы
командной строки были первыми оболочками операционных систем, многие имена
команд и параметров выбирались произвольно. Лаконичные имена команд обычно
использовались для большей ясности. Хотя в большинство CLI встроены справочные
системы и стандарты построения команд, эти интерфейсы обычно разрабатывались с
учѐтом совместимости с более ранними командами, так что набор команд до
сих пор оформлен по решениям, сделанным десятилетия тому назад.
Оболочка Windows PowerShell сконструирована таким
образом, чтобы пользователь мог воспользоваться знаниями, полученными при
работе с более ранними интерфейсами командной строки. Необходимо подробно
рассмотреть некоторые базовые средства и концепции, которые можно использовать
для быстрого изучения оболочки Windows PowerShell. Эти средства и концепции
включают в себя:
1.использование команды Get;
2.использование Cmd.exe и команд ОС UNIX;
3.использование внешних команд;
4.использование
функции автозавершения при помощи клавиши TAB; 5.
использование команды Get-Help.
Работа с объектами.
В отличие от традиционных команд с интерфейсом командной
строки, командлеты оболочки Windows PowerShell предназначены для работы с
объектами, представляющими собой структурированную информацию, являющуюся
более чем строкой символов на экране. Вывод команды всегда содержит
дополнительную информацию, которую при необходимости можно использовать.
Если ранее использовались средства обработки текста для
обработки данных командной строки, то при их использовании в оболочке Windows
PowerShell их функционирование выглядит несколько иначе. В большинстве случаев
для извлечения специальной информации нет необходимости в применении средств
обработки текстовых данных. Получить доступ к данным можно непосредственно с
помощью обычных команд обработки объектов оболочки Windows PowerShell.
С технической точки зрения объект .NET — это экземпляр
класса .NET, состоящий из данных и операций, определѐнных для этих
данных. Объект можно рассматривать как сущность, имеющую свойства
(характеристики сущности) и методы (действия, которые можно выполнять над
сущностью).
Например, при возврате службы средствами оболочки Windows
PowerShell на самом деле возвращается объект, представляющий соответствующую
службу. При просмотре сведений о службе отображаются свойства объекта-службы.
При запуске службы, то есть при изменении ее свойства Status на «started»,
выполняется метод объекта-службы.
Все объекты одного типа имеют одни и те же свойства и
методы, однако значения свойств каждого экземпляра объекта могут быть разными.
Например, каждый объект-служба имеет свойства Name и Status. Однако имя и
статус одной службы могут отличаться от имени и статуса любой другой службы.
Получить сведения об объектах несложно. Чтобы узнать,
объект какого типа получен командлетом, передайте результат выполнения команды
«get» команде GetMember с помощью оператора конвейерной обработки (|).
Например, следующая команда передает объекты, возвращенные командой
Get-Service, команде Get-Member:
Get-service | Get-member
Отображаются сведения об объекте-службе, в том числе имя
типа объекта (System.ServiceProcess.ServiceController) и список его свойств и
методов.
Для получения более подробной справки по работе со
свойствами и методами конкретного типа объекта можно, затем, воспользоваться
справочной системой MSDN или .NET Framework SDK.
Работа с командлетами.
В оболочку PowerShell встроено свыше 100 команд. Можно
создавать дополнительные команды, но при этом следует пользоваться языком
стандарта .NET, таким как Visual Basic .NET или C#. Каждый вариант команды
представляет собой комбинацию «глагол-существительное»; объясняется это тем,
что разработчики хотели использовать единообразную схему именования и тем самым
облегчить изучение, а также расширение оболочки PowerShell. Глагол указывает на
действие, которое предстоит совершить, а существительное — на тип объекта, на
который будет направлено действие. К примеру, команда Get-ChildItem считывает
список элементов текущего рабочего каталога или контейнера, например реестра. Для
выполнения команды нужно ввести ее в командной строке PowerShell и нажать
клавишу ввода.
Если неизвестно, существует ли команда для решения задачи,
которую предстоит выполнить, можно просмотреть список всех команд, выполнив
команду Get-Command. Список выводимых команд можно уменьшить при помощи шаблона
с подстановочными символами:
Get-Command get*
Оболочка Windows PowerShell может выполнять и другие
команды, отличные от командлетов, например, бинарные исполняемые файлы.
Оболочка Windows PowerShell поддерживает сценарии, аналогичные сценариям
оболочки UNIX и пакетным файлам Cmd.exe, но имеющие в имени файла расширение
PS1. Windows PowerShell позволяет также создавать внутренние функции, которые
могут использоваться непосредственно в интерфейсе или в сценариях.
Средства ускорения ввода команд.
К средствам ускорения ввода команд в PowerShell относится
автозавершение строки с помощью клавиши Tab, использование истории команд с
помощью клавиши F7 и задание псевдонимов.
Для автоматического ввода имени файла или пути из имеющихся
возможностей выбора можно ввести часть имени и нажать клавишу Tab. Оболочка
Windows PowerShell автоматически расширит имя до первого найденного ею
совпадения. При повторении нажатия клавиши Tab производится циклический переход
по имеющимся возможностям выбора.
Автоматическое завершение имен команд выглядит несколько
по-иному. Для использования расширения табуляции в имени команды необходимо
ввести глагол и дефис, следующий за глаголом. Повторные нажатия Tab позволят
пройти по списку команд, начинающихся с введенной строки.
Для навигации по истории введенных команд можно
пользоваться стрелками вверх и вниз, а можно воспользоваться клавишей F7.
Механизм псевдонимов связывает вводимое имя команды с
другой командой. К примеру, внутренняя функция Clear-Host, очищает окно для
выводимых данных. Если в командной строке ввести команду cls или clear, Windows
PowerShell интерпретирует это как псевдоним для функции Clear-Host и выполняет
функцию Clear-Host.
Далее приводится краткий список общих команд Cmd.exe и ОС
UNIX, которые можно использовать в оболочке Windows PowerShell:
cat dir mount rm cd echo move rmdir
chdir erase popd sleep clear h ps sort cls history pushd tee copy
kill pwd type del lp r write diff ls ren
Для получения действительного имени собственной команды
Windows
PowerShell, можно для
этого использовать команду Get-Alias.
Оболочка Windows PowerShell предоставляет набор стандартных
псевдонимов, основанных на сокращѐнных именах для обычных глаголов и
существительных. Это позволяет сформировать базовый набор легко читаемых
псевдонимов для общих команд, если известны сокращѐнные имена. Например,
в стандартных псевдонимах глагол Get сокращается до g, глагол Set сокращается
до s, существительное Item сокращается до i, существительное Location
сокращается до l и существительное Command сокращается до cm.
Для создания псевдонима в рамках текущего сеанса можно
воспользоваться командой Set-Alias. К примеру, чтобы создать псевдоним cnt для
обращения к Get-
Content, нужно выполнить
команду
Set-Alias cnt Get-Content
После этого всякий раз, когда потребуется выполнить команду
Get-Content, можно будет использовать псевдоним cnt. Этим псевдонимом можно
будет пользоваться до завершения сеанса (т.е. до закрытия оболочки PowerShell).
Необходимо учитывать, что при определении псевдонима возможность включения
параметров не предусмотрена; можно использовать только имя команды.
Использование переменных и типов данных.
Оболочка Windows PowerShell позволяет создавать переменные,
или, другими словами, именованные объекты, — чтобы сохранять в них данные
вывода для последующего использования. Имя переменной всегда начинается со
знака $ и может содержать любые буквы и цифры, а также знак подчеркивания.
Чтобы создать переменную, нужно ввести допустимое имя
переменной. Создать переменную и присвоить ей какое-либо значение можно одним
действием. Windows PowerShell создает переменную, только если она еще не
существует, в противном случае указанное значение присваивается существующей
переменной.
Для сохранения текущего местоположения в
переменной $loc следует ввести: $loc = Get-Location
После ввода этой команды ее вывод не отображается, потому
что он отправляется в переменную $loc. Отображение вывода в оболочке Windows
PowerShell представляет собой побочный эффект отправки данных: если не указано
иное направление отправки, то данные всегда отправляются на экран.
Для отображения сведений о содержимом переменных можно
воспользоваться командлетом Get-Member. Передача переменной $loc по конвейеру
командлету Get-
Member показывает, что это объект класса
PathInfo, также как и вывод командлета Get-Location.
В некоторых случаях может потребоваться явно указать тип
данных для переменной. Для этого используется оператор квадратные скобки.
Следующий сценарий определит две переменные разных типов:
[int] $i = 1
[double] $d = 1
Типом данных для переменной PowerShell может выступать
любой тип .NET Framework.
Действия со строками.
Администраторы часто работают с данными в форме строк. В
PowerShell это простой процесс. Так, в следующем примере строка «cat»
назначается переменной $a, затем отображается результат, то есть cat:
$a = «cat»; $a
Поскольку строка назначается переменной $a, PowerShell
автоматически приводит $a к типу System.String. Можно использовать метод
GetType и его свойство FullName, чтобы определить тип данных переменной.
Например, команда a.GetType ().FullName возвращает результат System.String.
Чтобы объединить строки, используется оператор конкатенации (+). Например,
следующий программный код добавляет строку » & dog » (вместе с
пробелами) к переменной $a, а затем отображает результат, то есть cat &
dog: $a = $a + » & dog «; $a
В строку можно добавить числовое значение. При этом число
автоматически преобразуется в строку. Например, следующий программный код
добавляет 10 к переменной $a, а затем выводит на экран результат, cat & dog
10: $a = $a + 10; $a
Если проверить тип данных, то это будет String, то есть
произойдет неявное преобразование типа.
Действия с числами.
Работать с числовыми данными в PowerShell так же просто,
как со строковыми. Числовые значения назначаются как строковые, единственное
различие — числовые значения не заключаются в кавычки. Если указано числовое
значение, PowerShell автоматически присваивает значению один из четырех типов
данных:
1.
System.Int32, 32-разрядное целое (псевдоним [int]).
2.
System.Int64, 64-разрядное целое (псевдоним [long]).
3.
System.Double, 8-байтное вещественное число с плавающей
запятой
(псевдоним [double]).
4.
System.Decimal, 12-байтное вещественное число (псевдоним
[decimal]).
Decimal, в отличие от
Double, использует точную арифметику.
Следующие инструкции демонстрируют, как
PowerShell назначает типы данных числовым значениям:
$a = 1234; $a
$a.GetType().FullName
$a = 12345678910; $a
$a.GetType().FullName
$a = 1234.5678; $a
$a.GetType().FullName
$a = 1234.5678d; $a
$a.GetType().FullName
Однако, чтобы назначить тип Decimal, необходимо прямо
указать символ d после числа; в противном случае PowerShell обрабатывает
значение как тип Double. Для соединения числовых значений можно использовать
знак «плюс». При этом числовые значения складываются, а не сцепляются, как
строковые. Например, следующие инструкции назначают значение 1234 переменной
$a, а затем добавляют 1.5678 к $a:
$a = 1234; $a
$a.GetType ().FullName
$a = $a + 1.5678; $a
$a.GetType ().FullName
Если попытаться сложить строку, которая не является числом,
с числовым значением, будет выдано сообщение об ошибке.
Действия с массивами.
Массивы представляют собой коллекции типа System.Object [].
Символы [] после типа данных показывают, что это массив со многими значениями.
PowerShell автоматически назначает массивам тип Object []. К примеру, $a =
«a»,»b»,»c»; $a создаѐт массив с тремя
строковыми переменными, а затем возвращает результаты.
Для доступа к отдельным элементам массива используется
индекс. Индексы массивов начинаются с 0, поэтому для доступа к первому элементу
указывается имя массива, за которым следует индекс в скобках, например $a [0].
Эта инструкция возвращает результат a. Если нужно
обратиться к более чем одному значению, просто укажите соответствующее число
инструкций.
Например, инструкции $a
[1]; $a [2] возвращают результаты
b c
Добавить элемент в массив можно с помощью оператора «плюс».
Например, программный код $a = $a + «d»; $a добавляет d к массиву $a,
а затем отображает результаты:
Когда элемент d добавляется к массиву, PowerShell назначает
ему следующий по порядку индекс (3).
Действия с хеш-таблицами.
Хеш-таблицы (или ассоциативные массивы) — коллекции,
которые принимают тип данных System.Collections.Hashtable. Основное различие
между хеш-таблицами и массивами заключается в том, что для идентификации
элементов в хеш-таблицах используются именованные ключи вместо индексов.
Например, в следующем примере назначаются три ключа и их значения к хеш-таблице
$a, а затем отображается содержимое таблицы и тип данных:
$a = @{b=»bird»;
c=»cat»; d=»dog»}; $a
$a.GetType ().FullName
Как видно из первой строки, хеш-таблица строится с
использованием символа @, за которым следуют фигурные скобки, заключающие
коллекцию пар ключ/значение. Первая пара ключ/значение — b/bird.
Можно получить список ключей хеш-таблицы с использованием
свойства Keys, Например, инструкция $a.Keys | sort получает ключи хеш-таблицы
$a, а затем использует команду Sort-Object (накоторую указывает псевдоним sort)
для сортировки ключей в алфавитном порядке.
Аналогично можно использовать свойство Values для
извлечения значений хеш- таблицы, как показывает инструкция $a.Values | sort
можно также извлечь отдельное значение, ссылаясь на ключ, как в инструкции $a.b
либо $a[―b‖].
Чтобы добавить пару ключ/значение в хеш-таблицу, можно
сослаться на новый ключ как на существующий, а затем ввести значение нового
ключа, как в следующем примере: $a.e = «elephant»; $a
Чтобы изменить значение существующего ключа, можно
сослаться на ключ и ввести новое значение, например $a.d = «dingo»;
$a
В этом примере пара d/dog
заменяется на d/dingo.
Удалить пару ключ/значение можно с помощью метода Remove.
Например, удаление пары d/dingo:
$a.remove («d»);
$a
Приведение и преобразование типов данных.
PowerShell позволяет производить как приведения, так и
преобразования типов данных. Например, предположим, что значение «10»
обрабатывается как числовое значение, а не как строка. С помощью следующего
кода можно создать переменную, которая содержит значение типа Double, хотя
начальное значение — строка:
$a = [double]
«10»
$a.GetType().FullName
Заметим, что тип Double указывается перед
значением. Того же результата можно достичь с помощью кода:
[double] $b =
«10»
$a.GetType ().FullName
Однако между двумя подходами есть различие. В первом случае
значение просто заменяется на тип System.Double. При втором подходе выполняется
строгий контроль типа переменной, то есть этой переменной можно назначать
только значения того же типа данных. Проверить различие можно, попытавшись
назначить строковое значение переменным $a и $b.
$a = «ten»; $a
$b = «ten»
Можно также контролировать тип данных, назначаемый массиву.
Например, программный код
$c = [double[]]
(«1″,»2″,»3»)
$c.GetType().FullName
назначает тип System.Double [] массиву $c
вместо выбираемого по умолчанию типа System.Object []. Символы [] означают, что
это по-прежнему массив со многими значениями. Следующий фрагмент программного
кода приносит те же результаты:
[double[]] $d =
(«1″,»2″,»3») $d.GetType ().FullName
В отличие от скалярных значений, в массивах при обоих
подходах выполняется строгий контроль типов. Например, если попытаться изменить
одно из значений на строку с помощью инструкций
$c[2] = «ten»
$d[2] = «ten» ничего не получится.
Иногда требуется преобразовать тип данных существующей
переменной. Например, преобразовать переменную date-time в строковую переменную
можно с помощью программного кода
$e = Get-Date
$e.GetType().FullName
$e = [string] $e
$e.GetType().FullName
Создание объектов .NET.
Существуют программные компоненты с интерфейсами платформы
.NET Framework, которые позволяют выполнять множество задач системного администрирования.
Оболочка Windows PowerShell позволяет использовать эти компоненты, поэтому
задачи, которые могут быть выполнены, не ограничиваются только использованием
командлетов. Для того, чтобы создать объект .NET используется команда
New-Object. New-Object позволяет указать параметры, необходимые для создания
объекта. Библиотека классов платформы .NET Framework включает класс
System.Diagnostics.EventLog, который используется для управления журналами
событий. Можно создать новый экземпляр класса .NET с помощью командлета
New-Object с параметром TypeName. Например, следующая команда создает ссылку на
журнал событий:
New-Object -TypeName
System.Diagnostics.EventLog
Хотя команда и создала экземпляр класса EventLog, этот
экземпляр не содержит данных. Это происходит в связи с тем, что не был указан
определенный журнал событий.
Чтобы обратиться к определенному журналу событий, нужно
указать его имя. Командлет New-Object имеет параметр ArgumentList. Значения,
передаваемые в этом параметре, используются специальным методом запуска
объекта. Этот метод называет конструктором, поскольку используется для создания
объекта.
Например, чтобы получить ссылку на журнал приложений, нужно
указать строку «Application» в качестве аргумента:
New-Object -TypeName
System.Diagnostics.EventLog — ArgumentList Application
Использование статических классов и методов.
Не все классы .NET Framework можно создать с помощью
командлета NewObject. Классы являются библиотеками ссылок для методов и
свойств, не изменяющих свое состояние. Нет необходимости в их создании — их
можно просто использовать. Классы и методы, подобные этим, называются
статическими классами, поскольку они не создаются, не уничтожаются и не
изменяются.
Обычно при работе с объектом в оболочке Windows PowerShell
в первую очередь используется командлет Get-Member, чтобы просмотреть элементы
объекта. Для статических классов эта процесс выглядит несколько иначе,
поскольку класс не является объектом как таковым.
Обращение к статическому классу возможно при заключении имени
класса в квадратные скобки. Например, ссылка на System.Environment состоит из
имени класса внутри скобок. При использовании командлета New-Object оболочка
Windows PowerShell автоматически подразумевает наличие определения «System» в
имени. То же самое происходит при заключении имени в скобки, поэтому ссылку
[System.Environment]
записать просто как [Environment].
В классе System.Environment содержатся общие данные о
рабочей среде текущего процесса, то есть процесса powershell.exe, при работе в
оболочке Windows PowerShell.
Если для просмотра подробных сведений об этом классе
вводится команда [System.Environment] | Get-Member то будет сообщен тип объекта
System.RuntimeType, а не System.Environment.
Для просмотра статических элементов с помощью командлета
Get-Member необходимо указать параметр Static:
[Environment] | Get-Member
-Static -MemberType Property
Свойства класса System.Environment являются статическими,
как и сам класс, и способ их задания отличается от указания обычных свойств.
Знак «::» используется для указания в PowerShell, что работа ведется со
статическими методами или свойствами. К примеру, чтобы увидеть команду,
используемую для запуска
PowerShell, следует
использовать свойство CommandLine:
[Environment]::Commandline
Конвейерная обработка.
Одним из главных преимуществ использования объектов
является то, что оно значительно облегчает организацию конвейерного выполнения
команд, то есть передачу вывода одной команды другой команде в качестве ввода.
При реализации такого взаимодействия часто требуется преобразовать вывод в
другой формат и удалить названия и заголовки столбцов.
В оболочке Windows PowerShell реализована новая модель
взаимодействия, основанная на объектах, а не тексте. Командлет, который
принимает объект, может обращаться к его свойствам и методам без каких-либо
преобразований или других операций. Пользователи могут обращаться к свойствам и
методам объекта по их именам вместо того, чтобы определять расположение нужных
данных в выводе.
Каждая команда генерирует объект и передает его по
конвейеру. Принимающая команда использует полученный объект в качестве входных
данных и генерирует собственные выходные данные опять же в виде объекта.
Команды объединяются в конвейер с помощью оператора конвейера (|).
В PowerShell конвейер реализован иначе, нежели в других
оболочках, таких как командная оболочка Windows. В традиционных средах
результаты выполнения команды возвращаются в виде единого набора результатов, а
это значит, что перед тем как начнѐтся передача любых данных по конвейеру,
должен быть сформирован весь набор результатов. Первый результат возвращается в
то же время, что и последний. В среде PowerShell результаты передаются на
конвейер в виде потока. Как только та или иная команда возвращает результат,
она передает его на конвейер, и этот результат немедленно передается следующей
команде конвейера.
Обход элементов в конвейере.
Командлет ForEach-Object использует блоки сценариев и
дескриптор $_ для текущего объекта конвейера, чтобы та или иная команда была
выполнена для всех объектов конвейера. Эта возможность позволяет выполнить
некоторые сложные действия.
Одним из них является обработка данных с целью повышения их
применимости. Например, класс Win32_LogicalDisk из инструментария управления
Windows может использоваться для просмотра сведений о свободном месте на каждом
локальном диске.
Get-WmiObject -Class
Win32_LogicalDisk
Значение свойства FreeSpace можно преобразовать в
мегабайты, дважды разделив исходное значение на 1048576 (1024×1024). Для этого
в блоке сценария ForEach-Object нужно ввести:
Get-WmiObject -Class Win32_LogicalDisk
| ForEach-Object -Process
{($_.FreeSpace)/1048576}
Создание производных объектов.
Командлет Select-Object позволяет создавать новые объекты
Windows PowerShell, которые содержат избранные свойства существующих объектов,
используемых при создании новых. Чтобы создать новый объект, который содержит
только свойства Name и FreeSpace WMI-класса Win32_LogicalDisk, введите
следующее:
Get-WmiObject-Class Win32_LogicalDisk | Select-Object —
Property Name,FreeSpace
После выполнения этой команды нельзя увидеть тип данных; но
если результат передать по конвейеру командлету Get-Member после ключевого
слова Select-Object, то можно увидеть новый тип объекта PSCustomObject:
Get-WmiObject -Class Win32_LogicalDisk | Select-Object
-Property Name,FreeSpace | Get-Member
Командлет Select-Object имеет достаточно широкое
применение. Одним из примеров является репликация данных, которые затем можно
изменить. Значение свойства FreeSpace вновь созданных объектов можно обновить,
и выводимые данные будут содержать описательную метку:
Get-WmiObject
-Class Win32_LogicalDisk | Select-Object — Property
Name,FreeSpace |
ForEach-Object –Process
{$_.FreeSpace =
($_.FreeSpace)/1024.0/1024.0; $_}
Сортировка объектов.
С помощью командлета Sort-Object отображаемые данные можно
организовать таким образом, чтобы упростить их просмотр. Командлету Sort-Object
передаются имена свойств, по которым нужно произвести сортировку, и возвращает
данные отсортированными по значениям этих свойств.
Рассмотрим проблему перечисления экземпляров класса
Win32_SystemDriver. Чтобы отсортировать данные сначала по свойству State, а
затем по свойству Name, необходимо ввести следующую команду:
Get-WmiObject -Class
Win32_SystemDriver | Sort-Object -Property State,Name |
Format-Table –Property
Name,State,Started,DisplayName -AutoSize -Wrap
Объекты можно отсортировать в обратном порядке, для чего
требуется указать параметр Descending. Это изменяет порядок сортировки таким
образом, что имена сортируются в обратном алфавитном порядке, а числа — по
убыванию.
Get-WmiObject -Class
Win32_SystemDriver | Sort-Object — Property State,Name —
Descending | Format-Table –Property
Name,State,Started,DisplayName -AutoSize Wrap
Форматирование вывода.
Windows PowerShell содержит набор командлетов, позволяющих
пользователю контролировать, какие свойства должны отображаться для
определенных объектов. Имена всех этих командлетов начинаются глаголом Format.
Они позволяют выбрать для отображения одно или несколько свойств.
Format-командлетами
являются командлеты Format-Wide, Format-List, Format-
Table и Format-Custom. Мы рассмотрим
командлеты Format-Wide, Format-List и Format-Table.
Каждый командлет форматирования имеет свойства по
умолчанию, которые используются, если не задается отображение каких-либо
определенных свойств. Для задания — какие свойства необходимо отобразить,
каждый командлет использует также одно и то же имя параметра Property. Так как
командлет Format-Wide отображает только одно свойство, для его параметра
Property задается только одно значение, но в качестве значений параметров
свойств командлетов Format-List и Format-Table задается список имен свойств.
Формирование вывода с одним элементом.
По умолчанию командлет Format-Wide отображает только
свойство объекта по умолчанию. Данные, связанные с каждым объектом,
отображаются в одном столбце: Get-Process -Name powershell | Format-Wide
Можно также задать
свойство, отличное от свойства «по умолчанию»:
Get-Process -Name
powershell | Format-Wide Id
При помощи командлета Format-Wide в определенный момент
времени можно отобразить только одно свойство. Это может быть полезным при
отображении простых списков, в которых в каждой строке отображается только один
элемент.
Параметр Column указывает, на сколько колонок будет
разделяться вывод. Для получения простой распечатки можно установить значение
параметра Column равным
1.
Форматирование представления списка.
Командлет Format-List показывает объект в виде списка, в
котором каждое свойство снабжено меткой с названием и отображено в отдельной
строке: Get-Process -Name powershell | Format-List
Можно указать произвольное
число свойств:
Get-Process -Name powershell | Format-List –Property
ProcessName,Id или сокращенный вариант той же команды: Get-Process powershell |
fl ProcessName,Id
Командлет Format-List позволяет использовать подстановочные
знаки в качестве значения параметра Property. Это дает возможность отображать
подробные сведения. Зачастую объекты содержат больше информации, чем
необходимо. Поэтому Windows PowerShell по умолчанию выводит значения не всех
свойств. Чтобы вывести все свойства объекта, воспользуйтесь командой
Format-List -Property *. Следующая команда формирует более 60 строк вывода для
одного процесса:
Get-Process -Name
powershell | Format-List -Property *
Хотя команда Format-List и полезна для вывода подробных
сведений, если нужно получить сведения, содержащие много элементов, обычно
удобнее использовать упрощенное табличное представление.
Получение вывода в виде таблицы.
Если использовать командлет Format-Table без указания имен
свойств для форматирования вывода команды Get-Process, будет получен точно
такой же вывод, что и без использования форматирования. Причина состоит в том,
что процессы обычно показываются в виде таблицы, как и большинство объектов
Windows
PowerShell.
Get-Process -Name
powershell | Format-Table
Хотя табличное представление и полезно при выводе большого
количества сведений для сравнения, интерпретация данных может вызвать
затруднения, если экран слишком узок и не вмещает все данные. Например, если
показать путь процесса, идентификатор, имя и компанию, данные в столбцах пути
процесса и компании окажутся обрезанными:
Get-Process -Name powershell | Format-Table –Property
Path,Name,Id,Company
Если указать параметр AutoSize при выполнении команды
Format-Table, Windows PowerShell вычислит ширину столбцов на основании ширины
реально
отображаемых данных. Это улучшит внешний
вид столбца Path, но значение столбца с названием компании останется
обрезанным:
Get-Process -Name
powershell | Format-Table –Property Path,Name,Id,Company —
AutoSize
Командлет Format-Table может обрезать данные, но это
происходит только на правой границе экрана. Свойствам, за исключением
последнего отображаемого, выделяется столько места, сколько нужно для
корректного вывода самого длинного элемента данных. Название компании будет видно
полностью, но путь будет обрезан, если поменять местами элементы Path и Company
в списке значений Property. Команда Format-Table предполагает, что
свойство, расположенное ближе к началу списка свойств, является более важным. В
связи с этим предпринимается попытка отобразить полностью свойства, находящиеся
ближе всего к началу. Если команда Format-Table не может отобразить все
свойства, она удалит некоторые столбцы из вывода и выдаст предупреждение. Это
поведение можно увидеть, если поместить свойство Name в конец списка.
Можно принудительно перенести длинные данные вывода
командлета FormatTable на следующую строку в пределах столбца с помощью
параметра Wrap.
Использование параметра Wrap в отдельности
не всегда приводит к ожидаемому результату, поскольку используются установки по
умолчанию, если также не указан параметр AutoSize:
Get-Process -Name powershell | Format-Table -Wrap –Property
Name,Id,Company,
Path
Преимуществом использования параметра Wrap без других
параметров является то, что обработка при этом не замедляется существенным
образом. Использование параметра AutoSize во время выполнения рекурсивного
вывода списка файлов в большом каталоге может потребовать значительного объема
памяти и времени перед отображением первых элементов вывода.
Если загрузка системы не имеет решающего значения, параметр
AutoSize хорошо работает в сочетании с параметром Wrap. Начальным столбцам
всегда выделяется необходимый размер для вывода элементов в одной строке, как и
при указании параметра AutoSize без параметра Wrap. Единственное отличие
состоит в том, что последний столбец будет при необходимости перенесен на
следующую строку:
Get-Process -Name powershell | Format-Table -Wrap –AutoSize
-Property
Name,Id,Company,Path
Организация табличного вывода.
Другим полезным параметром управления табличным выводом
является параметр GroupBy. Длинные табличные выводы особенно тяжелы для
сравнения. Параметр GroupBy группирует выводимые данные в соответствии со
значениями свойств. Например, можно сгруппировать процессы по имени процесса
для упрощения проверки, исключая имя процесса из списка свойства:
Get-Process -Name powershell | Format-Table -Wrap –AutoSize
-Property Id,Path —
GroupBy Name
Перенаправление данных.
Windows PowerShell предоставляет несколько командлетов,
которые позволяют напрямую управлять выводом данных. Эти командлеты обладают
двумя общими важными характеристиками.
Во-первых, они обычно преобразуют данные в некоторое
текстовое представление. Преобразование выполняется, поскольку данные выводятся
в системные компоненты, ожидающие текстовый ввод. Это означает, что объекты
должны быть представлены в текстовом виде. Поэтому текст форматируется в виде,
пригодном для отображения в окне консоли PowerShell.
Во-вторых, эти команды используют глагол PowerShell Out,
поскольку отправляют сведения из PowerShell за пределы оболочки. Командлет
Out-Host не является исключением: окно главного приложения отображается вне
PowerShell. Это важно, поскольку при передаче из PowerShell данные в
действительности удаляются. Убедиться в этом можно, если попытаться создать
конвейер, который постранично передает данные в окно главного приложения и
пытается отформатировать их в виде списка, как показано ниже:
Get-Process | Out-Host
-Paging | Format-List
Командлет Out-Host передает данные напрямую консоли,
поэтому команда Format- List так и не получает ничего для форматирования. Чтобы
правильно структурировать эту команду, нужно поместить командлет Out-Host в
конец конвейера. При этом данные процесса форматируются в виде списка перед
разбиением на страницы и отображением.
Get-Process | Format-List
| Out-Host -Paging
Это относится ко всем командлетам Out. Командлет Out всегда
должен находиться в конце конвейера.
Все командлеты Out подготавливают вывод в виде текста,
используя текущее форматирование для окна консоли, включая ограничения на длину
строки. Для разбиения данных на страницы можно также использовать функцию more.
В Windows PowerShell функция more вызывает команду Out-Host -Paging.
Следующая команда демонстрирует использование функции more
для разбиения на страницы вывода командлета Get-Command:
Get-Command | more
Если в качестве параметров этой функции указать одно или
несколько имен файлов, функция прочитает указанные файлы и разобьет на страницы
их содержимое при передаче в главное приложение:
more \autoexec.bat
Отбрасывание ненужного вывода.
Командлет Out-Null разработан для немедленного отбрасывания
любых входных данных. Это полезно при отбрасывании ненужных данных, полученных
в качестве побочного эффекта выполнения команды. Если ввести следующую команду,
ее выполнение не приведет к выдаче какого-либо результата:
Get-Command | Out-Null
Командлет Out-Null не отбрасывает сообщения об ошибках.
Например, если ввести следующую команду, будет отображено сообщение о том, что
оболочка Windows PowerShell не распознала вызов «Is-NotACommand»: Get-Command
Is-NotACommand | Out-Null
Печать данных.
Данные можно распечатать при помощи командлета Out-Printer.
Командлет Out- Printer использует принтер по умолчанию, если не указано имя
принтера. Можно использовать любой принтер Windows, указав его отображаемое
имя. Отсутствует необходимость как в привязке порта принтера, так и в
присутствии реального физического принтера. Например, если имеются
установленные средства создания документов XPS, можно создать документ, введя
следующее:
Get-Command | Out-Printer
-Name «Microsoft XPS Document Writer»
Сохранение данных.
Можно направить вывод в файл вместо окна консоли с помощью
командлета Out-File. Следующая команда направляет список процессов в файл
C:\processlist.txt:
Get-Process | Out-File
-FilePath C:\processlist.txt
Результаты использования командлета Out-File не всегда
соответствуют ожидаемым, если пользователь привык к традиционному
перенаправлению вывода. Чтобы разобраться в его поведении, следует учесть
контекст, в котором выполняется командлет Out-File.
По умолчанию командлет Out-File создает файл в формате
Юникод. Это наилучшее долговременное решение, но средства, которые принимают на
входе файлы ASCII, не будут корректно работать с таким форматом вывода по
умолчанию.
Формат вывода по умолчанию можно изменить
на ASCII с помощью параметра Encoding:
Get-Process | Out-File
-FilePath C:\processlist.txt -Encoding ASCII
Командлет Out-file форматирует содержимое файла так, чтобы
оно выглядело аналогично выводу консоли. Это приводит к обрезанию вывода, как
это чаще всего и происходит в окне консоли. Предположим, например, что
выполняется следующая команда:
Get-Command | Out-File
-FilePath output.txt
Чтобы получить вывод, который не использует переносы для
обеспечения соответствия ширине экрана, можно воспользоваться параметром Width
для указания ширины строки. Поскольку параметр Width представляет собой
32-разрядное целое число, его максимальное значение может быть равно
2147483647.
Чтобы установить ширину строки в максимальное значение,
введите следующее: Get-Command | Out-File -FilePath c:\temp\output.txt –Width
2147483647
Командлет Out-File наиболее полезен, когда нужно сохранить
вывод в том же виде, в каком он отображается на консоли.
Краткий курс по PowerShell для начинающих в администрировании Windows. Что это за скриптовый язык, что такое командлет и как им пользоваться.
В этой статье про PowerShell для начинающих мы посмотрим, как писать скрипты, которые помогают оптимизировать управление Windows-окружением.
PowerShell — это объектно-ориентированный программный движок и скриптовый язык с интерфейсом командной строки, предоставляющий широкие возможности для конфигурирования операционных систем семейства MS Windows. Он предлагает как чисто консольный интерфейс, так и полноценную среду разработки PowerShell ISE (Integrated Scripting Environment, встроенное скриптовое окружение) для скриптов.
Для запуска интерфейса командной строки введите powershell
в меню «Выполнить» (WinKey + R). PowerShell ISE запускается с помощью команды «PowerShell ISE» в том же меню. ISE более предпочтительно, так как предоставляет более широкие возможности разработчику благодаря подсветке синтаксиса, функции автозаполнения кода и другим особенностям, присущим многим «большим» IDE.
На данный момент этот блок не поддерживается, но мы не забыли о нём!Наша команда уже занята его разработкой, он будет доступен в ближайшее время.
Написание и запуск скриптов
Скрипты сохраняются в виде файлов с расширением .ps1
. Несмотря на то, что PowerShell уже давно является нативной частью ОС Windows, вы не сможете запустить его скрипты простым двойным щелчком. Для этого надо кликнуть правой кнопкой по скрипту и выбрать «Запустить в PowerShell».
Также существуют системные политики, ограничивающие выполнение скриптов. Можно проверить текущие параметры политики, введя команду Get-ExecutionPolicy
. Результатом будет одно из следующих значений:
- Restricted — выполнение скриптов запрещено. Стандартная конфигурация;
- AllSigned — можно запускать скрипты, подписанные доверенным разработчиком; перед запуском скрипта PowerShell запросит у вас подтверждение;
- RemoteSigned — можно запускать собственные скрипты или те, что подписаны доверенным разработчиком;
- Unrestricted — можно запускать любые скрипты.
Для начала работы необходимо изменить настройку политики запуска на RemoteSigned, используя команду Set-ExecutionPolicy
:
На данный момент этот блок не поддерживается, но мы не забыли о нём!Наша команда уже занята его разработкой, он будет доступен в ближайшее время.
Командлеты
Командлеты — это команды с предопределённой функцией, подобные условным операторам в языках программирования. У них есть несколько ключевых особенностей:
- существуют системные, пользовательские и опциональные командлеты;
- результатом выполнения командлета будет объект или массив объектов;
- командлеты могут обрабатывать данные и передавать их другим командлетам с помощью конвейеров;
- командлеты нечувствительны к регистру, так что нет никакой разницы между
Get-ADUser
,get-aduser
иgEt-AdUsEr
; - в качестве разделителя используется символ
;
.
Каждый командлет содержит в себе глагол и существительное, разделяемые дефисом. Например:
- Get-Process — отобразить текущие процессы, запущенные на компьютере;
- Get-Service — отобразить список служб и их статус;
- Get-Content — отобразить содержимое указанного файла, например
Get-Content C:\Windows\System32\drivers\etc\hosts
.
При необходимости список всех доступных командлетов можно вывести с помощью Get-Help-Category. Запомните эту команду — она крайне важна для тех, кто изучает PowerShell с нуля, так как помогает быстрее начать ориентироваться в его возможностях.
На данный момент этот блок не поддерживается, но мы не забыли о нём!Наша команда уже занята его разработкой, он будет доступен в ближайшее время.
Также можно создавать свои командлеты, но эта тема выходит за рамки нашего руководства по PowerShell для начинающих.
Параметры
У каждого командлета есть несколько параметров, определяющих его работу. PowerShell ISE автоматически предлагает все доступные параметры с отображением их типа. Например, Get-Service-NameW*
выводит список служб, у которых имя начинается с W
. Если вы забыли, какие параметры у введённого командлета, воспользуйтесь Get-Member
.
Например, Get-Process | Get-Member
:
На данный момент этот блок не поддерживается, но мы не забыли о нём!Наша команда уже занята его разработкой, он будет доступен в ближайшее время.
Если вы не нашли того, что нужно, или не уверены в том, как правильно задаются параметры, можно даже запросить примеры с помощью параметра -Examples
. Встроенное руководство по PowerShell покажет, для чего используются разные параметры:
На данный момент этот блок не поддерживается, но мы не забыли о нём!Наша команда уже занята его разработкой, он будет доступен в ближайшее время.
Некоторые командлеты также могут вызываться с помощью алиасов. Например, вместо Get-Help
можно просто написать Help
— эта команда также вызовет встроенное руководство по PowerShell.
При написании больших скриптов или коллективной разработке можно пользоваться комментариями. Каждый комментарий начинается с символа #
, а блок комментариев ограничивается комбинациями символов <#
и #>
в начале и в конце соответственно.
Конвейер
PowerShell позволяет осуществлять обмен данными между командлетами с помощью конвейера. Например:
GetService | SortObject -property Status
— сортировка запущенных служб по статусу;“Hello World!” | Out-File C:\ps\test.txt
— запись текста в файл.
Можно использовать несколько конвейеров. Например, следующий скрипт выводит список имён всех служб за исключением остановленных:
Get-Service | WHERE {$_.status -eq “Running”} | SELECT displayname
Заключение
Это руководство для тех, кто изучает PowerShell с нуля, поэтому здесь раскрыты только базовые понятия и приёмы. После его прочтения у вас должно появиться представление о том, что собой представляет этот инструмент. Также мы рассмотрели варианты изменения политики выполнения скриптов, что такое командлет, как они обмениваются данными с помощью конвейера и как получить свойства нужного объекта. Помните, что в случае затруднений можно воспользоваться командлетом Get-Help – это одна из самых важных команд для начинающих изучать PowerShell.
Если пользуетесь не только Windows, но и Linux, посмотрите статью про команды терминала Linux для начинающих. В ней рассказывается про работу с процессами и файлами, навигацию, каналы, xargs, awk и grep.