Введение в Windows PowerShell™
Корпорация Майкрософт
Дата публикации: сентябрь 2006 г.
Аннотация
Windows PowerShell™ является новой оболочкой командной строки, работающей под управлением Windows и специально предназначенной для системных администраторов. Оболочка включает в себя интерактивную командную строку и среду исполнения сценариев, которые могут использоваться независимо или в сочетании друг с другом.
В этом документе описываются основные черты и особенности оболочки Windows PowerShell, предлагаются способы, которые могут быть использованы в системном администрировании. 

Содержание
Авторские права на руководство «Введение в Windows PowerShell™»	8
Введение	9
Целевая аудитория	9
Об оболочке Windows PowerShell	9
Понятность	9
Согласованность	10
Интерактивная среда и среда исполнения сценариев	10
Объектно-ориентированная среда	11
Несложный переход к исполнению сценариев	11
Установка и работа с оболочкой Windows PowerShell	11
Системные требования	11
Установка Windows PowerShell	12
Запуск Windows PowerShell	12
Основы Windows PowerShell	13
Основные сведения о важных концепциях Windows PowerShell	14
Объектно-ориентированные команды	14
Семейство команд может расширяться	14
Как Windows PowerShell обрабатывает входные данные и дисплей консоли	15
Windows PowerShell использует некоторые черты синтаксиса C#	16
Изучение имен команд оболочки Windows PowerShell	16
Сокращение количества обязательных для запоминания команд при помощи шаблона глагол-существительное	18
Командлеты используют стандартные параметры	19
Параметр справки (?)	20
Общие параметры	20
Рекомендуемые к использованию параметры	20
Сводные сведения о командах	21
Отображение имеющихся типов команд	22
Получение подробных справочных сведений	23
Использование имен знакомых команд	24
Интерпретация стандартных псевдонимов	25
Создание новых псевдонимов	26
Применение клавиши TAB для автоматического завершения имен	27
Конвейер объектов	28
Основные сведения о конвейере Windows PowerShell	29
Просмотр структуры объекта (командлет Get-Member)	31
Применение команд форматирования для изменения конечного представления данных	33
Применение командлета Format-Wide для формирования вывода с одним элементом	34
Настройка отображения командлета Format-Wide при помощи столбца	34
Использование командлета Format-List для получения представления списком	34
Получение подробных сведений при помощи подстановочных знаков в командлете Format-List	35
Использование командлета Format-Table для получения вывода в виде таблицы	35
Улучшение вывода командлета Format-Table (параметр AutoSize)	36
Перенос на следующую строку вывода командлета Format-Table в столбцах (параметр Wrap)	37
Организация табличного вывода (параметр -GroupBy)	38
Перенаправление данных с помощью командлетов Out-*	39
Разбиение вывода консоли на страницы (командлет Out-Host)	40
Отбрасывание ненужного вывода (командлет Out-Null)	41
Печать данных (командлет Out-Printer)	41
Сохранение данных (командлет Out-File)	42
Навигация в Windows PowerShell	43
Управление текущим местоположением в Windows Powershell	44
Определение текущего местоположения (командлет Get-Location)	44
Задание текущего местоположения (командлет Set-Location)	44
Сохранение и возврат на последние местоположения (командлеты Push-Location и Pop-Location)	46
Управление дисками Windows PowerShell	48
Добавление новых дисков Windows PowerShell (командлет New-PSDrive)	50
Удаление дисков Windows PowerShell (командлет Remove-PSDrive)	52
Добавление и удаление дисков извне Windows PowerShell	52
Работа с файлами, папками и разделами реестра	52
Перечисление файлов, папок и разделов реестра (командлет Get-ChildItem)	53
Вывод всех вложенных элементов (параметр -Recurse)	53
Фильтрация элементов по имени (параметр -Name)	54
Принудительный показ скрытых элементов (параметр -Force)	54
Поиск имен элементов с использование подстановочных знаков	54
Исключение элементов (параметр -Exclude)	55
Объединение параметров командлета Get-ChildItem	56
Непосредственная работа с элементами	57
Создание новых элементов (командлет New-Item)	57
Почему параметры реестра не являются значениями	58
Переименование существующих элементов (командлет Rename-Item)	59
Перемещение элементов (командлет Move-Item)	60
Копирование элементов (командлет Copy-Item)	60
Удаление элементов (командлет Remove-Item)	61
Выполнение действий над элементами (командлет Invoke-Item)	61
Работа с объектами	62
Получение объектов WMI (командлет Get-WmiObject)	63
Получение объектов WMI (командлет Get-WmiObject)	63
Вывод списка классов WMI	63
Вывод сведений о классе WMI	65
Вывод свойств, не имеющих значений по умолчанию, с помощью командлетов Format	66
Создание объектов .NET и COM (командлет New-Object)	67
Использование командлета New-Object для доступа к журналу событий	67
Использование конструкторов с командлетом New-Object	67
Сохранение объектов в переменных	68
Доступ к удаленному журналу событий с помощью командлета New-Object	69
Очистка журнала событий методами объектов	69
Создание СОМ-объектов с помощью командлета New-Object	70
Создание ярлыков на рабочий стол с помощью метода WScript.Shell	71
Запуск приложения Internet Explorer из Windows PowerShell	73
Получение предупреждений о вызываемых .NET объектах COM	75
Использование статических классов и методов	75
Получение сведений о среде с помощью класса System.Environment	76
Ссылки на статический класс System.Environment	76
Отображение статических свойств класса System.Environment	77
Вычислительные действия с помощью класса System.Math	78
Удаление объектов из конвейера (командлет Where-Object)	80
Выполнение простых проверок с командлетом Where-Object	80
Фильтрация данных, основанная на свойствах объектов	81
Повторение действия для нескольких объектов (командлет ForEach-Object)	83
Выделение частей объектов (командлет Select-Object)	85
Сортировка объектов	86
Использование переменных для хранения объектов	87
Создание переменной	87
Управление переменными	88
Использование переменных Cmd.exe	89
Использование оболочки Windows PowerShell для администрирования	89
Управление локальными процессами	90
Перечисление процессов (командлет Get-Process)	90
Остановка процессов (командлет Stop-Process)	92
Остановка всех других сеансов Windows PowerShell	93
Управление локальными службами	93
Перечисление служб	94
Остановка, запуск, приостановка и перезагрузка служб	94
Получение сведений о компьютерах	96
Вывод настроек рабочего стола	96
Вывод сведений о BIOS	97
Вывод сведений о процессоре	97
Вывод производителя и модели компьютера	97
Вывод установленных исправлений	98
Вывод сведений о версии операционной среды	99
Вывод локальных пользователей и владельца	99
Получение сведений о доступном месте на диске	100
Получение сведений о сеансах подключения	100
Получение сведений о пользователе, подключенном к компьютеру	100
Получение сведений о местном времени компьютера	101
Отображение состояния службы	101
Установка программного обеспечения	102
Получение списка приложений, установленных при помощи Windows Installer	102
Получение списка приложений, поддерживающих удаление	104
Установка приложений	106
Удаление приложений	106
Обновление приложений, установленных при помощи Windows Installer	107
Изменение состояния компьютера: блокировка, завершение сеанса, завершение работы и перезагрузка	107
Блокировка компьютера	107
Завершение текущего сеанса	108
Завершение работы и перезагрузка компьютера	108
Работа с принтерами	109
Получение списка подключений к принтерам	109
Добавление сетевого принтера	109
Установка принтера по умолчанию	109
Удаление подключения к принтеру	110
Выполнение сетевых задач	110
Получение списка IP-адресов компьютера	110
Вывод данных IP-конфигурации	111
Проверка связи с компьютерами	112
Извлечение свойств сетевого адаптера	113
Назначение домена DMS сетевому адаптеру	113
Выполнение задач настройки DHCP	114
Определение адаптеров, поддерживающих DHCP	114
Извлечение свойств DHCP	114
Включение поддержки DHCP на каждом адаптере	114
Отмена и обновление аренды адреса DHCP для отдельных адаптеров	115
Отмена и обновление аренды адреса DHCP для всех адаптеров	115
Создание общего сетевого ресурса	116
Удаление общего сетевого ресурса	116
Подключение сетевого диска, доступного в Windows	117
Работа с файлами и папками	117
Получение списка файлов и папок, содержащихся в папке	117
Копирование файлов и папок	118
Создание файлов и папок	119
Удаление всех файлов и папок, содержащихся в папке	119
Отображение локальной папки в виде диска, доступного в Windows	120
Чтение текстового файла в массив	120
Работа с разделами реестра	121
Получение всех подразделов раздела реестра	121
Копирование разделов	122
Создание разделов	123
Удаление разделов	123
Удаление всех подразделов определенного раздела реестра	123
Работа с записями реестра	124
Получение списка записей реестра	124
Извлечение отдельной записи реестра	126
Создание новых записей в реестре	127
Переименование записей в реестре	128
Удаление записей в реестре	128
Приложение 1. Псевдонимы, обеспечивающие совместимость	129
Приложение 2. Создание пользовательского ярлыка для PowerShell	130

Авторские права на руководство «Введение в Windows PowerShell™»
Этот документ предоставлен только в информационных целях, и корпорация Майкрософт не дает в нем никаких гарантий, явных или подразумеваемых. Сведения в этом документе, включая URL-адреса и другие ссылки на веб-узлы в Интернете, могут быть изменены без предупреждения. Все риски, связанные с использованием или результатами использования этого документа, несет пользователь. Если не указано иное, встречающиеся в этом документе названия компаний, организаций и продуктов, имена доменов, адреса электронной почты, эмблемы, имена людей, названия населенных пунктов и события являются вымышленными. Любая связь с реальными названиями компаний, организаций и продуктов, именами доменов, адресами электронной почты, эмблемами, именами людей, названиями населенных пунктов и событиями случайна. Ответственность за соблюдение всех применимых законов об авторском праве лежит на пользователе. Без ущерба для прав по законам об авторских правах, никакая часть этого документа не может быть воспроизведена, сохранена, включена в информационно-поисковую систему или передана в какой-либо форме любыми средствами (электронными, механическими, фотокопировальными, записывающими или прочими) в любых целях без специального письменного разрешения корпорации Майкрософт.
Предмет этого руководства может быть защищен патентами, патентными заявками, товарными знаками, авторским правом или иными правами корпорации Майкрософт на интеллектуальную собственность. За исключением случаев, явно указанных в каком-либо письменном лицензионном соглашении с корпорацией Майкрософт, этот документ тот документ не дает вам никаких прав на патенты и товарные знаки, а также авторских прав и других прав интеллектуальной собственности.
© Корпорация Майкрософт (Microsoft Corp.), 2006. Все права защищены.
Microsoft, MS-DOS, Windows, Windows NT, Windows 2000, Windows XP и Windows Server 2003 являются охраняемыми товарными знаками корпорации Майкрософт в США и других странах.
Упоминаемые в этом документе имена действительных компаний и продуктов могут быть торговыми марками соответствующих владельцев.
Введение
Windows PowerShell является оболочкой командной строки и средой исполнения сценариев, предоставляя мощь .NET Framework пользователям командной строки и создателям сценариев. Она вводит некоторое количество новых мощных концепций, позволяющих расширять полученные знания и созданные сценарии в рамках командной строки и среды сервера сценариев Windows.
Целевая аудитория
«Введение в Windows PowerShell» предназначено для профессионалов в области информационных технологий, программистов и опытных пользователей, не имеющих предварительной подготовки для работы с оболочкой Windows PowerShell. Хотя опыт в создании сценариев и WMI может быть полезным, его наличие не предполагается и не требуется для понимания данного документа.
Об оболочке Windows PowerShell
Оболочка PowerShell предназначена для улучшения работы с командной строкой и средой исполнения сценариев, устраняя давние проблемы и добавляя новые функции.
Понятность
Оболочка Windows Powershell обладает несложными в понимании функциями. Например, для нахождения списка командлетов, служащих для просмотра и изменения служб Windows, введите:
get-command *-service	

После понимания того, какой командлет выполняет задачу, можно узнать больше об этом командлете при помощи командлета Get-Help. Например, для отображения справки о командлете Get-Service, введите:
get-help get-service	

Для полного понимания вывода этого командлета направьте конвейером его вывод в командлет Get-Member. Например, при выполнении следующей команды отображаются сведения об элементах выходных объектов командлета Get-Service.
get-service | get-member	

Согласованность
Управление системами может быть сложной задачей, и средства, имеющие согласованный интерфейс, помогают контролировать присущую такому управлению сложность. К сожалению, ни средства командной строки, ни объекты COM, для которых могут быть написаны сценарии, не обладают такой согласованностью.
Согласованность оболочки Windows PowerShell является одним из основных ее преимуществ. Например, при изучении способов использования командлета Sort-Object эти знания могут быть применены для сортировки вывода какого-либо командлета. Нет необходимости изучать различные процедуры сортировки для каждого командлета. 
Кроме того, разработчики командлетов не должны писать функции сортировки для соответствующих командлетов. Windows PowerShell дает им основу, предоставляющую базовые функции и вынуждающую их быть согласованными в отношении многих аспектов интерфейса. Эта основа ограничивает свободу, которая обычно предоставляется разработчику, но, в свою очередь, значительно облегчает ему создание надежных и удобных в использовании командлетов.
Интерактивная среда и среда исполнения сценариев
Windows PowerShell является средой, в которой сочетаются интерактивные возможности и возможности исполнения сценариев, благодаря чему обеспечивается доступ к средствам командной строки и к объектам COM. Кроме того, эта среда позволяет использовать мощь библиотеки классов .Net Framework (FCL).
Эта среда улучшает работу с командной строкой Windows благодаря предоставлению интерактивной среды с несколькими средствами командной строки. Оболочка также улучшает возможности исполнения сценариев сервера сценариев (WSH), что позволяет использовать большое число средств командной строки и объектов автоматизации COM, но не предоставляет интерактивной среды.
Сочетанием доступа ко всем этим возможностям оболочки Windows PowerShell расширяет возможности интерактивного пользователя и создателя сценариев, улучшает управляемость администрирования системы.
Объектно-ориентированная среда
Хотя взаимодействие с оболочкой Windows PowerShell осуществляется при помощи ввода команд в виде текста, оболочка Windows PowerShell основана не на тексте, а на объектах. Выходным элементом команды является объект. Объект выхода можно послать в другую команду в качестве ее входа. В результате оболочка Windows PowerShell предоставляет людям, имеющим опыт работы с другими оболочками, знакомый интерфейс, вводя в то же самое время новую, мощную парадигму командной строки. Windows PowerShell расширяет концепцию пересылки данных между командами, позволяя пересылать объекты, а не просто текст.
Несложный переход к исполнению сценариев
Оболочка Windows PowerShell облегчает переход от интерактивного ввода команд к созданию и исполнению сценариев. Можно вводить команды в командную строку Windows PowerShell для выявления команд, выполняющих ту или иную задачу. Затем эти команды можно сохранить в записи или в журнале перед копированием их в файл для использования в качестве сценария.
Установка и работа с оболочкой Windows PowerShell
Системные требования
Перед установкой оболочки Windows PowerShell необходимо удостовериться, что в системе присутствуют программы, необходимые для Windows PowerShell. Для оболочки Windows PowerShell необходимы следующие программы:
·	Windows XP с пакетом обновления 2, Windows 2003 с пакетом обновления 1 или более поздние версии Windows;
·	Microsoft .NET Framework 2.0.
Если на компьютере уже установлена какая-либо версия Windows PowerShell, то перед установкой новой версии удалите старую версию при помощи элемента Добавление и удаление программ на панели управления. 
Установка Windows PowerShell
Чтобы установить оболочку Windows PowerShell, выполните следующее:
1.	загрузите файл установки Windows PowerShell (Имя этого файла различается в зависимости от платформы, операционной системы и языкового пакета);
2.	для запуска установки нажмите кнопку «Открыть»;
3.	следуйте инструкциям мастера установки.

Файлы Windows PowerShell можно также сохранить на сетевом ресурсе для установки на несколько компьютеров.
Чтобы выполнить автоматическую установку, введите:
<PowerShell-exe-file-name> /quiet	

Например:
PowerShellSetup_x86_fre.exe /quiet

В 32-разрядных версиях Windows оболочка Windows PowerShell устанавливается по умолчанию в каталог %SystemRoot%\System32\WindowsPowerShell\v1.0. В 64-разрядных версиях Windows 32-разрядная версия Windows PowerShell устанавливается в каталог %SystemRoot%\SystemWow64\WindowsPowerShell\v1.0, а 64-разрядная версия Windows PowerShell устанавливается в каталог %SystemRoot%\System32\WindowsPowerShell\v1.0.
Запуск Windows PowerShell
Для запуска оболочки Windows PowerShell из меню «Пуск» нажмите кнопку Пуск, щелкните элемент Все программы, выберите Windows PowerShell 1.0, а затем щелкните значок Windows PowerShell.
Для запуска оболочки Windows PowerShell из окна «Выполнить» нажмите кнопку Пуск, нажмите Выполнить, введите powershell и нажмите кнопку ОК.
Для запуска Windows PowerShell из окна командной строки (cmd.exe) в командной строке введите powershell. Так как оболочка Windows PowerShell выполняется в сеансе консоли, можно использовать технику выполнения оболочки в сеансе удаленного telnet или SSH. Для возврата в сеанс командной строки нажмите exit.
Основы Windows PowerShell
В графических интерфейсах используются хорошо известные большинству компьютерных пользователей базовые концепции. При выполнении своих задач пользователи обращаются с уже знакомыми интерфейсами. Операционные системы дают пользователям графическое представление элементов, обзор которых обычно выполняется при помощи раскрывающихся меню для доступа к специальным функциями, а также при помощи контекстных меню для доступа к зависящим от контекста функциям.
В интерфейсе командной строки (CLI), например в Windows PowerShell, для получения информации используется другой подход, так как он не предоставляет в помощь пользователя меню или графических систем. Перед использованием команд необходимо знать их имена. Хотя можно вводить сложные команды, эквивалентные функциям в среде интерфейса GUI, необходимо ознакомиться с наиболее употребительными командами и параметрами команд.
Большинство CLI не содержит структур, которые могли бы помочь пользователю освоить интерфейс. Так как CLI были первыми оболочками операционных систем, многие имена команд и параметров выбирались произвольно. Лаконичные имена команд обычно использовались для большей ясности. Хотя в большинство CLI встроены справочные системы и стандарты построения команд, эти интерфейсы обычно разрабатывались с учетом совместимости с более ранними командами, так что набор команд до сих пор оформлен по решениям, сделанным десятилетия тому назад.
Оболочка Windows PowerShell сконструирована таким образом, чтобы пользователь мог воспользоваться знаниями, полученными при работе с более ранними интерфейсами командной строки. В этой главе будут рассмотрены некоторые базовые средства и концепции, которые можно использовать для быстрого изучения оболочки Windows PowerShell. Эти средства и концепции включают в себя:
·	использование команды Get;
·	использование Cmd.exe и команд ОС UNIX;
·	использование внешних команд;
·	использование функции автозавершения при помощи клавиши TAB;
·	использование команды Get-Help.
Основные сведения о важных концепциях Windows PowerShell
Конструкция оболочки Windows PowerShell объединяет в себе концепции многих различных сред. Многие из них знакомы людям, имеющим опыт работы со специальными оболочками или работы в средах программирования, но очень немногие люди имеют полное представление об этих оболочках. Рассмотрение некоторых из этих концепций дает возможность сделать полезный обзор оболочки.
Объектно-ориентированные команды
В отличие от традиционных команд с интерфейсом командной строки, командлеты оболочки Windows PowerShell предназначены для работы с объектами, представляющими собой стуктуризованную информацию, являюшуюся более чем строкой символов на экране. Вывод команды всегда содержит дополнительную информацию, которую при необходимости можно использовать. В этом документе мы будем более подробно обсуждать эту тему.
Если ранее использовались средства обработки текста для обработки данных командной строки, то при их использовании в оболочке Windows PowerShell вы обнаружите, что их функционирование выглядит несколько иначе. В большинстве случаев для извлечения специальной информации нет необходимости в применении средств обработки текстовых данных. Получить доступ к данным можно непосредственно с помощью обычных команд обработки объектов оболочки Windows PowerShell.
Семейство команд может расширяться
Такие интерфейсы, как Cmd.exe, не предоставляют способа непосредственного расширения встроенного набора команд. Можно создать внешние средства командной строки, выполняющие Cmd.exe, но эти внешние средства не имеют служб, таких как интеграция справки, и Cmd.exe не может автоматически знать, что это допустимые команды.
Внутренние двоичные команды Windows PowerShell, называемые командлетами, могут дополняться командлетами, создаваемыми пользователем и добавляемыми им в оболочку Windows PowerShell при помощи оснасток. Оснастки оболочки Windows PowerShell компилируются так же, как и двоичные средства любого другого интерфейса. Их можно использовать для добавления в оболочку поставщиков Windows PowerShell, так же, как и новых командлетов.
Из-за специальной природы внутренних команд Windows PowerShell мы будем называть их командлетами.
Примечание 
Оболочка Windows PowerShell может выполнять и другие команды, отличные от командлетов. Здесь, в Введении в Windows PowerShell, мы не будем их подробно рассматривать, но полезно знать о них как о категориях команд разного типа. Оболочка Windows PowerShell поддерживает сценарии, аналогичные сценариям оболочки UNIX и пакетным файлам Cmd.exe, но имеющие в имени файла расширение PS1. Windows PowerShell позволяет также создавать внутренние функции, которые могут использоваться непосредственно в интерфейсе или в сценариях.
Как Windows PowerShell обрабатывает входные данные и дисплей консоли
При вводе команды оболочка Windows PowerShell всегда непосредственно обрабатывает вход командной строки. Кроме того, оболочка Windows PowerShell форматирует данные, отображаемые на экране. Это важно, так как это снижает объем работы, производимой каждым командлетом, и гарантирует то, что процесс выполняется одинаковым образом, независимо от того, какие командлеты используются. На примере справки командной строки можно продемонстрировать, насколько облегчается работа разработчиков средств, а также пользователей.
Традиционные средства командной строки содержат свои собственные схемы для запроса и отображения справки. Некоторые средства командной строки для отображения справки используют «/?», другие используют «-?», «/H» или даже «//». Некоторые отображают справку в окне интерфейса GUI, а не на дисплее консоли. Некоторые сложные средства, такие как средства обновления приложений, распаковывают внутренние файлы перед отображением их справки. При использовании пользователем неверного параметра средство может пропустить то, что введено пользователем, и начать выполнять задачу автоматически.
При вводе команды в оболочке Windows PowerShell производится автоматический разбор и предварительная обработка всех вводимых данных. Если с командлетом Windows PowerShell используется параметр «-?», это всегда означает: «покажи мне справку для этой команды». Разработчики командлетов не должны производить разбор команд; все, что от них требуется — это предоставить текст справки.
Важно понять, что функции справки Windows PowerShell доступны даже тогда, когда в оболочке Windows PowerShell выполняются традиционные средства командной строки. Оболочка Windows PowerShell обрабатывает параметры и передает результаты во внешние приложения.
Примечание 
При выполнении в Windows PowerShell графического приложения для него открывается окно. Оболочка Windows PowerShell вмешивается в работу приложения только тогда, когда необходима обработка данных командной строки, вводимых пользователем, или вывода приложения, отображаемого в окне консоли. На внутреннюю работу приложения оболочка Windows PowerShell не оказывает никакого влияния.
Windows PowerShell использует некоторые черты синтаксиса C#
Оболочка Windows PowerShell имеет синтаксические особенности и ключевые слова, сходные с теми, которые применяются в языке программирования C#, так как оболочка Windows PowerShell основана на .NET Framework. Зная Windows PowerShell, гораздо легче изучить C#, если необходимо научиться программировать на этом языке. 
Для пользователей, не занимающихся прогораммированием на C#, такое сходство не так важно. С другой стороны, зная C#, это сходство может значительно облегчить изучение Windows PowerShell.
Изучение имен команд оболочки Windows PowerShell
В большинстве интерфейсов командной строки должно уделяться значительное время изучению имен команд и их параметров. Проблема заключается в том, что существует очень мало шаблонов имени, поэтому единственным способом изучить команды является запоминание каждой команды и каждого параметра, которые необходимо регулярно использовать.
При работе с новой командой или параметром обычно нельзя использовать то, что вы уже знаете; необходимо найти и запомнить новое имя. Если рассмотреть, как интерфейсы расширяются из небольшого набора средств при постепенном добавлении функциональных возможностей, легко понять, почему их структура нестандартна. В особенности, что касается имен команд, это может выглядеть логичным, так как каждая команда является отдельным средством, но при работе с именами команд есть способ лучше.
Большинство команд построено для управления элементами операционной системы или приложений, таких как службы или процессы. Команды имеют разнообразные имена, которые могут соответствовать или не соответствовать семейству. Например, в системах Windows можно использовать команды net start и net stop для запуска или остановки службы. Есть другое, более обобщенное средство управления службами для Windows, имеющее совершенно другое имя, sc, которое не соответствует шаблону именования для команд службы net. Для управления процессами в Windows есть команда tasklist для предоставления списка процессов и команда taskkill для уничтожения процессов.
Команды, для которых нужны параметры, имеют нерегулярные спецификации параметров. Нельзя использовать команду net start для запуска службы на удаленном компьютере. Команда sc запускает службу на удаленном компьютере, но для задания удаленного компьютера перед его именем должны ставиться две косые черты. Например, для запуска службы спулера на удаленном компьютере с именем DC01 необходимо ввести sc \\DC01 start spooler. Для формирования списка задач, выполняющихся на DC01, необходимо использовать параметр /S («system» — система) и задать имя DC01 без косых черт, например tasklist /S DC01.
Хотя между службой и процессом имеются важные технические различия, — это два примера управляемых элементов на компьютере, имеющем хорошо определенный жизненный цикл. Может быть необходимым запустить или остановить службу или процесс, либо получить список всех выполняющихся в настоящее время служб или процессов. Другими словами, хотя служба и процесс — это разные вещи, действия, которые производятся над службой или процессом, концептуально часто являются одинаковыми. Более того, выбор, который мы можем сделать для настройки действия заданием параметров, концептуально также может быть таким же.
Windows PowerShell использует это сходство для уменьшения количества различающихся имен, которые необходимо знать для понимания и использования командлетов.
Сокращение количества обязательных для запоминания команд при помощи шаблона глагол-существительное
Windows PowerShell использует систему именования «глагол-существительное», где имя каждого командлета состоит из обычного глагола, после которого через дефис идет специальное существительное. Глаголы Windows PowerShell не всегда являются глаголами английского языка, но они выражают определенное действие в оболочке Windows PowerShell. Существительные во многом сходны с существительными любого языка, они описывают объекты определенных типов, важные в администрировании системы. Несложно продемонстрировать, как эти состоящие из двух частей имена уменьшают необходимые для изучения усилия. Рассмотрим для этого несколько примеров глаголов и существительных.
Глаголы менее ограничены, но они должны всегда описывать, на что действует команда. В оболочке Windows PowerShell имеются такие команды, как Get-Process, Stop-Process, Get-Service и Stop-Service.
В случае двух существительных и двух глаголов согласованность не слишком упрощает изучение. Однако если взглянуть на обычный набор из десяти глаголов и десяти существительных, то нужно изучить только 20 слов, но при помощи их можно образовать 100 различных имен команд. 
Часто по имени команды можно понять, что она выполняет, и обычно бывает очевидным, какое имя должно использоваться для новой команды. Например, команда завершения работы компьютера может выглядеть как Stop-Computer. Команда, формирующая список всех компьютеров в сети, может выглядеть как Get-Computer. Командой получения даты системы является команда Get-Date.
Можно перечислить все команды, включающие определенный глагол, задав параметр -Verb для команды Get-Command (мы будем подробно рассматривать команду Get-Command в следующем разделе). Например, для вывода списка всех командлетов, в которых используется глагол Get, введите:
PS> Get-Command -Verb Get
CommandType     Name                            Definition
-----------     ----                            ----------
Cmdlet          Get-Acl                         Get-Acl [[-Path] <String[]>]...
Cmdlet          Get-Alias                       Get-Alias [[-Name] <String[]...
Cmdlet          Get-AuthenticodeSignature       Get-AuthenticodeSignature [-...
Cmdlet          Get-ChildItem                   Get-ChildItem [[-Path] <Stri...
...	

Параметр -Noun еще более полезен, так как он позволяет видеть семейство команд, влияющих на объекты одного типа: Например, если необходимо видеть, какие команды имеются для управления службами, введите следующую команду:
PS> Get-Command -Noun Service
CommandType     Name                            Definition
-----------     ----                            ----------
Cmdlet          Get-Service                     Get-Service [[-Name] <String...
Cmdlet          New-Service                     New-Service [-Name] <String>...
Cmdlet          Restart-Service                 Restart-Service [-Name] <Str...
Cmdlet          Resume-Service                  Resume-Service [-Name] <Stri...
Cmdlet          Set-Service                     Set-Service [-Name] <String>...
Cmdlet          Start-Service                   Start-Service [-Name] <Strin...
Cmdlet          Stop-Service                    Stop-Service [-Name] <String...
Cmdlet          Suspend-Service                 Suspend-Service [-Name] <Str... 
...	

Команда — это не обязательно командлет только из-за того, что он имеет схему именования глагол-существительное. Примером собственной команды Windows PowerShell, не являющейся командлетом, но имеющей имя типа глагол-существительное, является команда очистки окна консоли Clear-Host. Команда Clear-Host в действительности является внутренней функцией, в чем можно убедиться при выполнении на ней команды Get-Command:
PS> Get-Command -Name Clear-Host

CommandType     Name                            Definition
-----------     ----                            ----------
Function        Clear-Host                      $spaceType = [System.Managem...	

Командлеты используют стандартные параметры
Как уже отмечалось ранее, команды, используемые в традиционных интерфейсах командной строки, обычно не используют согласованные имена параметров. Иногда параметры вообще не имеют имен. Если же они имеют имя, это имя часто состоит из одного знака или аббревиатуры, которую можно быстро ввести, но которая трудно осмысливается новыми пользователями. 
В отличие от большинства других традиционных интерфейсов командной строки, оболочка Windows PowerShell обрабатывает параметры непосредственно, и использует этот непосредственный доступ к параметрам наряду с рекомендацией разработчику стандартизировать имена параметров. Хотя это не гарантирует того, что каждый командлет будет всегда соответствовать стандартам, такая рекомендация способствует стандартизации.
Примечание
При использовании параметров перед их именами всегда стоит «-», что позволяет оболочке Windows PowerShell легко идентифицировать их как параметры. В примере Get-Command -Name Clear-Host именем параметра является Name, но оно вводится как -Name.
Далее приводятся некоторые из общих характеристик обычных имен параметров и использования этих параметров.
Параметр справки (?)
При указании параметра -? в каком-либо командлете командлет не исполняется. Вместо этого Windows PowerShell отображает справку для командлета.
Общие параметры
Оболочка Windows PowerShell содержит несколько параметров, называемых общими параметрами. Так как эти параметры контролируются механизмом Windows PowerShell, при каждом их использовании командлетом их поведение будет всегда одинаковым. Общими параметрами являются параметры WhatIf, Confirm, Verbose, Debug, Warn, ErrorAction, ErrorVariable, OutVariable и OutBuffer.
Рекомендуемые к использованию параметры
Командлеты ядра Windows PowerShell используют стандартные имена для одинаковых параметров. Хотя использование имен параметров не является принудительным, имеется явная рекомендация по использованию имен для обеспечения стандартизации.
Например, рекомендуется именовать параметры, обращающиеся к компьютеру по имени как ComputerName, а не как Server (сервер), Host (узел), System (система), Nod (узел) или другие общие альтернативные слова. Важными рекомендуемыми именами параметров являются Force, Exclude, Include, PassThru, Path и CaseSensitive.
Сводные сведения о командах
Командлет Windows PowerShell Get-Command извлекает имена всех имеющихся команд. При вводе команды Get-Command в командную строку Windows PowerShell отображаются данные, подобные следующим:
PS> Get-Command
CommandType     Name                            Definition
-----------     ----                            ----------
Cmdlet          Add-Content                     Add-Content [-Path] <String[...
Cmdlet          Add-History                     Add-History [[-InputObject] ...
Cmdlet          Add-Member                      Add-Member [-MemberType] <PS...
... 	

Этот вывод выглядит очень похоже на вывод справки интерфейса Cmd.exe: сводка внутренних команд в табличной форме. В показанном выше фрагменте для вывода команды Get-Command каждая команда имеет значение параметра CommandType, равное Cmdlet (командлет). Командлет является типом внутренней команды оболочки Windows PowerShell, грубо соответствующим командам dir и cd интерфейса Cmd.exe и командам, встраиваемым в оболочки ОС UNIX, например BASH.
В выводе команды Get-Command все определения заканчиваются троеточием (...), указывающим на то, что PowerShell не может отобразить все содержание в доступном пространстве. Когда оболочка Windows PowerShell отображает конечные данные, она форматирует вывод как текст и затем выстраивает его таким образом, чтобы данные точно умещались в окне консоли. Это будет рассмотрено позднее в разделе, посвященном механизмам форматирования.
Командлет Get-Command имеет параметр Syntax, позволяющий извлекать только синтаксис каждого командлета. Для отображения полного вывода введите команду Get-Command -Syntax:
PS> Get-Command -Syntax
Add-Content [-Path] <String[]> [-Value] <Object[]> [-PassThru] [-Filter <String>] [-Include <String[]>] [-Exclude <String[]>] [-Force] [Credential <PSCredential>] [-Verbose] [-Debug] [-ErrorAction <ActionPreference>] [-ErrorVariable <String>] [-OutVariable <String>] [-OutBuffer <Int32>] [-WhatIf] [-Confirm] [-Encoding <FileSystemCmdletProviderEncoding>]

Add-History [[-InputObject] <PSObject[]>] [-Passthru] [-Verbose] [-Debug] [-ErrorAction <ActionPreference>] [-ErrorVariable <String>] [-OutVariable <String>][-OutBuffer <Int32>]...	

Отображение имеющихся типов команд
Команда Get-Command не формирует список всех команд, имеющихся в оболочке Windows PowerShell. Вместо этого команда Get-Command формирует список только командлетов в сеансе Windows PowerShell. Windows PowerShell в действительности поддерживает несколько других типов команд. Псевдонимы, функции и сценарии являются также командами Windows PowerShell, хотя они и не рассматриваются подробно во введении в Windows PowerShell. Внешние файлы, являющиеся исполняемыми модулями или имеющие зарегистрированного обработчика типа файла, также классифицируются как команды.
Можно получить распечатку всех элементов, которые могут быть вызваны, вводом следующей команды:
PS> Get-Command *	

Так как этот список включает в себя внешние файлы на пути поиска, он может содержать тысячи элементов. Имеет больший смысл сокращенный набор команд. Для нахождения собственных команд других типов можно использовать параметр CommandType командлета Get-Command. Хотя еще ничего и не было сказано об этих командах другого типа, их можно отобразить, если знать имя CommandType для класса команд.
Примечание
Хотя мы это еще и не обсуждали, звездочка (*) используется в аргументах команды Windows PowerShell для сравнения на совпадение с учетом подстановочных знаков. * означает «совпадение одного или нескольких любых знаков». Для поиска команд, начинающихся с буквы «a», можно ввести Get-Command a*. В отличие от сравнения на совпадение с учетом подстановочных знаков в Cmd.exe, подстановочный знак оболочки Windows PowerShell учитывает также и точку.
Для отображения псевдонимов категории специальных команд (имеются имена, альтернативные стандартным именам команд), введите следующую команду:
PS> Get-Command -CommandType Alias	

Для отображения всех функций Windows PowerShell введите следующую команду:
PS> Get-Command -CommandType Function	

Для отображения внешних сценариев на пути поиска Windows PowerShell введите следующую команду:
PS> Get-Command -CommandType ExternalScript	

Получение подробных справочных сведений
В оболочке Windows PowerShell имеется подробная справочная документация для всех командлетов. Для отображения разделов справки используйте командлет Get-Help. Например, для получения справки по командлету Get-Childitem введите:
get-help get-childitem	

или
get-childitem -?	

Можно также каждый раз отображать по одной странице каждой темы при помощи функций man и help. Для их использования введите man или help, а затем имя командлета. Например, для отображения справки для командлета Get-Childitem введите:
man get-childitem	

или
help get-childitem	

Командлет Get-Help отображает также сведения о концептуальных разделах в оболочки Windows PowerShell. Концептуальные разделы справки начинаются префиксом «about_», например «about_line_editing». Для отображения списка концептуальных разделов введите:
get-help about_*	

Для отображения определенного раздела справки, введите имя раздела, например:
get-help about_line_editing	

Использование имен знакомых команд
Используя механизм псевдонимов, оболочка Windows PowerShell дает возможность пользователям ссылаться на команды по альтернативным именам. Механизм псевдонимов позволяет пользователям, имеющим опыт работы с другими оболочками, повторно использовать общие имена команд, с которыми они уже знакомы, для выполнения подобных операций в Windows PowerShell. Хотя мы не намереваемся подробно рассматривать псевдонимы Windows PowerShell, их можно использовать с самого начала работы с оболочкой Windows PowerShell.
Механизм псевдонимов связывает вводимое имя команды с другой командой. Например, в Windows PowerShell есть внутренняя функция Clear-Host, очищающая окно для выводимых данных. Если в командной строке ввести команду cls или clear, Windows PowerShell интерпретирует это как псевдоним для функции Clear-Host и выполняет функцию Clear-Host.
Это помогает пользователям изучать Windows PowerShell. Во-первых, большая часть пользователей Cmd.exe и ОС UNIX умеет работать с большим количеством команд, которые они уже знают по имени, и хотя эквивалентные команды Windows PowerShell могут не давать идентичных результатов, по форме они настолько близки известным пользователям командам, что они могут использовать их в работе, не тратя усилий на запоминание имен команд Windows PowerShell. Во-вторых, основными источниками трудностей при изучении новой оболочки, если пользозователь уже знаком с другой оболочкой, являются ошибки, вызываемые «памятью пальцев». Если вы в течение многих лет использовали Cmd.exe и если необходимо очистить экран, заполненный выводом, вы рефлекторно введете команду cls и нажмете клавишу ВВОД. Без псевдонима функции Clear-Host в оболочке Windows PowerShell вы просто получите сообщение об ошибке «'cls' не распознана как командлет, функция, выполняемая программа и файл сценария», и вам совершенно будет непонятно, как очистить экран.
Далее приводится краткий список общих команд 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:
PS> Get-Alias cls

CommandType     Name                            Definition
-----------     ----                            ----------
Alias           cls                             Clear-Host	

Чтобы повысить читаемость примеров, в данном руководстве мы старались избегать применения псевдонимов. Однако иметь предварительное представление о псевдонимах может быть полезным, если приходится работать с произвольными фрагментами кода Windows PowerShell из другого источника или если необходимо определить свои собственные псевдонимы. В оставшейся части этого раздела будут рассматриваться стандартные псевдонимы, а также способы определения собственных псевдонимов.
Интерпретация стандартных псевдонимов
В отличие от описанных выше псевдонимов, предназначенных для совместимости имен разных интерфейсов, псевдонимы, встроенные в оболочку Windows PowerShell, предназначены в основном для краткости. Такие более короткие имена могут быстрее вводиться, но их невозможно читать, если не знать, к чему они относятся.
В оболочке Windows PowerShell предпринята попытка найти компромисс между ясностью и краткостью. Такой компромисс обеспечивается при предоставлении набора стандартных псевдонимов, основанных на сокращенных именах для обычных глаголов и существительных. Это позволяет сформировать базовый набор псевдонимов для общих командлетов, которые могут быть читаемы, если известны сокращенные имена. Например, в стандартных псевдонимах глагол Get сокращается до g, глагол Set сокращается до s, существительное Item сокращается до i, существительное Location сокращается до l и существительное Command сокращается до cm.
Приведем краткий пример для иллюстрации того, как это работает. Стандартный псевдоним для Get-Item образуется из сочетания g для Get и i для Item: gi. Стандартный псевдоним для Set-Item образуется из сочетания s для Set и i для Item: si. Стандартный псевдоним для Get-Location образуется из сочетания g для Get и l для Location, gl. Стандартный псевдоним для Set-Location образуется из сочетания s для Set и l для Location, sl. Стандартный псевдоним для Get-Command образуется из сочетания g для Get и cm для Command, gcm. Не существует командлета Set-Command, но если бы он был, нетрудно было бы догадаться, что стандартный псевдоним был бы образован из s для Set и cm для Command: scm. Кроме того, люди, знакомые с механизмом псевдонимов Windows PowerShell и встретившие scm, могли бы догадаться, что этот псевдоним относится к Set-Command.
Создание новых псевдонимов
Можно создать свои собственные псевдонимы при помощи командлета Set-Alias. Например, следующие инструкции создают стандартные псевдонимы командлетов, рассматривавшиеся в разделе «Интерпретация стандартных псевдонимов».
Set-Alias -Name gi -Value Get-Item
Set-Alias -Name si -Value Set-Item
Set-Alias -Name gl -Value Get-Location
Set-Alias -Name sl -Value Set-Location
Set-Alias -Name gcm -Value Get-Command	

Внутренний механизм оболочки Windows PowerShell использует подобного рода команды во время установки, но эти псевдонимы нельзя изменить. При попытке действительного выполнения одной из этих команд будет сформировано сообщение об ошибке, поясняющее, что псевдоним не может быть изменен. Например:
PS> Set-Alias -Name gi -Value Get-Item
Set-Alias : Псевдоним gi не подлежит записи, так как он является постоянным или доступен только для чтения, и запись в него не может быть выполнена.
В строке:1 знак:10
+ Set-Alias  <<<< -Name gi -Value Get-Item
Применение клавиши TAB для автоматического завершения имен
Оболочки командной строки часто предоставляют способ автоматического завершения длинных имен файлов или команд, ускоряя ввод команд и предоставляя советы. Оболочка Windows PowerShell позволяет заносить имена файлов и командлетов нажатием клавиши Tab.
Примечание
Автозавершение контролируется внутренней функцией TabExpansion. Так как эта функция может быть изменена или переопределена, это рассмотрение служит в качестве руководства по поведению конфигурации Windows PowerShell по умолчанию.
Для автоматического ввода имени файла или пути из имеющихся возможностей выбора введите часть имени и нажмите клавишу Tab. Оболочка Windows PowerShell автоматически расширит имя до первого найденного ею совпадения. При повторении нажатия клавиши Tab производится циклический переход по имеющимся возможностям выбора.
Автозавершение имен командлетов выглядит несколько по-иному. Для использования расширения табуляции в имени командлета введите всю первую часть имени (глагол) и дефис, следующий за этой частью. В случае частичного совпадения можно ввести больший фрагмент имени. Например, при вводе get-co и последующем нажатии клавиши Tab  оболочкаWindows PowerShell автоматически расширяет это до командлета Get-Command (отметим, что оболочка изменяет также регистр букв в их стандартную форму). При повторном нажатии клавиши Tab оболочка Windows PowerShell заменяет это имя на другое, единственное соответствующее имя командлета, а именно: Get-Content.
В одной и той же строке функцию автозавершения можно использовать несколько раз. Например, автозавершение можно использовать для имени командлета Get-Content, введя:
PS> Get-Con<Tab>	

При нажатии клавиши Tab команда расширяется до:
PS> Get-Content	

После этого можно частично задать путь к файлу журнала Active Setup и вновь использовать автозавершение:
PS> Get-Content c:\windows\acts<Tab>	

При нажатии клавиши Tab команда расширяется до:
PS> Get-Content C:\windows\actsetup.log	

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

Конвейеры ведут себя как ряд соединенных между собой сегментов трубы. Элементы, перемещающиеся по конвейеру, проходят через каждый сегмент. Для создания конвейера в оболочке Windows PowerShell команды соединяются друг с другом оператором конвейерной обработки «|», и вывод каждой команды используется в качестве ввода следующей команды.
Конвейеры являются, вероятно, наиболее ценной концепцией, используемой в интерфейсах командной строки. Используемые должным образом, конвейеры не только снижают усилия, прилагаемые при вводе сложных команд, но и облегчают отслеживание потока работы в командах. Связанной с этим полезной характеристикой конвейеров является то, что так как конвейер действует на каждый элемент отдельно, его не нужно изменять в зависимости от того, имеется ли в конвейере ноль, один или много элементов. Кроме того, каждая команда в конвейере (называемая элементом конвейера) обычно передает свой вывод следующей команде в конвейере, элемент за элементом. Благодаря этому обычно снижается потребление ресурсов для сложных команд, и позволяет начать получать вывод немедленно.
В этой главе будет описываться, чем конвейер Windows PowerShell отличается от конвейеров наиболее популярных оболочек. Затем будут продемонстрированы некоторые базовые средства, которые могут использоваться для контроля вывода конвейера, а также, чтобы видеть, как работает конвейер.
Основные сведения о конвейере Windows PowerShell
Конвейеризация работает фактически везде в оболочке Windows PowerShell. Хотя на экране виден текст, Windows PowerShell не пропускает текст конвейером между командами. На самом деле оболочка пропускает по конвейеру объекты. 
Форма записи конвейеров сходна с формой, используемой в других оболочках, так что на первый взгляд не очевидно, что тут Windows PowerShell вводит что-то новое. Например, при использовании командлета Out-Host для постраничного отображения вывода другой команды вывод выглядит как обычный текст, отображаемый на экране и разбитый на страницы:
PS> Get-ChildItem -Path C:\WINDOWS\System32 | Out-Host -Paging
    Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\WINDOWS\system32

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2005-10-22  11:04 PM        315 $winnt$.inf
-a---        2004-08-04   8:00 AM      68608 access.cpl
-a---        2004-08-04   8:00 AM      64512 acctres.dll
-a---        2004-08-04   8:00 AM     183808 accwiz.exe
-a---        2004-08-04   8:00 AM      61952 acelpdec.ax
-a---        2004-08-04   8:00 AM     129536 acledit.dll
-a---        2004-08-04   8:00 AM     114688 aclui.dll
-a---        2004-08-04   8:00 AM     194048 activeds.dll
-a---        2004-08-04   8:00 AM     111104 activeds.tlb
-a---        2004-08-04   8:00 AM       4096 actmovie.exe
-a---        2004-08-04   8:00 AM     101888 actxprxy.dll
-a---        2003-02-21   6:50 PM     143150 admgmt.msc
-a---        2006-01-25   3:35 PM      53760 admparse.dll
<SPACE> next page; <CR> next line; Q quit
...	

Команда Out-Host -Paging является полезным элементом конвейера там, где необходимо медленно отобразить большой объем данных. Она особенно полезна при очень большой загрузке ЦП. Так как обработка передается командлету Out-Host, когда в нем имеется полная, готовая к отображению страница, командлеты, стоящие в конвейере ранее, останавливают свою работу, пока не будет подготовлена следующая страница вывода. Это можно наблюдать при использовании диспетчера задач Windows для контроля использования ЦП и памяти оболочкой Windows PowerShell. 
Выполните следующую команду: Get-ChildItem C:\Windows -Recurse. Сравните использование ЦП и памяти с аналогичными показателями следующей команды: Get-ChildItem C:\Windows -Recurse | Out-Host -Paging. На экране виден текст, но этот текст виден потому, что в окне консоли объекты необходимо представить в виде текста. Это является представлением того, что действительно происходит в оболочке Windows PowerShell. Например, рассмотрим командлет Get-Location. Если Get-Location будет введено, если текущим положением является корень диска С, можно будет видеть следующие данные:
PS> Get-Location

Path
----
C:\	

Если оболочка Windows PowerShell пропускает по конвейеру текст, выполняя такую команду как Get-Location | Out-Host, из Get-Location в Out-Host будет передан набор знаков, в порядке, в котором они отображаются на экране. Другими словами, если пропустить данные заголовка, Out-Host вначале получит знак «С», затем знак «:», а затем знак «\». Командлет Out-Host не может определить, какой смысл связан с выходными знаками, выводимыми командлетом Get-Location.
Вместо использования текста для связи команд в конвейере Windows PowerShell использует объекты. С точки зрения пользователя, объекты упаковывают связанную информацию в форму, в которой информацией можно легче манипулировать как единым блоком, и они при необходимости извлекают оттуда определенные элементы. 
Команда Get-Location не возвращает текст, содержащий текущий путь. Она возвращает пакет информации, называемый объектом PathInfo, содержащий текущий путь вместе с некоторой другой информацией. Затем командлет Out-Host пересылает этот объект PathInfo на экран, и оболочка Windows PowerShell решает, какую информацию следует отобразазить, и как ее надо отобразить на основании ее правил форматирования.
Фактически вывод информации заголовка командлета Get-Location добавляется только в конце процесса, как часть процесса форматирования данных, выводимых на экран. На экране видна сводные данные, а не полное представление выходного объекта.
Если выводом команды Windows PowerShell является большее количество информации, чем может быть отражено в окне консоли, каким образом можно извлечь невидимые элементы? Каким образом можно видеть дополнительные данные? И что делать в случае, если необходимо просмотреть данные в формате, отличном от формата, обычно используемого в оболочке Windows PowerShell?
В оставшейся части этой главы рассматривается, каким образом можно исследовать структуру определенных объектов Windows PowerShell, выбирая определенные элементы и форматируя их для более удобного отображения, и как послать эту информацию в альтернативные места вывода, такие как файлы и принтеры.
Просмотр структуры объекта (командлет Get-Member)
Так как объекты играют центральную роль в Windows PowerShell, имеется несколько собственных команд, предназначенных для работы с объектами произвольного типа. Наиболее важной из них является команда Get-Member.
Наиболее простой техникой анализа объектов, возвращаемых командой, является пропускание вывода этой команды по конвейеру на командлет Get-Member. Командлет Get-Member отображает формальное имя типа объекта и полный список его элементов. Количество возвращаемых элементов иногда может быть очень большим. Например, объект процесса может иметь более 100 элементов.
Чтобы увидеть все элементы объекта «Process» и сформировать страницу вывода таким образом, чтобы можно было просмотреть все элементы, введите:
PS> Get-Process | Get-Member | Out-Host -Paging	

Вывод этой команды будет выглядеть подобно следующему:
   TypeName: System.Diagnostics.Process

Name                           MemberType     Definition
----                           ----------     ----------
Handles                        AliasProperty  Handles = Handlecount
Name                           AliasProperty  Name = ProcessName
NPM                            AliasProperty  NPM = NonpagedSystemMemorySize
PM                             AliasProperty  PM = PagedMemorySize
VM                             AliasProperty  VM = VirtualMemorySize
WS                             AliasProperty  WS = WorkingSet
add_Disposed                   Method         System.Void add_Disposed(Event...
...	

Такой длинный список информации можно сделать более удобным, отфильтровав нужные элементы. Команда Get-Member позволяет перечислять только элементы, являющиеся свойствами. Имеется несколько форм свойств. Если в качестве значения параметра Get-MemberMemberType задается Properties, командлет отображает свойства любого типа. Окончательный список все еще очень длинный, но он является немного более управляемым:
PS> Get-Process | Get-Member -MemberType Properties

   TypeName: System.Diagnostics.Process

Name                       MemberType     Definition
----                       ----------     ----------
Handles                    AliasProperty  Handles = Handlecount
Name                       AliasProperty  Name = ProcessName
...
ExitCode                   Property       System.Int32 ExitCode {get;}
...
Handle                     Property       System.IntPtr Handle {get;}
...
CPU                        ScriptProperty System.Object CPU {get=$this.Total...
...
Path                       ScriptProperty System.Object Path {get=$this.Main...
...	

Примечание
Допустимыми значениями MemberType являются AliasProperty, CodeProperty, Property, NoteProperty, ScriptProperty, Properties, PropertySet, Method, CodeMethod, ScriptMethod, Methods, ParameterizedProperty, MemberSet и All.
Для процесса имеется более 60 свойств. Причиной, по которой оболочка Windows PowerShell часто отображает для хорошо известного объекта лишь небольшое число свойств, является то, что отображение всех этих свойств связано с неизмеримо большим количеством информации.
Примечание
Windows PowerShell определяет способ отображения объекта определенного типа, используя информацию, хранимую в XML-файлах, имена которых заканчиваются на .format.ps1xml. Данные форматирования для объектов процесса, являющихся объектами .NET System.Diagnostics.Process, хранятся в файле PowerShellCore.format.ps1xml.
Если необходимо просмотреть свойства, отличные от тех, которые Windows PowerShell отображает по умолчанию, пользователь должен будет сам отформатировать вывод. Это можно сделать при помощи командлетов форматирования.

Применение команд форматирования для изменения конечного представления данных
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 задается список имен свойств.
Если используется команда Get-Process -Name powershell с двумя выполняющимися экземплярами Windows PowerShell, в результате формируются выводимые данные, выглядящие следующим образом:
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    995       9    30308      27996   152     2.73   2760 powershell
    331       9    23284      29084   143     1.06   3448 powershell	

Оставшееся часть этого раздела будет посвящена ознакомлению с тем, как использовать командлеты Format для изменения способа отображения вывода команды.
Применение командлета Format-Wide для формирования вывода с одним элементом
По умолчанию командлет Format-Wide отображает только свойство объекта по умолчанию. Данные, связанные с каждым объектом, отображаются в одном столбце:
PS> Get-Process -Name powershell | Format-Wide

powershell                              powershell	

Можно также задать свойство, отличное от свойства по умолчанию:
PS> Get-Process -Name powershell | Format-Wide -Property Id

2760                                    3448	

Настройка отображения командлета Format-Wide при помощи столбца
При помощи командлета Format-Wide в определенный момент времени можно отобразить только одно свойство. Это может быть полезным при отображении простых списков, в которых в каждой строке отображается только один элемент. Для получения простой распечатки установите значение параметра Column, равное 1. Для этого введите:
Get-Command Format-Wide -Property Name -Column 1	

Использование командлета Format-List для получения представления списком
Командлет Format-List показывает объект в виде списка, в котором каждое свойство снабжено меткой и отображено в отдельной строке:
PS> Get-Process -Name powershell | Format-List

Id      : 2760
Handles : 1242
CPU     : 3.03125
Name    : powershell

Id      : 3448
Handles : 328
CPU     : 1.0625
Name    : powershell	

Можно указать произвольное число свойств:
PS> Get-Process -Name powershell | Format-List -Property ProcessName,FileVersion
,StartTime,Id

ProcessName : powershell
FileVersion : 1.0.9567.1
StartTime   : 2006-05-24 13:42:00
Id          : 2760

ProcessName : powershell
FileVersion : 1.0.9567.1
StartTime   : 2006-05-24 13:54:28
Id          : 3448	

Получение подробных сведений при помощи подстановочных знаков в командлете Format-List
Командлет Format-List позволяет использовать подстановочные знаки в качестве значения параметра Property. Это дает возможность отображать подробные сведения. Зачастую объекты содержат больше информации, чем необходимо. Поэтому Windows PowerShell по умолчанию выводит значения не всех свойств. Чтобы вывести все свойства объекта, воспользуйтесь командой Format-List -Property *. Следующая команда формирует более 60 строк вывода для одного процесса:
Get-Process -Name powershell | Format-List -Property *	

Хотя команда Format-List и полезна для вывода подробных сведений, если нужно получить сведения, содержащие много элементов, обычно удобнее использовать упрощенное табличное представление.
Использование командлета Format-Table для получения вывода в виде таблицы
Если использовать командлет Format-Table без указания имен свойств для форматирования вывода команды Get-Process, будет получен точно такой же вывод, что и без использования форматирования. Причина состоит в том, что процессы обычно показываются в виде таблицы, как и большинство объектов Windows PowerShell.
PS> Get-Process -Name powershell | Format-Table

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
   1488       9    31568      29460   152     3.53   2760 powershell
    332       9    23140        632   141     1.06   3448 powershell	

Улучшение вывода командлета Format-Table (параметр AutoSize)
Хотя табличное представление и полезно при выводе большого количества сведений для сравнения, интерпретация данных может вызвать затруднения, если экран слишком узок и не вмещает все данные. Например, если показать путь процесса, идентификатор, имя и компанию, данные в столбцах пути процесса и компании окажутся обрезанными:
PS> Get-Process -Name powershell | Format-Table -Property Path,Name,Id,Company

Path                Name                                 Id Company
----                ----                                 -- -------
C:\Program Files... powershell                         2836 Microsoft Corpor...	

Если указать параметр AutoSize при выполнении команды Format-Table, Windows PowerShell вычислит ширину столбцов на основании ширины реально отображаемых данных. Это улучшит внешний вид столбца Path, но значение столбца с названием компании останется обрезанным:
PS> Get-Process -Name powershell | Format-Table -Property Path,Name,Id,Company -
AutoSize

Path                                                    Name         Id Company
----                                                    ----         -- -------
C:\Program Files\Windows PowerShell\v1.0\powershell.exe powershell 2836 Micr...	

Командлет Format-Table может обрезать данные, но это происходит только на правой границе экрана. Свойствам, за исключением последнего отображаемого, выделяется столько места, сколько нужно для корректного вывода самого длинного элемента данных. Название компании будет видно полностью, но путь будет обрезан, если поменять местами элементы Path и Company в списке значений Property:
PS> Get-Process -Name powershell | Format-Table -Property Company,Name,Id,Path -
AutoSize

Company               Name         Id Path
-------               ----         -- ----
Microsoft Corporation powershell 2836 C:\Program Files\Windows PowerShell\v1...	

Команда Format-Table предполагает, что свойство, расположенное ближе к началу списка свойств, является более важным. В связи с этим предпринимается попытка отобразить полностью свойства, находящиеся ближе всего к началу. Если команда Format-Table не может отобразить все свойства, она удалит некоторые столбцы из вывода и выдаст предупреждение. Это поведение можно увидеть, если поместить свойство Name в конец списка:
PS> Get-Process -Name powershell | Format-Table -Property Company,Path,Id,Name -
AutoSize

WARNING: column "Name" does not fit into the display and was removed.

Company               Path                                                    I
                                                                              d
-------               ----                                                    -
Microsoft Corporation C:\Program Files\Windows PowerShell\v1.0\powershell.exe 6	

В приведенном выше выводе столбец идентификатора обрезан, чтобы его значение уместилось в списке, а заголовки столбцов расположены вертикально. Автоматическое изменение размера столбцов не всегда дает желаемый результат.
Перенос на следующую строку вывода командлета Format-Table в столбцах (параметр Wrap)
Можно принудительно перенести длинные данные вывода командлета Format-Table на следующую строку в пределах столбца с помощью параметра Wrap. Использование параметра Wrap в отдельности не всегда приводит к ожидаемому результату, поскольку используются установки по умолчанию, если также не указан параметр AutoSize:
PS> Get-Process -Name powershell | Format-Table -Wrap -Property Name,Id,Company,
Path

Name                                 Id Company             Path
----                                 -- -------             ----
powershell                         2836 Microsoft Corporati C:\Program Files\Wi
                                        on                  ndows PowerShell\v1
                                                            .0\powershell.exe 	

Преимуществом использования параметра Wrap без других параметров является то, что обработка при этом не замедляется существенным образом. Использование параметра AutoSize во время выполнения рекурсивного вывода списка файлов в большом каталоге может потребовать значительного объема памяти и времени перед отображением первых элементов вывода.
Если загрузка системы не имеет решающего значения, параметр AutoSize хорошо работает в сочетании с параметром Wrap. Начальным столбцам всегда выделяется необходимый размер для вывода элементов в одной строке, как и при указании параметра AutoSize без параметра Wrap. Единственное отличие состоит в том, что последний столбец будет при необходимости перенесен на следующую строку:
PS> Get-Process -Name powershell | Format-Table -Wrap -AutoSize -Property Name,I
d,Company,Path

Name         Id Company               Path
----         -- -------               ----
powershell 2836 Microsoft Corporation C:\Program Files\Windows PowerShell\v1.0\
                                      powershell.exe	

Некоторые столбцы могут не быть показаны, если первым указать самый широкий столбец, поэтому безопаснее указывать первыми самые маленькие элементы данных. В следующем примере первым указан чрезвычайно большой элемент — путь. Даже при использовании переноса на следующую строку последний столбец Name будет утерян:
 PS> Get-Process -Name powershell | Format-Table -Wrap -AutoSize -Property Path,I
d,Company,Name

WARNING: column "Name" does not fit into the display and was removed.

Path                                                      Id Company
----                                                      -- -------
C:\Program Files\Windows PowerShell\v1.0\powershell.exe 2836 Microsoft Corporat
                                                             ion	

Организация табличного вывода (параметр -GroupBy)
Другим полезным параметром управления табличным выводом является параметр GroupBy. Длинные табличные выводы особенно тяжелы для сравнения. Параметр GroupBy группирует выводимые данные в соответствии со значениями свойств. Например, можно сгруппировать процессы по компании для упрощения проверки, исключая название компании из списка свойства:
PS> Get-Process -Name powershell | Format-Table -Wrap -AutoSize -Property Name,I
d,Path -GroupBy Company

   Company: Microsoft Corporation

Name         Id Path
----         -- ----
powershell 1956 C:\Program Files\Windows PowerShell\v1.0\powershell.exe
powershell 2656 C:\Program Files\Windows PowerShell\v1.0\powershell.exe	

Перенаправление данных с помощью командлетов Out-*
Windows PowerShell предоставляет несколько командлетов, которые позволяют напрямую управлять выводом данных. Эти командлеты обладают двумя общими важными характеристиками.
Во-первых, они обычно преобразуют данные в некоторое текстовое представление. Преобразование выполняется, поскольку данные выводятся в системные компоненты, ожидающие текстовый ввод. Это означает, что объекты должны быть представлены в текстовом виде. Поэтому текст форматируется в виде, пригодном для отображения в окне консоли Windows PowerShell.
Во-вторых, эти командлеты используют глагол Windows PowerShell Out, поскольку отправляют сведения из Windows PowerShell за пределы оболочки. Командлет Out-Host не является исключением: окно главного приложения отображается вне Windows PowerShell. Это важно, поскольку при передаче из Windows PowerShell данные в действительности удаляются. Убедиться в этом можно, если попытаться создать конвейер, который постранично передает данные в окно главного приложения и пытается отформатировать их в виде списка, как показано ниже:
PS> Get-Process | Out-Host -Paging | Format-List	

Можно было бы ожидать, что команда отобразит страницы сведений о процессе в виде списка. Вместо этого она выводит их в виде табличного списка по умолчанию:
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    101       5     1076       3316    32     0.05   2888 alg
...
    618      18    39348      51108   143   211.20    740 explorer
    257       8     9752      16828    79     3.02   2560 explorer
...
<SPACE> next page; <CR> next line; Q quit
...	

Командлет Out-Host передает данные напрямую консоли, поэтому команда Format-List так и не получает ничего для форматирования.
Чтобы правильно структурировать эту команду, нужно поместить командлет Out-Host в конец конвейера, как показано ниже. При этом данные процесса форматируются в виде списка перед разбиением на страницы и отображением.
PS> Get-Process | Format-List | Out-Host -Paging

Id      : 2888
Handles : 101
CPU     : 0.046875
Name    : alg
...

Id      : 740
Handles : 612
CPU     : 211.703125
Name    : explorer

Id      : 2560
Handles : 257
CPU     : 3.015625
Name    : explorer
...
<SPACE> next page; <CR> next line; Q quit
...	

Это относится ко всем командлетам Out. Командлет Out всегда должен находиться в конце конвейера.
Примечание
Все командлеты Out подготавливают вывод в виде текста, используя текущее форматирование для окна консоли, включая ограничения на длину строки.
Разбиение вывода консоли на страницы (командлет Out-Host)
По умолчанию Windows PowerShell передает данные в окно главного приложения, что и является функцией командлета Out-Host. Как было описано ранее, основное назначение командлета Out-Host заключается в разбиении данных на страницы. Например, следующая команда использует командлет Out-Host для разбиения на страницы вывода командлета Get-Command:
PS> Get-Command | Out-Host -Paging	

Для разбиения данных на страницы можно также использовать функцию more. В Windows PowerShell функция more вызывает команду Out-Host -Paging. Следующая команда демонстрирует использование функции more для разбиения на страницы вывода командлета Get-Command:
PS> Get-Command | more	

Если в качестве параметров этой функции указать одно или несколько имен файлов, функция прочитает указанные файлы и разобьет на страницы их содержимое при передаче в главное приложение:
PS> more c:\boot.ini
[boot loader]
timeout=5
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
...	

Отбрасывание ненужного вывода (командлет Out-Null)
Командлет Out-Null разработан для немедленного отбрасывания любых входных данных. Это полезно при отбрасывании ненужных данных, полученных в качестве побочного эффекта выполнения команды. Если ввести следующую команду, ее выполнение не приведет к выдаче какого-либо результата:
PS> Get-Command | Out-Null	

Командлет Out-Null не отбрасывает сообщения об ошибках. Например, если ввести следующую команду, будет отображено сообщение о том, что оболочка Windows PowerShell не распознала вызов «Is-NotACommand»:
PS> Get-Command Is-NotACommand | Out-Null
Get-Command : 'Is-NotACommand' is not recognized as a cmdlet, function, operabl
e program, or script file.
At line:1 char:12
+ Get-Command  <<<< Is-NotACommand | Out-Null	

Печать данных (командлет Out-Printer)
Данные можно распечатать при помощи командлета Out-Printer. Командлет Out-Printer использует принтер по умолчанию, если не указано имя принтера. Можно использовать любой принтер Windows, указав его отображаемое имя. Отсутствует необходимость как в привязке порта принтера, так и в присутствии реального физического принтера. Например, если имеются установленные средства управления образами документов Microsoft Office, можно направить данные в файл изображения, введя следующее:
PS> Get-Command Get-Command | Out-Printer -Name "Microsoft Office Document Image Writer"	

Сохранение данных (командлет Out-File)
Можно направить вывод в файл вместо окна консоли с помощью командлета Out-File. Следующая команда направляет список процессов в файл C:\temp\processlist.txt:
PS> Get-Process | Out-File -FilePath C:\temp\processlist.txt 	

Результаты использования командлета Out-File не всегда соответствуют ожидаемым, если пользователь привык к традиционному перенаправлению вывода. Чтобы разобраться в его поведении, следует учесть контекст, в котором выполняется командлет Out-File.
По умолчанию командлет Out-File создает файл в формате Юникод. Это наилучшее долговременное решение, но средства, которые принимают на входе файлы ASCII, не будут корректно работать с таким форматом вывода по умолчанию. Формат вывода по умолчанию можно изменить на ASCII с помощью параметра Encoding:
PS> Get-Process | Out-File -FilePath C:\temp\processlist.txt -Encoding ASCII	

Командлет Out-file форматирует содержимое файла так, чтобы оно выглядело аналогично выводу консоли. Это приводит к обрезанию вывода, как это чаще всего и происходит в окне консоли. Предположим, например, что выполняется следующая команда:
PS> Get-Command | Out-File -FilePath c:\temp\output.txt	

Вывод будет выглядеть следующим образом:
CommandType     Name                            Definition                     
-----------     ----                            ----------                     
Cmdlet          Add-Content                     Add-Content [-Path] <String[...
Cmdlet          Add-History                     Add-History [[-InputObject] ...
...	

Чтобы получить вывод, который не использует переносы для обеспечения соответствия ширине экрана, можно воспользоваться параметром Width для указания ширины строки. Поскольку параметр Width представляет собой 32-разрядное целое число, его максимальное значение может быть равно 2 147 483 647. Чтобы установить ширину строки в максимальное значение, введите следующее:
Get-Command | Out-File -FilePath c:\temp\output.txt -Width 2147483647	

Командлет Out-File наиболее полезен, когда нужно сохранить вывод в том же виде, в каком он отображается на консоли. Для более точного управления форматом вывода необходимо наличие дополнительных средств. Они, а также некоторые подробности работы с объектами, будут рассмотрены в следующей главе.
Навигация в Windows PowerShell
Папки являются хорошо знакомой организационной возможность интерфейса проводника Windows, Cmd.exe и средств системы UNIX, таких как BASH. Папки, чаще называемые каталогами, представляют собой удобный способ организации файлов и других каталогов. Операционные системы семейства UNIX расширяют это понятие, представляя в виде файлов все, что угодно; в специальных папках в виде файлов располагаются и конкретные аппаратные, и сетевые соединения. Этот подход не гарантирует, что содержимое может быть прочитано или использовано конкретными приложениями, но упрощает поиск нужных элементов. Средства, работающие с файлами или выполняющие поиск по файлам и папкам, работают также и с этими устройствами. Также можно обратиться к конкретному элементу через представляющий его путь к файлу.
Аналогично: инфраструктура Windows PowerShell поддерживает представление практически всех объектов, по которым можно перемещаться как по обычному диску Microsoft Windows или файловой системы UNIX, в виде диска Windows PowerShell. Диск Windows PowerShell не обязательно представляет собой реальный, локальный или сетевой диск. В этой главе рассматривается главным образом перемещение по файловым системам, но описанные концепции применимы и к дискам Windows PowerShell, которые не связаны с файловыми системами.
Управление текущим местоположением в Windows Powershell
При перемещении по папкам в проводнике Windows обычно имеется конкретное рабочее местоположение, а именно: открытая в данный момент папка. Манипулировать элементами текущей папки можно, щелкая их. Если используется интерфейс командной строки (например Cmd.exe), то находясь в той же папке, что и определенный файл, можно получить к нему доступ, указав относительно короткое имя вместо полного пути к файлу. Текущий каталог называется рабочим каталогом.
Windows PowerShell использует существительное Location для обращения к рабочему каталогу и поддерживает семейство командлетов, предназначенных для исследования текущего местоположения и управления им.
Определение текущего местоположения (командлет Get-Location)
Чтобы определить путь к текущему каталогу, введите команду Get-Location:
PS> Get-Location
Path
----
C:\Documents and Settings\PowerUser	

Примечание
Командлет Get-Location аналогичен команде pwd в оболочке BASH. Командлет Set-Location аналогичен команде cd в оболочке Cmd.exe.
Задание текущего местоположения (командлет Set-Location)
Команда Get-Location используется совместно с командой Set-Location. Команда Set-Location позволяет задать местоположение текущего каталога:
PS> Set-Location -Path C:\Windows	

После введения этой команды явный отзыв о ее выполнении не выводится. Большинство команд Windows PowerShell, выполняющие какие-либо действия, практически не выводят какие-либо данные, поскольку эти данные малополезны. Чтобы проверить, успешно ли выполнена смена текущего каталога при вводе команды Set-Location, следует указать параметр -PassThru:
PS> Set-Location -Path C:\Windows -PassThru
Path
----
C:\WINDOWS	

Параметр -PassThru можно использовать в Windows PowerShell в сочетании со многими командами группы Set для возвращения сведений о результатах в случаях, когда по умолчанию вывод отсутствует.
Можно указывать пути относительно текущего местоположения таким же образом, каким это осуществляется в командных оболочках UNIX и Windows. В стандартной нотации для относительных путей точка (.) представляет текущую папку, а две точки (..) представляют родительский каталог относительно текущего местоположения. 
Например, если текущей папкой является папка C:\Windows, точка (.) представляет папку C:\Windows, а две точки (..) представляют папку C:. Можно сделать текущим местоположением корневой диск «С:», выполнив команду:
PS> Set-Location -Path .. -PassThru
Path
----
C:\
Вышеописанный метод уместен и при работе с дисками Windows PowerShell, которые не являются дисками файловых систем, например HKLM:. Можно перенести текущее местоположение на раздел HKLM\Software в реестре, выполнив команду:
 PS> Set-Location -Path HKLM:\SOFTWARE -PassThru

Path
----
HKLM:\SOFTWARE	

После этого можно перейти в родительский каталог, который является корневым каталогом Windows PowerShell на диске HKLM:, воспользовавшись относительным путем:
PS> Set-Location -Path .. -PassThru

Path
----
HKLM:\	

При этом допустимо вводить команду Set-Location или использовать любой из встроенных псевдонимов Windows PowerShell для команды Set-Location (cd, chdir, sl). Например:
cd -Path C:\Windows	

chdir -Path .. -PassThru
sl -Path HKLM:\SOFTWARE -PassThru	

Сохранение и возврат на последние местоположения (командлеты Push-Location и Pop-Location)
При смене местоположения полезно отслеживать произведенное перемещение, что позволяет вернуться на предыдущее местоположение. Командлет Push-Location в Windows PowerShell создает упорядоченный журнал («стек») путей к каталогам, в которые осуществлялось перемещение, и дает возможность вернуться по журналу путей к каталогам с помощью дополнительного командлета Pop-Location. 
Например, при запуске сеанса Windows PowerShell текущим местоположением обычно бывает домашний каталог пользователя.
 PS> Get-Location

Path
----
C:\Documents and Settings\PowerUser 	

Примечание
Слово «стек» имеет особое значение во многих средах программирования, включая .NET. Как и физический стек элементов, последний элемент, добавленный в стек, является первым элементом, который можно извлечь из стека. Добавление элемента в стек в разговорной речи называется «проталкиванием» элемента в стек. Извлечение элемента из стека в разговорной речи называется «выталкиванием» элемента из стека.

Чтобы добавить текущее местоположение в стек и перейти в папку «Local Settings», введите:
 PS> Push-Location -Path "Local Settings"	

После этого можно добавить папку «Local Settings» в стек и перейти в папку «Temp», выполнив команду:
PS> Push-Location -Path Temp	

Можно проверить, что каталог был изменен, выполнив команду Get-Location:
PS> Get-Location

Path
----
C:\Documents and Settings\PowerUser\Local Settings\Temp	

После этого можно перейти назад в предыдущий каталог, выполнив команду Pop-Location, и проверить, что переход был произведен, при помощи команды Get-Location:
PS> Pop-Location
PS> Get-Location

Path
----
C:\Documents and Settings\me\Local Settings	

Как и в случае с командлетом Set-Location, можно использовать параметр -PassThru при вводе командлета Pop-Location для отображения каталога, в который был осуществлен переход:
PS> Pop-Location -PassThru

Path
----
C:\Documents and Settings\PowerUser	

Командлетам группы Location можно также передавать сетевые пути. Если имеется сервер с именем «FS01» с общей папкой с именем «Public», можно перейти в эту папку, выполнив команду:
Set-Location \\FS01\Public	

или
Push-Location \\FS01\Public	

Команды Push-Location и Set-Location можно использовать для перехода на любой доступный диск. Например, если имеется локальный привод компакт-дисков с именем «D:», в который вставлен компакт-диск с данными, можно перейти на этот диск, выполнив команду Set-Location D:.
Если диск пуст, будет выведено следующее сообщение об ошибке:
PS> Set-Location D:
Set-Location : Не удается найти путь 'D:\', так как он не существует.	

Если используется интерфейс командной строки, то использовать проводник Windows для работы с доступными физическими дисками неудобно. Кроме того, проводник Windows не сможет показать все диски Windows PowerShell. Windows PowerShell предоставляет набор команд для работы с дисками Windows PowerShell. Об этом будет рассказано далее.
Управление дисками Windows PowerShell
Диск Windows PowerShell представляет собой хранилище данных, доступ к которому в Windows Powershell можно получить так же, как и к диску файловой системы. Поставщики Windows PowerShell создают несколько дисков, например, диски файловой системы (включая C: и D:), диски реестра (HKCU: и HKLM:), а также диск сертификатов (Cert:). Можно создавать и собственные диски Windows PowerShell. Эти диски весьма полезны, но доступны только из Windows PowerShell. Доступ к ним при помощи других средств Windows, таких как проводник Windows или оболочка Cmd.exe, невозможен.
Windows PowerShell использует существительное PSDrive для команд, которые работают с дисками Windows PowerShell. Чтобы получить список дисков Windows PowerShell в текущем сеансе, воспользуйтесь командлетом Get-PSDrive.
PS> Get-PSDrive

Name       Provider      Root                                   CurrentLocation
----       --------      ----                                   ---------------
A          FileSystem    A:\
Alias      Alias
C          FileSystem    C:\                                 ...And Settings\me
cert       Certificate   \
D          FileSystem    D:\
Env        Environment
Function   Function
HKCU       Registry      HKEY_CURRENT_USER
HKLM       Registry      HKEY_LOCAL_MACHINE
Variable   Variable	

Хотя диски в данном примере могут отличаться от дисков реальной системы, форма вывода будет аналогична выводу команду Get-PSDrive, который показан выше.
Диски файловой системы являются подмножеством дисков Windows PowerShell. Диски файловой системы можно распознать по тексту «FileSystem» в столбце «Поставщик». (Диски файловой системы в Windows PowerShell поддерживаются поставщиком Windows PowerShell FileSystem.)
Чтобы узнать о синтаксисе командлета et-PSDrive, введите команду Get-Command с параметром Syntax:
PS> Get-Command -Name Get-PSDrive -Syntax
Get-PSDrive [[-Name] <String[]>] [-Scope <String>] [-PSProvider <String[]>] [-V
erbose] [-Debug] [-ErrorAction <ActionPreference>] [-ErrorVariable <String>] [-
OutVariable <String>] [-OutBuffer <Int32>] 	

Параметр PSProvider позволяет отобразить только диски Windows PowerShell, поддерживаемые определенным поставщиком. Например, чтобы показать только диски Windows PowerShell, которые поддерживаются поставщиком Windows PowerShell FileSystem, введите команду Get-PSDrive с параметром PSProvider, который имеет значение FileSystem:
PS> Get-PSDrive -PSProvider FileSystem

Name       Provider      Root                                   CurrentLocation
----       --------      ----                                   ---------------
A          FileSystem    A:\
C          FileSystem    C:\                           ...nd Settings\PowerUser
D          FileSystem    D:\	

Чтобы просмотреть диски Windows PowerShell, которые представляют кусты реестра, воспользуйтесь параметром PSProvider для вывода только дисков Windows PowerShell, которые поддерживаются поставщиком Windows PowerShell Registry:
PS> Get-PSDrive -PSProvider Registry

Name       Provider      Root                                   CurrentLocation
----       --------      ----                                   ---------------
HKCU       Registry      HKEY_CURRENT_USER
HKLM       Registry      HKEY_LOCAL_MACHINE
Также с дисками Windows PowerShell можно использовать стандартные командлеты группы Location:
PS> Set-Location HKLM:\SOFTWARE
PS> Push-Location .\Microsoft
PS> Get-Location

Path
----
HKLM:\SOFTWARE\Microsoft
Добавление новых дисков Windows PowerShell (командлет New-PSDrive)
С помощью команды New-PSDrive можно добавлять пользовательские диски Windows PowerShell. Чтобы узнать о синтаксисе командлета New-PSDrive, введите команду Get-Command с параметром Syntax:
PS> Get-Command -Name New-PSDrive -Syntax
New-PSDrive [-Name] <String> [-PSProvider] <String> [-Root] <String> [-Descript
ion <String>] [-Scope <String>] [-Credential <PSCredential>] [-Verbose] [-Debug
] [-ErrorAction <ActionPreference>] [-ErrorVariable <String>] [-OutVariable <St
ring>] [-OutBuffer <Int32>] [-WhatIf] [-Confirm]	

Чтобы создать новый диск Windows PowerShell, необходимо указать три параметра:
·	имя диска (можно использовать любое допустимое в Windows PowerShell имя);
·	поставщик PSProvider (используйте «FileSystem» для местоположений в файловой системе и «Registry» для местоположений в реестре);
·	корень, то есть путь к домашнему каталогу нового диска.
Например, можно создать диск с именем «Office», который отображается на папку, в которой расположены приложения Microsoft Office, например C:\Program Files\Microsoft Office\OFFICE11. Чтобы создать такой диск, введите следующую команду:
PS> New-PSDrive -Name Office -PSProvider FileSystem -Root "C:\Program Files\Micr
osoft Office\OFFICE11"

Name       Provider      Root                                   CurrentLocation
----       --------      ----                                   ---------------
Office     FileSystem    C:\Program Files\Microsoft Offic...	

Примечание
Чаще всего пути вводятся без учета регистра.

Обращаться к новому диску Windows PowerShell можно точно также, как и к остальным дискам Windows PowerShell — по имени, за которым следует двоеточие (:).
Диск Windows PowerShell может упростить выполнение многих задач. Например, некоторые из самых важных разделов в реестре Windows имеют крайне длинные пути, которые тяжело запоминаются, что затрудняет доступ к ним. Важные сведения о конфигурации находятся в разделе HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion. Чтобы просмотреть и отредактировать элементы раздела реестра CurrentVersion, можно создать диск Windows PowerShell, домашним каталогом которого будет этот раздел, при помощи команды:
PS> New-PSDrive -Name cvkey -PSProvider Registry -Root HKLM\Software\Microsoft\W
indows\CurrentVersion

Name       Provider      Root                                   CurrentLocation
----       --------      ----                                   ---------------
cvkey      Registry      HKLM\Software\Microsoft\Windows\...
После этого можно перейти на диск «cvkey:», как на любой другой диск:
PS> cd cvkey:
или
PS> Set-Location cvkey: -PassThru

Path
----
cvkey:\
Командлет New-PsDrive добавляет новый диск только в текущий сеанс консоли. Если выйти из консоли или закрыть окно Windows PowerShell, новый диск будет потерян. Чтобы сохранить диск Windows PowerShell, воспользуйтесь командлетом Export-Console, чтобы экспортировать текущую консоль. Используйте параметр PowerShell.exe PSConsoleFile для ее импорта в новый сеанс. Можно также добавить новый диск в собственный профиль Windows PowerShell.
Удаление дисков Windows PowerShell (командлет Remove-PSDrive)
С помощью команды Remove-PSDrive можно удалять диски Windows PowerShell. Командлет Remove-PSDrive прост в использовании; чтобы удалить диск Windows PowerShell, просто укажите имя диска Windows PowerShell. 
Например, если был добавлен диск Windows PowerShell Office:, как описано в разделе New-PSDrive, его можно удалить, выполнив команду:
PS> Remove-PSDrive -Name Office	

Чтобы удалить диск Windows PowerShell cvkey:, также описанный в разделе New-PSDrive, воспользуйтесь командой:
PS> Remove-PSDrive -Name cvkey	

Удалить диск Windows PowerShell несложно, но его невозможно удалить, пока он является текущим. Например:
PS> cd office:
PS Office:\> remove-psdrive -name office
Remove-PSDrive : Cannot remove drive 'Office' because it is in use.
At line:1 char:15
+ remove-psdrive  <<<< -name office	

Добавление и удаление дисков извне Windows PowerShell
Windows PowerShell обнаруживает диски файловой системы, добавленные или удаленные в сеансе Windows, в том числе отображаемые сетевые диски, вставленные накопители USB, а также диски, удаленные с помощью либо команды net use, либо методов объекта WScript.NetworkMapNetworkDrive и RemoveNetworkDrive из сценария сервера сценариев Windows (WSH).
Работа с файлами, папками и разделами реестра
Windows PowerShell использует существительное Item для обращения к элементам, расположенным на диске Windows PowerShell. При работе с поставщиком Windows PowerShell FileSystem Item может представлять файл, папку или диск Windows PowerShell. Вывод и работа этих элементов является важной основной задачей в большинстве административных настроек, поэтому следует подробнее остановиться на этих задачах.
Перечисление файлов, папок и разделов реестра (командлет Get-ChildItem)
Поскольку получение набора элементов из определенного местоположения является типичной задачей, имеется командлет Get-ChildItem, специально предназначенный для возвращения всех элементов, найденных в контейнере (например в папке). 
Если нужно вернуть все файлы и папки, содержащиеся непосредственно в папке «C:\Windows», введите:
PS> Get-ChildItem -Path C:\Windows
    Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\Windows
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2006-05-16   8:10 AM          0 0.log
-a---        2005-11-29   3:16 PM         97 acc1.txt
-a---        2005-10-23  11:21 PM       3848 actsetup.log
...	

Вывод выглядит аналогично тому, что можно увидеть, выполнив команду dir в оболочке Cmd.exe или команду ls в командной оболочкеUNIX.
С помощью параметров командлета Get-ChildItem можно производить очень сложные выводы. Разберем далее несколько сценариев. Чтобы увидеть синтаксис командлета Get-ChildItem, введите:
PS> Get-Command -Name Get-ChildItem -Syntax	

Эти параметры можно совмещать и объединять для получения необходимого вывода.
Вывод всех вложенных элементов (параметр -Recurse)
Чтобы увидеть элементы папки «Windows» вместе со всеми элементами во вложенных папках, воспользуйтесь параметром Recurse командлета Get-ChildItem. В выводе отображены все элементы папки «Windows» и все элементы вложенных папок. Например:
PS> Get-ChildItem -Path C:\WINDOWS -Recurse

    Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\WINDOWS
    Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\WINDOWS\AppPatch
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2004-08-04   8:00 AM    1852416 AcGenral.dll
...	

Фильтрация элементов по имени (параметр -Name)
Чтобы отобразить только имена элементов, воспользуйтесь параметром Name командлета Get-Childitem:
PS> Get-ChildItem -Path C:\WINDOWS -Name
addins
AppPatch
assembly
...	

Принудительный показ скрытых элементов (параметр -Force)
Элементы, которые обычно не видны в проводнике Windows или оболочке Cmd.exe, не отображаются в выводе команды Get-ChildItem. Для того чтобы показать скрытые элементы, воспользуйтесь параметром Force командлета Get-Childitem. Например:
Get-ChildItem -Path C:\Windows -Force	

Этот параметр называется «Force», поскольку позволяет принудительно изменить обычное поведение команды Get-ChildItem. Параметр «Force» широко используется, поскольку приводит к результату, который при обычной работе командлета является недоступным. При этом он никак не влияет на безопасность системы.
Поиск имен элементов с использование подстановочных знаков
Команда Get-ChildItem допускает использование подстановочных знаков в пути к элементам, которые нужно показать.
Поскольку подстановочные знаки обрабатываются ядром Windows PowerShell, все командлеты, которые допускают подстановочные знаки, используют то же обозначение, и обладают таким же поведением при сопоставлении. Предназначение подстановочных знаков Windows PowerShell таково:
·	звездочка (*) соответствует нулю или большему числу вхождений любого знака;
·	знак вопроса (?) соответствует ровно одному знаку;
·	набор сопоставляемых знаков заключается между левой квадратной скобкой ([) и правой квадратной скобкой (]).
Ниже приведено несколько примеров использования подстановочных знаков.
Чтобы найти все файлы каталоге «Windows» с суффиксом .log и ровно пятью знаками в основном имени, введите следующую команду:
PS> Get-ChildItem -Path C:\Windows\?????.log
    Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\Windows
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
...
-a---        2006-05-11   6:31 PM     204276 ocgen.log
-a---        2006-05-11   6:31 PM      22365 ocmsn.log
...
-a---        2005-11-11   4:55 AM         64 setup.log
-a---        2005-12-15   2:24 PM      17719 VxSDM.log
...	

Чтобы найти все файлы, начинающиеся с буквы x в каталоге «Windows», введите:
 Get-ChildItem -Path C:\Windows\x*	

Чтобы найти все файлы, чьи имена начинаются с x или z, введите:
Get-ChildItem -Path C:\Windows\[xz]*	

Исключение элементов (параметр -Exclude)
Можно исключить некоторые элементы с помощью параметра Exclude командлета Get-ChildItem. Это позволяет выполнять сложную фильтрацию при помощи одной команды.
Предположим, например, что необходимо найти файл динамической библиотеки Windows Time Service в папке «System32», причем известно лишь, что имя файла начинается с буквы «W» и содержит строку «32».
Выражение вида w*32*.dll найдет все файлы DLL, которые удовлетворяют условиям, но оно также может вернуть совместимые с Windows 95 и 16-разрядной системой Windows файлы DLL, которые содержат в именах строки «95» или «16». Можно исключить файлы, содержащие в имени такие числа с помощью параметра Exclude с указанием маски *[9516]*: 
 PS> Get-ChildItem -Path C:\WINDOWS\System32\w*32*.dll -Exclude *[9516]*

    Directory: Microsoft.PowerShell.Core\FileSystem::C:\WINDOWS\System32

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2004-08-04   8:00 AM     174592 w32time.dll
-a---        2004-08-04   8:00 AM      22016 w32topl.dll
-a---        2004-08-04   8:00 AM     101888 win32spl.dll
-a---        2004-08-04   8:00 AM     172032 wldap32.dll
-a---        2004-08-04   8:00 AM     264192 wow32.dll
-a---        2004-08-04   8:00 AM      82944 ws2_32.dll
-a---        2004-08-04   8:00 AM      42496 wsnmp32.dll
-a---        2004-08-04   8:00 AM      22528 wsock32.dll
-a---        2004-08-04   8:00 AM      18432 wtsapi32.dll
Объединение параметров командлета Get-ChildItem
Можно использовать несколько параметров командлета Get-ChildItem в одной команде. Перед объединением параметров убедитесь в том, что правильно понимаете значение подстановочных знаков. Например, следующая команда не возвращает никакого результата:
PS> Get-ChildItem -Path C:\Windows\*.dll -Recurse -Exclude [a-y]*.dll	

Результаты отсутствуют несмотря на то, что в папке «Windows» имеется два файла DLL, которые начинаются с буквы «z». 
Дело в том, что подстановочный знак был указан как часть пути. И, хотя команда рекурсивна, командлет Get-ChildItem показал только те элементы, которые находятся в папке «Windows», и чьи имена заканчиваются на «.dll».
Чтобы указать рекурсивный поиск файлов, чьи имена соответствуют специальной маске, используйте параметр -Include. 
PS> Get-ChildItem -Path C:\Windows -Include *.dll -Recurse -Exclude [a-y]*.dll

    Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\Windows\System32\Setup

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2004-08-04   8:00 AM       8261 zoneoc.dll

    Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\Windows\System32

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2004-08-04   8:00 AM     337920 zipfldr.dll

Непосредственная работа с элементами
Элементы, находящиеся на дисках Windows PowerShell (например, файлы и папки дисков файловой системы и разделы реестра на дисках реестра Windows PowerShell), называются в Windows PowerShell элементами. Командлеты для работы с ними содержат в своих именах существительное Item.
Вывод команды Get-Command -Noun Item показывает, что существует девять командлетов Windows PowerShell для работы с элементами.
PS> Get-Command -Noun Item

CommandType     Name                            Definition
-----------     ----                            ----------
Cmdlet          Clear-Item                      Clear-Item [-Path] <String[]...
Cmdlet          Copy-Item                       Copy-Item [-Path] <String[]>...
Cmdlet          Get-Item                        Get-Item [-Path] <String[]> ...
Cmdlet          Invoke-Item                     Invoke-Item [-Path] <String[...
Cmdlet          Move-Item                       Move-Item [-Path] <String[]>...
Cmdlet          New-Item                        New-Item [-Path] <String[]> ...
Cmdlet          Remove-Item                     Remove-Item [-Path] <String[...
Cmdlet          Rename-Item                     Rename-Item [-Path] <String>...
Cmdlet          Set-Item                        Set-Item [-Path] <String[]> ...	

Создание новых элементов (командлет New-Item)
Чтобы создать новый элемент в файловой системе, воспользуйтесь командлетом New-Item. Включите параметр Path и укажите путь к элементу и параметр ItemType со значением «file» или «directory».
Например, чтобы создать новый каталог с именем «New.Directory» в каталоге «C:\Temp», введите:
PS> New-Item -Path c:\temp\New.Directory -ItemType Directory

    Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\temp

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2006-05-18  11:29 AM            New.Directory	

Чтобы создать файл, изменить значение параметра ItemType на значение «file». Например, чтобы создать файл с именем «file1.txt» в каталоге «New.Directory», введите:
PS> New-Item -Path C:\temp\New.Directory\file1.txt -ItemType file

    Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\temp\New.Directory

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2006-05-18  11:44 AM          0 file1	

Можно использовать тот же метод для создания нового раздела реестра. По сути, раздел реестра создать даже проще, поскольку единственным типом, присутствующим в реестре Windows, является раздел реестра. (Записи реестра являются свойствами элементов.) Например, чтобы создать раздел с именем «_Test» во вложенном разделе реестра «CurrentVersion», введите:
PS> New-Item -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\_Test

   Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Micros
oft\Windows\CurrentVersion

SKC  VC Name                           Property
---  -- ----                           --------
  0   0 _Test                          {}	

При вводе пути реестра обязательно включите двоеточие (:) в именах дисков Windows PowerShell, таких как HKLM: и HKCU:. Без двоеточия оболочка Windows PowerShell не распознает имя диска в пути.
Почему параметры реестра не являются значениями

При использовании командлета Get-ChildItem для поиска элементов в разделе реестра никогда не показываются действительные записи реестра или их значения. 
Например, раздел реестра HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run обычно содержит несколько записей реестра, которые представляют приложения, которые запускаются при запуске системы.
Однако если использовать командлет Get-ChildItem для просмотра дочерних элементов этого раздела, будет показан только вложенный раздел OptionalComponents:
PS> Get-ChildItem HKLM:\Software\Microsoft\Windows\CurrentVersion\Run
   Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\Micros
oft\Windows\CurrentVersion\Run
SKC  VC Name                           Property
---  -- ----                           --------
  3   0 OptionalComponents             {}	

Несмотря на то, что было бы удобно рассматривать записи реестра как элементы, нельзя указать путь к записи реестра таким образом, чтобы обеспечить его уникальность. Обозначение пути не позволяет различить вложенные разделы реестра с именем Run и записи реестра (Default) во вложенном разделе Run. К тому же, поскольку имена записей реестра могут содержать знак обратной косой черты (\), если бы записи реестра были элементами, то обозначение пути Windows\CurrentVersion\Run было бы неотличимо от вложенного раздела, который расположен по этому пути.
Переименование существующих элементов (командлет Rename-Item)
Чтобы переименовать файл или папку, используйте командлет Rename-Item. Следующая команда переименовывает файл file1.txt в fileOne.txt.
PS> Rename-Item -Path C:\temp\New.Directory\file1.txt fileOne.txt	

Командлет Rename-Item может переименовать файл или папку, но не может переместить элемент. Следующая команда завершается с ошибкой, поскольку происходит попытка переместить файл из каталога «New.Directory» в каталог «Temp».
PS> Rename-Item -Path C:\temp\New.Directory\fileOne.txt c:\temp\fileOne.txt
Rename-Item : Cannot rename because the target specified is not a path.
At line:1 char:12
+ Rename-Item  <<<< -Path C:\temp\New.Directory\fileOne c:\temp\fileOne.txt	

Перемещение элементов (командлет Move-Item)
Чтобы переместить файл или папку, используйте командлет Move-Item. 
Например, следующая команда перемещает каталог New.Directory из каталога «C:\temp» в корневой каталог диска C: . Чтобы проверить, что элемент был перемещен, включите параметр PassThru в командлет Move-Item. Без параметра Passthru командлет Move-Item не показывает сообщения о результатах.
PS> Move-Item -Path C:\temp\New.Directory -Destination C:\ -PassThru

    Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2006-05-18  12:14 PM            New.Directory	

Копирование элементов (командлет Copy-Item)
При наличии знакомства с операциями копирования других оболочек поведение командлета Copy-Item в Windows PowerShell может показаться необычным. При копировании элемента из одного места в другое командлет Copy-Item по умолчанию не копирует его содержимое.
Например, при копировании каталога New.Directory из диска C: в каталог «C:\temp» команда выполняется успешно, но файлы каталога «New.Directory» не копируются.
PS> Copy-Item -Path C:\New.Directory -Destination C:\temp	

Если вывести содержимое папки C:\temp\New.Directory, станет видно, что файлы в ней отсутствуют:
PS> Get-ChildItem -Path C:\temp\New.Directory
PS>	

Почему же командлет Copy-Item не копирует содержимое каталога в новое местоположение?
Командлет Copy-Item был разработан как универсальный; он служит не только для копирования файлов и папок. Также даже при копировании файлов или папок может возникнуть необходимость скопировать только контейнер без содержащихся в нем элементов.
Чтобы скопировать все содержимое папки, включите в командлет Copy-Item параметр Recurse. Если каталог уже скопирован без содержимого, добавьте параметр Force, что позволит переписать пустую папку.
PS> Copy-Item -Path C:\New.Directory -Destination C:\temp -Recurse -Force -Passthru
    Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\temp

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2006-05-18   1:53 PM            New.Directory

    Directory: Microsoft.Windows PowerShell.Core\FileSystem::C:\temp\New.Directory

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2006-05-18  11:44 AM          0 file1	

Удаление элементов (командлет Remove-Item)
Чтобы удалить файл или папку, используйте командлет Remove-Item. Командлеты Windows PowerShell, такие как Remove-Item, которые могут внести значительные неисправимые изменения, будут часто запрашивать подтверждение на выполнение команд. Например, при перемещении папки New.Directory будет предложено подтвердить команду, поскольку папка содержит файлы:
PS> Remove-Item C:\New.Directory

Confirm
The item at C:\temp\New.Directory has children and the -recurse parameter was not
specified. If you continue, all children will be removed with the item. Are you
 sure you want to continue?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help
(default is "Y"):	

Поскольку Да является ответом по умолчанию, чтобы удалить папку и ее файлы, нажмите клавишу ВВОД. Чтобы удалить папку без подтверждения, используйте параметр -Recurse.
PS> Remove-Item C:\temp\New.Directory -Recurse	

Выполнение действий над элементами (командлет Invoke-Item)
Windows PowerShell использует командлет Invoke-Item для выполнения действия по умолчанию для файла или папки. Это действие по умолчанию определяется указанным в реестре обработчиком приложения по умолчанию; производимый результат соответствует результату двойного щелчка элемента в проводнике Windows.
Предположим, что выполнена следующая команда:
PS> Invoke-Item C:\WINDOWS	

В результате будет отображено окно проводника с текущей папкой «C:\Windows», как будто была дважды щелкнута папка «C:\Windows».
Если файл Boot.ini вызывается в системе с версией, предшествующей Windows Vista:
PS> Invoke-Item C:\boot.ini	

Если тип файла INI ассоциирован с приложением «Блокнот», файл «boot.ini» открывается в нем.
Работа с объектами
Мы обсудили использование в оболочке Windows PowerShell объектов для передачи данных между командлетами, продемонстрировали несколько способов просмотра подробных сведений об объектах с помощью командлетов Get-Member и Format для просмотра отдельных свойств объектов.
Мощь объектов состоит в том, что они обеспечивают доступ к большому количеству комплексных данных, которые уже взаимосвязаны. Некоторые простые методы позволяют манипулировать объектами более глубоко, что позволяет получить еще более качественные результаты. В этой главе будет рассказано о некоторых специальных типах объектов, а также о способах работы с ними.
Получение объектов WMI (командлет Get-WmiObject)
Получение объектов WMI (командлет Get-WmiObject)
Инструментарий управления Windows (WMI) является ключевой технологией системного администрирования Windows, поскольку она предоставляет широкий спектр сведений в унифицированном виде. Поскольку спектр возможностей WMI достаточно широк, то командлет Windows PowerShell для доступа к объектам WMI Get-WmiObject является одним из наиболее полезных в работе. Мы расскажем о том, как командлет Get-WmiObject обращается к объектам WMI, а после — о том, как использовать объекты WMI для выполнения особых задач.
Вывод списка классов WMI
Первая проблема, с которой сталкивается большинство пользователей WMI, — это выяснение того, что можно сделать с помощью интерфейса WMI. Классы WMI описывают ресурсы, которыми можно управлять. Имеются сотни классов WMI, некоторые из которых содержат множество свойств.
Командлет Get-WmiObject решает эту проблему, представляя сведения об интерфейсе WMI. Список классов WMI, доступных на локальном компьютере, можно получить, введя команду:
PS> Get-WmiObject -List

__SecurityRelatedClass                  __NTLMUser9X
__PARAMETERS                            __SystemSecurity
__NotifyStatus                          __ExtendedStatus
Win32_PrivilegesStatus                  Win32_TSNetworkAdapterSettingError
Win32_TSRemoteControlSettingError       Win32_TSEnvironmentSettingError
...	

Можно извлечь те же сведения на удаленном компьютере, указав в параметре ComputerName имя компьютера или его IP-адрес:
PS> Get-WmiObject -List -ComputerName 192.168.1.29

__SystemClass                           __NAMESPACE
__Provider                              __Win32Provider
__ProviderRegistration                  __ObjectProviderRegistration
...	

Список классов, возвращаемый удаленным компьютером, может различаться в зависимости от операционной системы компьютера и определенных расширений WMI, добавленных установленными приложениями.
Примечание
При использовании командлета Get-WmiObject для подключения к удаленному компьютеру на последнем должен быть запущен интерфейс WMI и используемая учетная запись должна входить в группу локальных администраторов на удаленном компьютере (конфигурация по умолчанию). На удаленной системе может быть не установлена оболочка Windows PowerShell. Это позволяет администрировать операционные системы, на которых не запущена оболочка Windows PowerShell, но имеется интерфейс WMI.
Можно использовать параметр ComputerName при подключении к локальной системе. Можно использовать имя локального компьютера, его IP-адрес (или адрес замыкания на себя 127.0.0.1) либо «.» (в стиле интерфейса WMI) в качестве имени компьютера. Если на компьютере с именем «Admin01» и IP-адресом 192.168.1.90 запущена оболочка Windows PowerShell, следующие команды возвратят список классов WMI для этого компьютера:
Get-WmiObject -List
Get-WmiObject -List -ComputerName .
Get-WmiObject -List -ComputerName Admin01
Get-WmiObject -List -ComputerName 192.168.1.90
Get-WmiObject -List -ComputerName 127.0.0.1
Get-WmiObject -List -ComputerName localhost	

Командлет Get-WmiObject использует по умолчанию пространство имен root/cimv2. Если необходимо указать другое пространство имен WMI, воспользуйтесь параметром Namespace и укажите путь к соответствующему пространству имен:
PS> Get-WmiObject -List -ComputerName 192.168.1.29 -Namespace root

__SystemClass                           __NAMESPACE
__Provider                              __Win32Provider
...	

Вывод сведений о классе WMI
Если имя класса WMI уже известно, можно немедленно получить сведения о нем. Например, одним из классов WMI, используемых для получения сведения о компьютере, является класс Win32_OperatingSystem. 
PS> Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName .

SystemDirectory : C:\WINDOWS\system32
Organization    : Global Network Solutions
BuildNumber     : 2600
RegisteredUser  : Oliver W. Jones
SerialNumber    : 12345-678-9012345-67890
Version         : 5.1.2600	

Хотя показаны все параметры, команда может быть представлена в более короткой форме. Параметр ComputerName не является обязательным при подключении к локальной системе. Мы покажем это, чтобы продемонстрировать наиболее общий случай и напомнить об этом параметре. По умолчанию параметр Namespace имеет значение «root/cimv2» и может быть опущен. В конце концов, большинство командлетов позволяют опускать имя типовых параметров. В командлете Get-WmiObject, если для первого параметра имя не указано, Windows PowerShell считает его параметром Class. Это значит, что последнюю команду можно было ввести в таком виде:
Get-WmiObject Win32_OperatingSystem	

Класс Win32_OperatingSystem имеет больше свойств, чем показано тут. Можно воспользоваться командлетом Get-Member, чтобы показать все свойства. Свойства класса WMI автоматически доступны, как и другие свойства объекта:
PS> Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName . | Get-Member -MemberType Property

   TypeName: System.Management.ManagementObject#root\cimv2\Win32_OperatingSyste
m

Name                                      MemberType Definition
----                                      ---------- ----------
__CLASS                                   Property   System.String __CLASS {...
...
BootDevice                                Property   System.String BootDevic...
BuildNumber                               Property   System.String BuildNumb...
...	

Вывод свойств, не имеющих значений по умолчанию, с помощью командлетов Format
Если необходимо показать сведения, содержащиеся в классе Win32_OperatingSystem, которые не выводятся по умолчанию, можно воспользоваться командлетом Format. Например, если нужно показать сведения о количестве доступной памяти, введите:
PS> Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName . | Format-Table -Property TotalVirtualMemorySize,TotalVisibleMemorySize,FreePhysicalMemory,FreeVirtualMemory,FreeSpaceInPagingFiles

TotalVirtualMemorySize TotalVisibleMem FreePhysicalMem FreeVirtualMemo FreeSpaceInPagi
                              ory              ry         ngFiles
--------------- --------------- --------------- --------------- ---------------
        2097024          785904          305808         2056724         1558232	

Примечание
Подстановочные знаки допускаются в именах свойств в командлете Format-Table, поэтому последний элемент конвейера может быть сокращен до Format-Table -Property TotalV*,Free*.

Сведения о памяти могут быть показаны в более пригодном виде для просмотра, если отформатировать список, выполнив команду:
PS> Get-WmiObject -Class Win32_OperatingSystem -Namespace root/cimv2 -ComputerName . | Format-List TotalVirtualMemorySize,TotalVisibleMemorySize,FreePhysicalMemory,FreeVirtualMemory,FreeSpaceInPagingFiles

TotalVirtualMemorySize : 2097024
TotalVisibleMemorySize : 785904
FreePhysicalMemory     : 301876
FreeVirtualMemory      : 2056724
FreeSpaceInPagingFiles : 1556644	

Создание объектов .NET и COM (командлет New-Object)
Существуют программные компоненты с интерфейсами платформы .NET Framework и COM, которые позволяют выполнять множество задач системного администрирования. Оболочка Windows PowerShell позволяет использовать эти компоненты, поэтому задачи, которые могут быть выполнены, не ограничиваются только использованием командлетов. Большинство командлетов в первом выпуске Windows PowerShell не работают с удаленными компьютерами. Мы покажем, как преодолеть это ограничение при управлении журналами событий с помощью класса.NET System.Diagnostics.EventLog напрямую из оболочки Windows PowerShell.
Использование командлета New-Object для доступа к журналу событий
Библиотека классов платформы .NET Framework включает класс System.Diagnostics.EventLog, который используется для управления журналами событий. Можно создать новый экземпляр класса .NET с помощью командлета New-Object с параметром TypeName. Например, следующая команда создает ссылку на журнал событий:
PS> New-Object -TypeName System.Diagnostics.EventLog

  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----	

Хотя команда и создала экземпляр класса EventLog, этот экземпляр не содержит данных. Это происходит в связи с тем, что не был указан определенный журнал событий. Как получить настоящий журнал событий?
Использование конструкторов с командлетом New-Object
Чтобы обратиться к определенному журналу событий, нужно указать его имя. Командлет New-Object имеет параметр ArgumentList. Значения, передаваемые в этом параметре, используются специальным методом запуска объекта. Этот метод называет конструктором, поскольку используется для создания объекта. Например, чтобы получить ссылку на журнал приложений, нужно указать строку «Application» в качестве аргумента:
PS> New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application

Max(K) Retain OverflowAction        Entries Name
------ ------ --------------        ------- ----
16,384      7 OverwriteOlder          2,160 Application	

Примечание
Поскольку основные классы платформы .NET содержатся в пространстве имен System, оболочка Windows PowerShell автоматически ищет указанные классы в пространстве имен System, если не сможет найти совпадений для указанного имени типа. Это значит, что можно указать класс Diagnostics.EventLog вместо класса System.Diagnostics.EventLog.
Сохранение объектов в переменных
Может понадобиться сохранить ссылку на объект для использования во время сеанса Windows PowerShell. Хотя оболочка Windows PowerShell позволяет выполнять больше задач с помощью конвейеров, что снижает необходимость в переменных, иногда сохранение ссылок на объекты в переменных позволяет работать с объектами с большим удобством.
Windows PowerShell позволяет создавать переменные, которые, по сути, являются именованными объектами. Вывод любой допустимой команды Windows PowerShell можно сохранить в переменной. Имена переменных всегда начинаются с знака «$». Если нужно сохранить ссылку на журнал приложений в переменной с именем $AppLog, введите имя переменной, знак равенства и команду, используемую для создания объекта журнала приложения:
PS> $AppLog = New-Object -TypeName System.Diagnostics.EventLog -ArgumentList Application	

Если после этого набрать $AppLog, будет выведено содержимое журнала приложения:
PS> $AppLog

  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----
  16,384      7 OverwriteOlder          2,160 Application	

Доступ к удаленному журналу событий с помощью командлета New-Object
Команды, рассмотренные в предыдущем разделе, обращаются к локальному компьютеру. Это возможно также с помощью командлета Get-EventLog. Чтобы получить доступ к журналу приложения на удаленном компьютере, необходимо в качестве аргументов ввести имя входа и имя (или IP-адрес) компьютера.

PS> $RemoteAppLog = New-Object -TypeName System.Diagnostics.EventLog Application,192.168.1.81
PS> $RemoteAppLog

  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----
     512      7 OverwriteOlder            262 Application	

Какие действия могут быть выполнены с переменной $RemoteAppLog после сохранения в ней ссылки на журнал событий?
Очистка журнала событий методами объектов
Для выполнения тех или иный действий у объектов часто имеются методы. Командлет Get-Member позволяет вывести методы, связанные с объектом. Следующая команда и выделенный фрагмент вывода показывают некоторые методы класса EventLog:
PS> $RemoteAppLog | Get-Member -MemberType Method

   TypeName: System.Diagnostics.EventLog

Name                      MemberType Definition
----                      ---------- ----------
...
Clear                     Method     System.Void Clear()
Close                     Method     System.Void Close()
...
GetType                   Method     System.Type GetType()
...
ModifyOverflowPolicy      Method     System.Void ModifyOverflowPolicy(Overfl...
RegisterDisplayName       Method     System.Void RegisterDisplayName(String ...
...
ToString                  Method     System.String ToString()
WriteEntry                Method     System.Void WriteEntry(String message),...
WriteEvent                Method     System.Void WriteEvent(EventInstance in...	

Метод Clear() позволяет очистить журнал событий. При вызове метода в командной строке после имени метода обязательно должны следовать скобки, даже если методу не требуются аргументы. Таким образом оболочка Windows PowerShell отличает метод от возможного свойства с таким же именем. Введите следующую строку, чтобы вызвать метод Clear:
PS> $RemoteAppLog.Clear()	

Введите следующую строку, чтобы отобразить журнал. Видно, что журнал событий очищен, и вместо 262 записей не содержит ни одной.
PS> $RemoteAppLog

  Max(K) Retain OverflowAction        Entries Name
  ------ ------ --------------        ------- ----
     512      7 OverwriteOlder              0 Application	

Создание СОМ-объектов с помощью командлета New-Object
Командлет New-Object может использоваться для работы с СОМ-компонентами: от различных библиотек, поставляемых с сервером сценариев Windows (WSH), до приложений ActiveX, таких как Internet Explorer, установленный на большинстве систем.
Командлет New-Object создает СОМ-объекты с помощью вызываемых оболочек среды выполнения NET Framework, вызываемых во время выполнения, поэтому на командлет распространяются такие же ограничения, какие действуют для платформы .NET во время вызова СОМ-объектов. Чтобы создать СОМ-объект, необходимо задать параметр ComObject для программного идентификатора (ProgId) желаемого класса СОМ-объекта. Подробное обсуждение ограничений использования СОМ-объектов и определение доступных в системе программных идентификаторов выходит за рамки данного руководства, но с оболочкой Windows PowerShell может использоваться большинство хорошо известных объектов из таких сред, как WHS.
Объекты среды WSH могут быть созданы заданием следующих программных идентификаторов: WScript.Shell, WScript.Network, Scripting.Dictionary и Scripting.FileSystemObject. Приведенные ниже команды создают эти объекты:
New-Object -ComObject WScript.Shell
New-Object -ComObject WScript.Network
New-Object -ComObject Scripting.Dictionary
New-Object -ComObject Scripting.FileSystemObject	

Несмотря на то, что функциональность этих классов в большой степени может быть реализована другими способами в оболочке Windows PowerShell, некоторые действия (например создание ярлыков) проще выполнить с использованием классов WSH.
Создание ярлыков на рабочий стол с помощью метода WScript.Shell
Одной из функций, быстро выполняемых с помощью СОМ-объектов, является создание ярлыков. Допустим, на рабочем столе требуется создать ярлык для корневой папки Windows PowerShell. Сначала необходимо создать ссылку на объект WScript.Shell и сохранить ее в переменной $WshShell:
$WshShell = New-Object -ComObject WScript.Shell	

Командлет Get-Member работает и с СОМ-объектами, поэтому элементы объекта можно исследовать, если ввести следующее:
PS> $WshShell | Get-Member

   TypeName: System.__ComObject#{41904400-be18-11d3-a28b-00104bd35090}

Name                     MemberType            Definition
----                     ----------            ----------
AppActivate              Method                bool AppActivate (Variant, Va...
CreateShortcut           Method                IDispatch CreateShortcut (str...
...	

Примечание
У командлета Get-Member имеется необязательный параметр InputObject, который можно использовать вместо конвейеризации для обеспечения входных данных для командлета Get-Member. В примере выше при использовании команды Get-Member -InputObject $WshShell выводимые данные были бы абсолютно такими же. При использовании параметра InputObject командлет обрабатывает свои аргументы как одно целое. Это означает, что если в переменной содержится несколько объектов, командлет Get-Member обрабатывает их как массив объектов. Например:
PS> $a = 1,2,"three"
PS> Get-Member -InputObject $a

   TypeName: System.Object[]

Name               MemberType    Definition
----               ----------    ----------
Count              AliasProperty Count = Length

...
Метод WScript.Shell CreateShortcut допускает использование одного аргумента — пути к создаваемому файлу ярлыка. Можно указать полный путь к рабочему столу, но существует и более простой способ. Рабочий стол обычно представлен папкой с именем Desktop внутри домашней папки текущего пользователя. В Windows PowerShell имеется переменная $Home, в которой содержится путь к этой домашней папке. Таким образом, путь к домашней папке может быть задан указанием этой переменной, после чего нужно ввести только имя папки Desktop и имя создаваемого ярлыка:
$lnk = $WshShell.CreateShortcut("$Home\Desktop\PSHome.lnk")	

Примечание 
Если похожая на переменную строка заключена в двойные кавычки, Windows PowerShell пытается заменить ее подходящим значением. При использовании одиночных кавычек значение переменной не подставляется. Для сравнения попробуйте ввести следующие команды:
PS> "$Home\Desktop\PSHome.lnk"
C:\Documents and Settings\aka\Desktop\PSHome.lnk
PS> '$Home\Desktop\PSHome.lnk'
$Home\Desktop\PSHome.lnk

Итак, в переменной $lnk теперь хранится новая ссылка-ярлык. Чтобы просмотреть элементы переменной, ее можно передать по конвейеру командлету Get-Member. Выводимые данные (см. ниже) показывают все элементы, необходимые, чтобы завершить создание ярлыка: 
PS> $lnk | Get-Member

   TypeName: System.__ComObject#{f935dc23-1cf0-11d0-adb9-00c04fd58a0b}

Name             MemberType   Definition
----             ----------   ----------
...
Save             Method       void Save ()
...
TargetPath       Property     string TargetPath () {get} {set}
...
Осталось определить свойство TargetPath, указывающее путь к папке Windows PowerShell, и вызвать метод Save, чтобы сохранить ярлык $lnk. Путь к папке Windows PowerShell хранится в переменной $PSHome, поэтому свойство можно задать следующим образом:
$lnk.TargetPath = $PSHome
$lnk.Save()
Запуск приложения Internet Explorer из Windows PowerShell
С помощью СОМ-объектов можно автоматизировать многие приложения (включая семейство приложений Microsoft Office и Internet Explorer). На примере Internet Explorer можно рассмотреть некоторые типичные технические приемы и тонкости, связанные с работой приложений, основанных на СОМ-технологии.
Экземпляр Internet Explorer создается указанием программного идентификатора этого приложения, InternetExplorer.Application:
$ie = New-Object -ComObject InternetExplorer.Application	

Эта команда запускает приложение Internet Explorer, но не отображает его. Если запустить командлет Get-Process, то можно увидеть выполняющийся процесс по имени iexplore. Причем после выхода из оболочки Windows PowerShell выполнение этого процесса будет продолжаться. Чтобы завершить процесс iexplore, необходимо перезагрузить компьютер или воспользоваться средством типа диспетчера задач.
Примечание
СОМ-объекты, запускаемые в виде отдельных процессов, обычно называются исполняемыми элементами ActiveX. При их запуске окно пользовательского интерфейса отображается не всегда. Если окно создается, но не отображается, как в случае с приложением Internet Explorer, фокус обычно перемещается на рабочий стол Windows, и для взаимодействия с окном его необходимо сделать видимым.
С помощью строки $ie | Get-Member можно получить список свойств и методов приложения Internet Explorer. Чтобы отобразить окно приложения Internet Explorer, свойству Visible нужно присвоить значение $true:
$ie.Visible = $true	

После этого можно перейти к какому-либо веб-адресу, используя метод Navigate:
$ie.Navigate("http://www.microsoft.com/technet/scriptcenter/default.mspx")	

Другие элементы объектной модели Internet Explorer позволяют получить текстовое содержание веб-страниц. Следующая команда отображает HTML-текст в теле текущей веб-страницы:
$ie.Document.Body.InnerText	

Чтобы закрыть приложение Internet Explorer из оболочки PowerShell, необходимо вызвать метод Quit():
$ie.Quit()	

Это приведет к закрытию приложения. В переменной $ie действительная ссылка больше не содержится, даже если она отображается как СОМ-объект. Попытка использования этой переменной приводит к ошибке автоматизации:
PS> $ie | Get-Member
Get-Member : Исключение при извлечении строкового представления для свойства "Application" : "Вызванный объект был отключен от клиентов. (Exception
from HRESULT: 0x80010108 (RPC_E_DISCONNECTED))"
В строке:1 знак:16
+ $ie | Get-Member <<<<	

В этой ситуации можно либо удалить оставшуюся ссылку, присвоив переменной нулевое значение $ie = $null, либо полностью удалить переменную:
Remove-Variable ie	

Примечание
Для исполняемых элементов ActiveX нет общего стандарта, по которому выполнение их процессов завершается или продолжается после удаления ссылки на них. Выход из приложения зависит от обстоятельств (видимо ли приложение, открыт ли в нем какой-либо отредактированный документ, а также продолжается ли выполнение программы Windows PowerShell). По этой причине требуется проверка поведения при завершении работы каждого исполняемого элемента ActiveX, используемого в оболочке Windows PowerShell.
Получение предупреждений о вызываемых .NET объектах COM
В некоторых случаях у СОМ-объекта имеется соответствующая вызываемая оболочка среды выполнения .NET, вызываемая во время выполнения (RCW), и именно он используется командлетом New-Object. Поведение упаковщика RCW может отличаться от поведения обычного СОМ-объекта, поэтому у командлета New-Object имеется параметр Strict, используемый для предупреждения о доступе к RCW. Если указать параметр Strict, после чего создать СОМ-объект, использующий оболочку RCW, будет получено предупреждающее сообщение:
PS> $xl = New-Object -ComObject Excel.Application -Strict
New-Object : Объект, записанный в конвейер, является экземпляром типа
"Microsoft.Office.Interop.Excel.ApplicationClass" из основной сборки inter
op компонента. Если данным типом отображаются элементы, отличные от элементов
IDispatch, сценарии, написанные для работы с этим объектом, могут работать
неправильно без установки основной сборки interop.
В строке:1 знак:17
+ $xl = New-Object  <<<< -ComObject Excel.Application -Strict	

Объект создается, но предупреждение сообщает о том, что этот объект не является стандартным СОМ-объектом.
Использование статических классов и методов
Не все классы .NET Framework можно создать с помощью командлета New-Object. Например, попытка создания объектов System.Environment или System.Math с помощью командлета New-Object приведет к следующему сообщению об ошибке:
PS> New-Object System.Environment
New-Object : Конструктор не найден. Не удается найти соответствующий
конструктор для типа System.Environment.
В строке:1 знак:11
+ New-Object  <<<< System.Environment
PS> New-Object System.Math
New-Object : Конструктор не найден. Не удается найти соответствующий
конструктор для типа System.Math.
В строке:1 знак:11
+ New-Object  <<<< System.Math	

Ошибка происходит, потому что невозможно создать новые объекты из этих классов. Классы являются библиотеками ссылок для методов и свойств, не изменяющих свое состояние. Нет необходимости в их создании — их можно просто использовать. Классы и методы, подобные этим, называются статическими классами, поскольку они не создаются, не уничтожаются и не изменяются. Для пояснения будет предоставлено несколько примеров использования статических классов.
Получение сведений о среде с помощью класса System.Environment
Обычно при работе с объектом в оболочке Windows PowerShell в первую очередь используется командлет Get-Member, чтобы просмотреть элементы объекта. Для статических классов эта процесс выглядит несколько иначе, поскольку класс не является объектом как таковым.
Ссылки на статический класс System.Environment
Обращение к статическому классу возможно при заключении имени класса в квадратные скобки. Например, ссылка на System.Environment состоит из имени класса внутри скобок. Такая команда приводит к выводу общих сведений:
PS> [System.Environment]

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    Environment                              System.Object	

Примечание 
Как было отмечено ранее, при использовании командлета New-Object оболочка Windows PowerShell автоматически подразумевает наличие определения «System.» в имени. То же самое происходит при заключении имени в скобки, поэтому ссылку [System.Environment] записать просто как [Environment].
В классе System.Environment содержатся общие данные о рабочей среде текущего процесса, то есть процесса powershell.exe, при работе в оболочке Windows PowerShell.
Если для просмотра подробных сведений об этом классе вводится команда [System.Environment] | Get-Member, то будет сообщен тип объекта System.RuntimeType, а не System.Environment:
PS> [System.Environment] | Get-Member

   TypeName: System.RuntimeType	

Для просмотра статических элементов с помощью командлета Get-Member необходимо указать параметр Static:
PS> [System.Environment] | Get-Member -Static

   TypeName: System.Environment

Name                       MemberType Definition
----                       ---------- ----------
Equals                     Method     static System.Boolean Equals(Object ob...
Exit                       Method     static System.Void Exit(Int32 exitCode)
...
CommandLine                Property   static System.String CommandLine {get;}
CurrentDirectory           Property   static System.String CurrentDirectory ...
ExitCode                   Property   static System.Int32 ExitCode {get;set;}
HasShutdownStarted         Property   static System.Boolean HasShutdownStart...
MachineName                Property   static System.String MachineName {get;}
NewLine                    Property   static System.String NewLine {get;}
OSVersion                  Property   static System.OperatingSystem OSVersio...
ProcessorCount             Property   static System.Int32 ProcessorCount {get;}
StackTrace                 Property   static System.String StackTrace {get;}
SystemDirectory            Property   static System.String SystemDirectory {...
TickCount                  Property   static System.Int32 TickCount {get;}
UserDomainName             Property   static System.String UserDomainName {g...
UserInteractive            Property   static System.Boolean UserInteractive ...
UserName                   Property   static System.String UserName {get;}
Version                    Property   static System.Version Version {get;}
WorkingSet                 Property   static System.Int64 WorkingSet {get;}
TickCount                               ExitCode	

После этого свойства класса System.Environment можно выбрать для просмотра.
Отображение статических свойств класса System.Environment
Свойства класса System.Environment являются статическими, как и сам класс, и способ их задания отличается от указания обычных свойств. Знак «::» используется для указания оболочке Windows PowerShell, что работа ведется со статическими методами или свойствами. Чтобы увидеть команду, используемую для запуска Windows PowerShell, следует проверить свойство CommandLine:
PS> [System.Environment]::Commandline
"C:\Program Files\Windows PowerShell\v1.0\powershell.exe"	

Чтобы проверить версию операционной системы, следует отобразить свойство OSVersion:
PS> [System.Environment]::OSVersion

           Platform ServicePack         Version             VersionString
           -------- -----------         -------             -------------
            Win32NT Service Pack 2      5.1.2600.131072     Microsoft Window...	

Проверить, не находится ли компьютер в процессе выключения, позволяет свойство HasShutdownStarted:
PS> [System.Environment]::HasShutdownStarted
False  	

Вычислительные действия с помощью класса System.Math
Статический класс System.Math используется для выполнения некоторых математических вычислений. Большинсто важных элементов класса System.Math являются методами, которые можно вывести командлетом Get-Member.
Примечание
В классе System.Math содержится несколько методов, которые имеют одинаковые названия, но отличаются типом своих параметров.
Чтобы вывести список методов класса System.Math, введите следующую команду:
PS> [System.Math] | Get-Member -Static -MemberType Methods

   TypeName: System.Math

Name            MemberType Definition
----            ---------- ----------
Abs             Method     static System.Single Abs(Single value), static Sy...
Acos            Method     static System.Double Acos(Double d)
Asin            Method     static System.Double Asin(Double d)
Atan            Method     static System.Double Atan(Double d)
Atan2           Method     static System.Double Atan2(Double y, Double x)
BigMul          Method     static System.Int64 BigMul(Int32 a, Int32 b)
Ceiling         Method     static System.Double Ceiling(Double a), static Sy...
Cos             Method     static System.Double Cos(Double d)
Cosh            Method     static System.Double Cosh(Double value)
DivRem          Method     static System.Int32 DivRem(Int32 a, Int32 b, Int3...
Equals          Method     static System.Boolean Equals(Object objA, Object ...
Exp             Method     static System.Double Exp(Double d)
Floor           Method     static System.Double Floor(Double d), static Syst...
IEEERemainder   Method     static System.Double IEEERemainder(Double x, Doub...
Log             Method     static System.Double Log(Double d), static System...
Log10           Method     static System.Double Log10(Double d)
Max             Method     static System.SByte Max(SByte val1, SByte val2), ...
Min             Method     static System.SByte Min(SByte val1, SByte val2), ...
Pow             Method     static System.Double Pow(Double x, Double y)
ReferenceEquals Method     static System.Boolean ReferenceEquals(Object objA...
Round           Method     static System.Double Round(Double a), static Syst...
Sign            Method     static System.Int32 Sign(SByte value), static Sys...
Sin             Method     static System.Double Sin(Double a)
Sinh            Method     static System.Double Sinh(Double value)
Sqrt            Method     static System.Double Sqrt(Double d)
Tan             Method     static System.Double Tan(Double a)
Tanh            Method     static System.Double Tanh(Double value)
Truncate        Method     static System.Decimal Truncate(Decimal d), static...	

В этом списке отображено несколько математических методов. Ниже приводится список команд, демонстрирующих работу некоторых общеупотребительных методов:
PS> [System.Math]::Sqrt(9)
3
PS> [System.Math]::Pow(2,3)
8
PS> [System.Math]::Floor(3.3)
3
PS> [System.Math]::Floor(-3.3)
-4
PS> [System.Math]::Ceiling(3.3)
4
PS> [System.Math]::Ceiling(-3.3)
-3
PS> [System.Math]::Max(2,7)
7
PS> [System.Math]::Min(2,7)
2
PS> [System.Math]::Truncate(9.3)
9
PS> [System.Math]::Truncate(-9.3)
-9	

Удаление объектов из конвейера (командлет Where-Object)
В оболочке Windows PowerShell часто создается и передается на конвейер большее количество объектов, чем требуется. Чтобы указать свойства конкретного объекта, которые требуется отобразить, можно воспользоваться командлетом Format, но это не позволяет решить проблему удаления с экрана всех объектов. Может возникнуть необходимость отфильтровать объекты до достижения конца конвейера, чтобы выполнить те или иные действия только на подмножестве объектов, созданных изначально.
В оболочке Windows PowerShell имеется командлет Where-Object, позволяющий проверить каждый объект, находящийся в конвейере, и передать его дальше по конвейеру, только если объект удовлетворяет условиям проверки. Объекты, не прошедшие проверку, удаляются из конвейера. Условия проверки передаются в виде значения параметра Where-ObjectFilterScript.
Выполнение простых проверок с командлетом Where-Object
Значение свойства FilterScript представляет собой блок сценария — одну или несколько команд Windows PowerShell, заключенные в фигурные скобки {}, — выполняющий проверку, результатом которой могут быть значения «TRUE» или «FALSE». Такие блоки сценариев могут быть очень простыми, но для их создания требуется понимание другого основного понятия Windows PowerShell, а именно операторов сравнения. Оператор сравнения сравнивает элементы, расположенные с обеих сторон оператора. Запись операторов сравнения начинается знаком «-», после которого следует имя оператора. Основные операторы сравнения работают, как правило, с любыми видами объектов. Более сложные операторы сравнения работают только с текстом или массивами.
Примечание
По умолчанию при работе с текстом в оболочке Windows PowerShell операторы сравнения нечувствительны к регистру.
Исходя из соображений синтаксического анализа, знаки, такие как «<», «>» или «=», не используются в качестве операторов сравнения. Вместо этого операторы сравнения записываются в буквенной форме. Основные операторы сравнения перечислены в таблице ниже.

Оператор сравнения	Значение	Пример (возвращается значение «TRUE»)	
-eq	равно	1 -eq 1	
-ne	не равно	1 -ne 2	
-lt	меньше, чем	1 -lt 2	
-le	меньше или равно	1 -le 2	
-gt	больше, чем	2 -gt 1	
-ge	больше или равно	2 -ge 1	
-like	сравнение на совпадение с учетом подстановочного знака в тексте	"file.doc" -like "f*.do?"	
-notlike	сравнение на несовпадение с учетом подстановочного знака в тексте	"file.doc" -notlike "p*.doc"	
-contains	содержит	1,2,3 -contains 1	
-notcontains	не содержит	1,2,3 -notcontains 4	

В блоках сценариев командлета Where-Object для обращения к текущему объекту конвейера используется специальная переменная «$_». Ниже приведен пример использования этой переменной. Если в списке содержатся числа и требуется вернуть только те из них, которые меньше 3, то в командлете Where-Object можно настроить фильт для чисел:
PS> 1,2,3,4 | Where-Object -FilterScript {$_ -lt 3}
1
2	

Фильтрация данных, основанная на свойствах объектов
Поскольку переменная $_ обращается к текущему объекту конвейера, то для выполнения проверок можно получить доступ к ее свойствам.
Например, в WMI можно просмотреть класс Win32_SystemDriver. В какой-то конкретной системе могут содержаться сотни системных драйверов, но для проверки необходим определенный набор системных драйверов — таких, которые запущены в данный момент. Если для просмотра объектов класса Win32_SystemDriver использовать командлет Get-Member (Get-WmiObject -Class Win32_SystemDriver | Get-Member -MemberType Property), то можно увидеть, что свойство State принимает значение «Running», когда драйвер запущен. Таким образом, отфильтровать системные драйверы и выбирать только запущенные можно с помощью строки:
Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"}	

В результате будет получен длинный список. Отфильтровать эти драйверы и выбирать только такие, запуск которых выполняется автоматически, можно проверкой значения свойства StartMode:
PS> Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"} | Where-Object -FilterScript {$_.StartMode -eq "Auto"}

DisplayName : RAS Asynchronous Media Driver
Name        : AsyncMac
State       : Running
Status      : OK
Started     : True

DisplayName : Audio Stub Driver
Name        : audstub
State       : Running
Status      : OK
Started     : True	

Результат выполнения этой команды содержит много ненужных сведений, поскольку драйверы, запущенные в данный момент, уже известны. В действительности, из всех сведений на данном этапе требуется отобразить только имя и отображаемое имя драйвера. Следующая команда включает только эти два свойства, что приводит к более простым выводимым данным:
PS> Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"} | Where-Object -FilterScript {$_.StartMode -eq "Manual"} | Format-Table -Property Name,DisplayName

Name                                    DisplayName
----                                    -----------
AsyncMac                                RAS Asynchronous Media Driver
Fdc                                     Floppy Disk Controller Driver
Flpydisk                                Floppy Disk Driver
Gpc                                     Generic Packet Classifier
IpNat                                   IP Network Address Translator
mouhid                                  Mouse HID Driver
MRxDAV                                  WebDav Client Redirector
mssmbios                                Microsoft System Management BIOS Driver	

Приведенная выше команда содержит два элемента Where-Object, но их можно объединить в один, используя знак «-» и логический оператор:
Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript { ($_.State -eq "Running") -and ($_.StartMode -eq "Manual") } | Format-Table -Property Name,DisplayName	

Стандартные логические операторы перечислены в следующей таблице.

Логический оператор	Значение	Пример (возвращается значение «TRUE»)	
-and	Логическое «И»; возвращается значение «TRUE», если оба операнда принимают значение «TRUE»	(1 -eq 1) -and (2 -eq 2)	
-or	Логическое «ИЛИ»; возвращается значение «TRUE», если один из операндов принимает значение «TRUE»	(1 -eq 1) -or (1 -eq 2)	
-not	Логическое «НЕ»; изменяет значение («TRUE» или «FALSE») на противоположное	 -not (1 -eq 2)	
!	Логическое «НЕ»; изменяет значение («TRUE» или «FALSE») на противоположное	!(1 -eq 2)	

Повторение действия для нескольких объектов (командлет ForEach-Object)
Командлет ForEach-Object использует блоки сценариев и дескриптор $_ для текущего объекта конвейера, чтобы та или иная команда была выполнена для всех объектов конвейера. Эта возможность позволяет выполнить некоторые сложные действия.
Одним из них является обработка данных с целью повышения их применимости. Например, класс Win32_LogicalDisk из инструментария управления Windows может использоваться для просмотра сведений о свободном месте на каждом локальном диске. Для запрашиваемых данных используется единица измерения байт, что затрудняет чтение.
PS> Get-WmiObject -Class Win32_LogicalDisk

DeviceID     : C:
DriveType    : 3
ProviderName :
FreeSpace    : 50665070592
Size         : 203912880128
VolumeName   : Local Disk	

Значение свойства FreeSpace можно преобразовать в мегабайты, дважды разделив исходное значение на 1024: после первого деления результат будет представлен в килобайтах, после второго — в мегабайтах. Для этого в блоке сценария ForEach-Object нужно ввести:
Get-WmiObject -Class Win32_LogicalDisk | ForEach-Object -Process {($_.FreeSpace)/1024.0/1024.0}
48318.01171875	

К сожалению, теперь с выводимыми данными не связаны никакие метки. Свойства WMI предназначены только для чтения, поэтому нельзя преобразовать непосредственно значение свойства FreeSpace. Если ввести:
Get-WmiObject -Class Win32_LogicalDisk | ForEach-Object -Process {$_.FreeSpace = ($_.FreeSpace)/1024.0/1024.0}	

то будет получено сообщение об ошибке.
"FreeSpace" является свойством ReadOnly.
В строке:1 знак:70
+ Get-WmiObject -Class Win32_LogicalDisk | ForEach-Object -Process {$_.F <<<< r
eeSpace = ($_.FreeSpace)/1024.0/1024.0}	

Реорганизовать данные можно с помощью более сложных методов, но более простым решением является создание нового объекта с помощью командлета Select-Object.
Выделение частей объектов (командлет Select-Object)
Командлет Select-Object позволяет создавать новые объекты Windows PowerShell, которые содержат избранные свойства существующих объектов, используемых при создании новых. Чтобы создать новый объект, который содержит только свойства Name и FreeSpace WMI-класса Win32_LogicalDisk, введите следующее:
PS> Get-WmiObject -Class Win32_LogicalDisk | Select-Object -Property Name,FreeSpace

Name                                    FreeSpace
----                                    ---------
C:                                      50664845312	

После выполнения этой команды нельзя увидеть тип данных; но если результат передать по конвейеру командлету Get-Member после ключевого слова Select-Object, то можно увидеть новый тип объекта PSCustomObject:
PS> Get-WmiObject -Class Win32_LogicalDisk | Select-Object -Property Name,FreeSpace| Get-Member

   TypeName: System.Management.Automation.PSCustomObject

Name        MemberType   Definition
----        ----------   ----------
Equals      Method       System.Boolean Equals(Object obj)
GetHashCode Method       System.Int32 GetHashCode()
GetType     Method       System.Type GetType()
ToString    Method       System.String ToString()
FreeSpace   NoteProperty  FreeSpace=...
Name        NoteProperty System.String Name=C:	

Командлет Select-Object имеет достаточно широкое применение. Одним из примеров является репликация данных, которые затем можно изменить. Таким образом можно решить проблему, рассмотренную в предыдущей главе. Значение свойства FreeSpace вновь созданных объектов можно обновить, и выводимые данные будут содержать описательную метку:
Get-WmiObject -Class Win32_LogicalDisk | Select-Object -Property Name,FreeSpace | ForEach-Object -Process {$_.FreeSpace = ($_.FreeSpace)/1024.0/1024.0; $_}
Name                                                                  FreeSpace
----                                                                  ---------
C:                                                                48317.7265625	

Сортировка объектов
С помощью командлета 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	

Несмотря на длину отображаемого текста, можно увидеть, что элементы с одинаковым состоянием сгруппированы:
Name           State   Started DisplayName
----           -----   ------- -----------
ACPI           Running    True Microsoft ACPI Driver
AFD            Running    True AFD
AmdK7          Running    True AMD K7 Processor Driver
AsyncMac       Running    True RAS Asynchronous Media Driver
...
Abiosdsk       Stopped   False Abiosdsk
ACPIEC         Stopped   False ACPIEC
aec            Stopped   False Microsoft Kernel Acoustic Echo Canceller
...	

Объекты можно отсортировать в обратном порядке, для чего требуется указать параметр Descending. Это изменяет порядок сортировки таким образом, что имена сортируются в обратном алфавитном порядке, а числа — по убыванию.
PS> Get-WmiObject -Class Win32_SystemDriver | Sort-Object -Property State,Name -Descending | Format-Table -Property Name,State,Started,DisplayName -AutoSize -Wrap

Name           State   Started DisplayName
----           -----   ------- -----------
WS2IFSL        Stopped   False Windows Socket 2.0 Non-IFS Service Provider Supp
                               ort Environment
wceusbsh       Stopped   False Windows CE USB Serial Host Driver...
...
wdmaud         Running    True Microsoft WINMM WDM Audio Compatibility Driver
Wanarp         Running    True Remote Access IP ARP Driver
...	

Использование переменных для хранения объектов
Оболочка Windows PowerShell работает с объектами. Программа позволяет создавать переменные — по сути, именованные объекты, — чтобы сохранять в них данные вывода для последующего использования. Пользователям, привыкшим работать с переменными в других оболочках, следует помнить, что в Windows PowerShell переменными является не текст, а объекты.
Имя переменной всегда начинается со знака $ и может содержать любые буквы и цифра, а также знак подчеркивания.
Создание переменной
Чтобы создать переменную, нужно ввести допустимое имя переменной:
PS> $loc
PS>	

Эта команда не приведет ни к какому результату, потому что переменная $loc не имеет значения. Создать переменную и присвоить ей какое-либо значение можно одним действием. Windows PowerShell создает переменную, только если она еще не существует; в противном случае указанное значение присваивается существующей переменной. Для сохранения текущего местоположения в переменной $loc следует ввести:
$loc = Get-Location	

После ввода этой команды ее вывод не отображается, потому что он отправляется в переменную $loc. Отображение вывода в оболочке Windows PowerShell представляет собой побочный эффект отправки данных: если не указано иное направление отправки, то данные всегда отправляются на экран. Чтобы вывести текущее местоположение, нужно ввести имя переменной «$loc»:
PS> $loc

Path
----
C:\temp	

Для отображения сведений о содержимом переменных можно воспользоваться командлетом Get-Member. Передача переменной $loc по конвейеру командлету Get-Member показывает, что это объект класса PathInfo, также как и вывод командлета Get-Location.
PS> $loc | Get-Member -MemberType Property

   TypeName: System.Management.Automation.PathInfo

Name         MemberType Definition
----         ---------- ----------
Drive        Property   System.Management.Automation.PSDriveInfo Drive {get;}
Path         Property   System.String Path {get;}
Provider     Property   System.Management.Automation.ProviderInfo Provider {...
ProviderPath Property   System.String ProviderPath {get;}	

Управление переменными
Для работы с переменными в оболочке Windows PowerShell имеется несколько команд. Полный список команд в удобной для чтения форме можно вывести следующим образом:
Get-Command -Noun Variable | Format-Table -Property Name,Definition -AutoSize -Wrap	

Кроме переменных, создаваемых пользователем в текущем сеансе Windows PowerShell, существует несколько системных переменных. С помощью командлета Remove-Variable можно очистить все переменные, неуправляемые оболочкой Windows PowerShell. Введите следующую команду, чтобы очистить все переменные:
Remove-Variable -Name * -Force -ErrorAction SilentlyContinue	

Это приведет к запросу подтверждения, как показано ниже:
Подтверждение
Вы действительно хотите выполнить это действие?
Выполнение операции "Удаление переменной" над целевым объектом "Name: Error".
[А] Да  [Х] Да для всех  [Н] Нет  [В] Нет для всех  [Т] Приостановить  [?] Справка
(значением по умолчанию является "А"):	

Если после этого запустить командлет Get-Variable, то будут показаны оставшиеся переменные Windows PowerShell. Поскольку в Windows PowerShell имеется еще и переменный диск, все переменные Windows PowerShell можно вывести командой:
Get-ChildItem variable:	

Использование переменных Cmd.exe
Оболочка Windows PowerShell не является командной оболочкой Windows, запускаемой файлом Cmd.exe, но несмотря на это Windows PowerShell выполняется в среде командной оболочки, и может работать со всеми переменными, доступными в любой среде операционной системы Windows. Такие переменные передаются через диск с именем env:. Просмотреть переменные можно с помощью команды:
Get-ChildItem env:	

Несмотря на то, что стандартные командлеты не предназначены для работы с переменными диска env:, эти переменные могут использоваться при указании префикса env:. Например, чтобы показать корневой каталог операционной системы, в Windows PowerShell можно использовать переменную%SystemRoot% командной оболочки:
PS> $env:SystemRoot
C:\WINDOWS	

Создавать и изменять переменные среды можно также в оболочке Windows PowerShell. Переменные среды, доступные в оболочке Windows PowerShell, соответствуют обычным правилам для переменных любой другой среды Windows.
Использование оболочки Windows PowerShell для администрирования
Основное предназначение оболочки Windows PowerShell — это предоставление удобного и простого административного управления другими системами в интерактивной форме или из сценариев. В этой главе описаны решения многих специфичных проблем, связанных с администрированием систем Windows через оболочку Windows PowerShell. Несмотря на то, что сценарии и функции еще не были рассмотрены в руководстве по Windows PowerShell, описываемые решения могут быть использованы в сценариях или функциях позднее. Далее приводятся примеры, в которых функции представляют часть решения проблемы.
В описаниях встретится ряд решений, в которых используются особенные командлеты, общий командлет Get-WmiObject и даже внешние средства, являющиеся частью инфраструктур Windows и .NET. Использование внешних средств — часть идеи перспективного проектирования оболочки Windows PowerShell. Даже при росте системы пользователи будут постоянно сталкиваться с ситуациями, в которых имеющиеся наборы средств не могут выполнить поставленные задачи. Вместо того чтобы в будущем полагаться на разработку командлетов как таковых, разработчики оболочки Windows PowerShell стараются поддержать интеграцию решений из всех возможных альтернативных сценариев.
Управление локальными процессами
Существует только два основных Process-командлета: Get-Process и Stop-Process. Проверку и фильтрацию процессов можно осуществлять, используя параметры или командлеты Object, поэтому для выполнения некоторых сложных действий достаточно двух упомянутых выше командлетов.
Перечисление процессов (командлет Get-Process)
Список всех процессов, выполняемых в локальной системе, можно получить запуском командлета Get-Process без параметров.
Указав идентификатор процесса (параметр Id), можно вывести один отдельный процесс. В следующем процессе показывается вывод индикатора бездействия системы:
PS> Get-Process -Id 0
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
      0       0        0         16     0               0 Idle	

Несмотря на то, что для командлетов является обычным не возвращать данные в некоторых ситуациях, когда процесс задается через ProcessId, командлет Get-Process возвращает ошибку, если совпадений не обнаружится, потому что преполагается получение известного выполняемого процесса. Если процесс с указанным идентификатором не найден, вполне вероятно, что идентификатор задан неверно или искомый процесс был завершен.
PS> Get-Process -Id 99
Get-Process : Не удается найти процесс с идентификатором процесса 99.
В строке:1 знак:12
+ Get-Process  <<<< -Id 99	

Параметр Name позволяет задать подмножество процессов, основанных на указанном имене процесса. Имена процессов могут совпадать, поэтому в выхоных данных может содержаться более одного процесса. Если процесса с таким именем не обнаружено, командлет Get-Process возвращает ошибку, также как и в случае с указанным идентификатором процесса. Например, если вместо правильного имени процесса explorer указать explore:
PS> Get-Process -Name explore
Get-Process : е удается найти процесс с именем 'explore'.
В строке:1 знак:12
+ Get-Process  <<<< -Name explore	

Параметр Name поддерживает использование подстановочных знаков, поэтому, чтобы получить список, можно ввести первые несколько знаков имени с последующей звездочкой (*):
PS> Get-Process -Name ex*
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    234       7     5572      12484   134     2.98   1684 EXCEL
    555      15    34500      12384   134   105.25    728 explorer	

Примечание
Класс .NET System.Diagnostics.Process является основой процессов оболочки Windows PowerShell, поэтому на него распространяются некоторые правила, действительные для System.Diagnostics.Process. Согласно одному из этих правил, имя процесса исполняемого элемента не должно содержать расширение ЕХЕ в конце имени элемента.

Командлет Get-Process позволяет указывать несколько значений параметра Name. Так же, как и при указании одного значения, при отсутствии совпадений с указанным именем будет выведено сообщение об ошибке, а для процессов, соответствующих указанным параметрам, будут получены обычные данные.
PS> Get-Process -Name exp*,power*,NotAProcess
Get-Process : Не удается найти процесс с именем 'NotAProcess'.
В строке:1 знак:12
+ Get-Process  <<<< -Name exp*,power*,svchost,NotAProcess
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    540      15    35172      48148   141    88.44    408 explorer
    605       9    30668      29800   155     7.11   3052 powershell	

Остановка процессов (командлет Stop-Process)
Оболочка Windows PowerShell предоставляет различные способы получить список процессов. Каким же образом процессы можно останавливать?
Командлету Stop-Process передается имя (свойство Name) или идентификатор (Id), определяющие процесс, который требуется остановить. Возможность остановки процесса зависит от имеющихся у пользователя разрешений. Некоторые процессы не могут быть остановлены. Например, при попытке остановить процесс бездействия системы, будет получена ошибка:
PS> Stop-Process -Name Idle
Stop-Process : Не удается остановить процесс 'Idle (0)' из-за следующей ошибки:
Отказано в доступе
В строке:1 знак:13
+ Stop-Process  <<<< -Name Idle	

С помощью параметра Confirm можно установить запрос подтверждения. Этот параметр особенно полезен в тех случаях, когда при указании имени процесса используется подстановочный знак: пользователь может случайно остановить некоторые процессы с похожим именем, которые останавливать не надо.
PS> Stop-Process -Name t*,e* -Confirm
Подтверждение
Вы действительно хотите выполнить это действие?
Выполнение операции "Stop-Process" над целевым объектом "explorer (408)".
[А] Да  [Х] Да для всех  [Н] Нет  [В] Нет для всех  [Т] Приостановить  [?] Справка
(значением по умолчанию является "А"):n
Подтверждение
Вы действительно хотите выполнить это действие?
Выполнение операции "Stop-Process" над целевым объектом "taskmgr (4072)".
[А] Да  [X] Да для всех  [Н] Нет  [В] Нет для всех  [Т] Приостановить  [?] Справка
(значением по умолчанию является "А"):	

Сложные действия с процессами выполняются с помощью нескольких командлетов фильтрации объектов. У объекта Process имеется свойство Responding, принимающее значение «TRUE», если объект не реагирует на запросы. Все неотвечающие приложения можно остановить следующей командой:
Get-Process | Where-Object -FilterScript {$_.Responding -eq $false} | Stop-Process	

Тот же подход можно использовать и в других ситуациях. Допустим, приложение вспомогательной панели задач автоматически вызывается, когда пользователь запускает другое приложение. В сеансах службы терминалов это работает неверно, но требуется, чтобы работа сеансов продолжалась на физической консоли компьютера. Сеансы, подключенные к физическому настольному компьютеру, всегда определяются идентификатором сеанса 0, поэтому все экземпляры процесса, принадлежащие другим сеансам, можно остановить с помощью командлета Where-Object и процесса SessionId:
Get-Process -Name BadApp | Where-Object -FilterScript {$_.SessionId -neq 0} | Stop-Process	

Остановка всех других сеансов Windows PowerShell
Иногда становится необходимым остановить все запущенные сеансы Windows PowerShell, кроме текущего. Если в сеансе используется слишком много ресурсов или он недоступен (выполняется удаленно или в другом сеансе рабочего стола), то остановить его напрямую невозможно. Однако при попытке остановить все выполняемые сеансы текущий сеанс может быть просто завершен.
У каждого сеанса Windows PowerShell имеется переменная среды, PID, в которой содержится идентификатор процесса Windows PowerShell. Значение переменной $PID можно проверить на совпадение с идентификаторами всех сеансов и завершить только те сеансы, идентификатор которого отличается от заданного. Это действие представлено следующей командой конвейера, которая возвращает список завершенных сеансов (через параметр PassThru).
PS> Get-Process -Name powershell | Where-Object -FilterScript {$_.Id -ne $PID} | Stop-Process -
PassThru
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    334       9    23348      29136   143     1.03    388 powershell
    304       9    23152      29040   143     1.03    632 powershell
    302       9    20916      26804   143     1.03   1116 powershell
    335       9    25656      31412   143     1.09   3452 powershell
    303       9    23156      29044   143     1.05   3608 powershell
    287       9    21044      26928   143     1.02   3672 powershell	

Управление локальными службами
Существует восемь основных служебных командлетов, разработанных для широкого спектра служебных задач. В разделе будут рассмотрены только перечисление и измененеие состояния служб. Список остальных служебных командлетов можно получить с помощью команды Get-Help *-Service, а дополнительные сведения о каждом командлете выводятся командой Get-Help<Cmdlet-Name>, например Get-Help New-Service.
Перечисление служб
Локальные службы компьютера можно перечислить, используя командлет Get-Service. Как и в случае командлета Get-Process, использование команды Get-Service без параметров выводит все службы. Выводимые данные можно отсортировать по именам, даже при использовании звездочки (*) в качестве подстановочного знака.
PS> Get-Service -Name se*
Status   Name               DisplayName
------   ----               -----------
Running  seclogon           Secondary Logon
Running  SENS               System Event Notification
Stopped  ServiceLayer       ServiceLayer	

Поскольку настоящее имя той или иной службы не всегда очевидо, может потребоваться поиск служб по отображаемым именам. Можно выполнить поиск по определенному имени, с использованием знаков подстановки, или получить список отображаемых имен.
PS> Get-Service -DisplayName se*
Status   Name               DisplayName
------   ----               -----------
Running  lanmanserver       Server
Running  SamSs              Security Accounts Manager
Running  seclogon           Secondary Logon
Stopped  ServiceLayer       ServiceLayer
Running  wscsvc             Security Center
PS> Get-Service -DisplayName ServiceLayer,Server
Status   Name               DisplayName
------   ----               -----------
Running  lanmanserver       Server
Stopped  ServiceLayer       ServiceLayer	

Остановка, запуск, приостановка и перезагрузка служб
Все служебные командлеты представлены в одной и той же общей форме. В качестве значений для указания служб могут быть использованы их общие или отображаемые имена, а также списки и подстановочные знаки. Чтобы остановить очередь печати, используйте команду:
Stop-Service -Name spooler	

Чтобы повторно запустить очередь печати принтера после остановки, используйте команду:
Start-Service -Name spooler	

Чтобы приостановить очередь печати, используйте команду:
Suspend-Service -Name spooler	

Командлет Restart-Service работает так же, как другие служебные командлеты, но далее будут представлены более сложные примеры его использования. В самом простом случае использования указывается имя службы:
PS> Restart-Service -Name spooler
ПРЕДУПРЕЖДЕНИЕ: Ожидание завершения запуска службы "Диспетчер очереди печати
(Spooler)"...
ПРЕДУПРЕЖДЕНИЕ: Ожидание завершения запуска службы "Диспетчер очереди печати
(Spooler)"...
PS>	

Обратите внимание на повторяющееся предупреждающее сообщение о запуске очереди печати принтера. При выполнении служебной операции, трубующей некоторого количества времени, Windows PowerShell оповещает о своих попытках выполнить задачу.
Если требуется перезапустить сразу несколько служб, можно создать список служб, отфильтровать его и произвести перезагрузку.
PS> Get-Service | Where-Object -FilterScript {$_.CanStop} | Restart-Service
ПРЕДУПРЕЖДЕНИЕ: Ожидание завершения остановки службы 'Обозреватель (Browser)'
...
ПРЕДУПРЕЖДЕНИЕ: Ожидание завершения остановки службы 'Обозреватель (Browser)'
...
Restart-Service : Не удается остановить службу 'Диспетчер логических дисков
(dmserver)', так как имеются зависимые от нее службы. Эта служба может быть
остановлена только при установке флага Force.
В строке:1 знак:57
+ Get-Service | Where-Object -FilterScript {$_.CanStop} | Restart-Service <<<<
ПРЕДУПРЕЖДЕНИЕ: Ожидание завершения запуска службы "Диспетчер очереди печати
(Spooler)'...
ПРЕДУПРЕЖДЕНИЕ: Ожидание завершения запуска службы "Диспетчер очереди печати
(Spooler)'...	

Получение сведений о компьютерах
Get-WmiObject — это самый важный командлет для общих действий по управлению системой. Все ключевые настройки подсистемы доступны через службу WMI. Более того, служба WMI обрабатывает данные как объекты, сгруппированные в коллекции из одного или нескольких элементов. Поскольку оболочка Windows PowerShell также работает с объектами, в ней имеется конвейер, позволяющий одинаково обрабатывать отдельный объект или несколько объектов, общий доступ к службе WMI предоставляет возможность выполнять некоторые сложные задачи с небольшими затратами усилий.
В следующем примере показано, как собрать определенные сведения, используя командлет Get-WmiObject по отношению к произвольному компьютеру. Значение параметра ComputerName задается точкой (.), представляющей локальный компьютер. Здесь можно указать имя или IP-адрес, связанные с любым компьютером, к которому требуется получить доступ через службу WMI. Чтобы получить сведения о локальном компьютере, параметр ComputerName можно опустить.
Вывод настроек рабочего стола
Для начала рассмотрим команду, собирающую сведения о рабочих столах локального компьютера:
Get-WmiObject -Class Win32_Desktop -ComputerName .	

Эта команда возвращает сведения обо всех рабочих столах, вне зависимости от их использования.
Примечание
Сведения, возвращаемые некоторыми классами WMI, могут быть очень подробными и часто содержат метаданные о классе WMI. Поскольку имена большинства этих свойств метаданных начинаются двойным знаком подчеркивания, эти свойства можно отфильтровать с помощью командлета Select-Object. Чтобы выбрать свойства, начинающиеся с буквы, для параметра Property следует указать [a-z]*. Например:
Get-WmiObject -Class Win32_Desktop -ComputerName . | Select-Object -Property [a-z]*	

Чтобы отфильтровать метаданные, можно воспользоваться оператором конвейера и отправить результаты команды Get-WmiObject командлету Select-Object -Property [a-z]*.
Вывод сведений о BIOS
Класс WMI Win32_BIOS возвращает довольно компактные и полные сведения о системной BIOS локального компьютера.
Get-WmiObject -Class Win32_BIOS -ComputerName .	

Вывод сведений о процессоре
Общие сведения о процессоре можно получить с помощью класса Win32_Processor службы WMI, однако пользователю наверняка потребуется отфильтровать полученные данные.
Get-WmiObject -Class Win32_Processor -ComputerName . | Select-Object -Property [a-z]*	

Чтобы получить общую строку описания семейства процессора, достаточно вернуть свойство Win32_ComputerSystemSystemType:
PS> Get-WmiObject -Class Win32_ComputerSystem -ComputerName . | Select-Object -Property SystemType
SystemType
----------
X86-based PC	

Вывод производителя и модели компьютера
Сведения о модели компьютера так же доступны в классе Win32_ComputerSystem. Чтобы получить данные ОЕМ, стандартный отображаемый вывод фильтровать не нужно.
PS> Get-WmiObject -Class Win32_ComputerSystem
Domain              : WORKGROUP
Manufacturer        : Compaq Presario 06
Model               : DA243A-ABA 6415cl NA910
Name                : MyPC
PrimaryOwnerName    : Jane Doe
TotalPhysicalMemory : 804765696	

Вывод из команд, подобных показанной выше и возвращающих сведения напрямую от аппаратного обеспечения, не может быть дополнен. Иногда сведения неверно сконфигурированы производителем оборудования и недоступны для запроса.
Вывод установленных исправлений
Список всех установленных исправлений можно получить с помощью класса Win32_QuickFixEngineering.
Get-WmiObject -Class Win32_QuickFixEngineering -ComputerName .	

Этот класс возваращает список исправлений, представленный в следующем виде:
Description         : Update for Windows XP (KB910437)
FixComments         : Update
HotFixID            : KB910437
Install Date        :
InstalledBy         : Administrator
InstalledOn         : 12/16/2005
Name                :
ServicePackInEffect : SP3
Status              :	

Для получения более кратких сведений нужно исключить некоторые свойства. Параметр Get-WmiObject Property позволяет выбрать только идентификаторы HotFixID, однако на самом деле выполнение этой команды возвращает больше данных, поскольку по умолчанию отображаются все метаданные.
PS> Get-WmiObject -Class Win32_QuickFixEngineering -ComputerName . -Property HotFixId
HotFixID         : KB910437
__GENUS          : 2
__CLASS          : Win32_QuickFixEngineering
__SUPERCLASS     :
__DYNASTY        :
__RELPATH        :
__PROPERTY_COUNT : 1
__DERIVATION     : {}
__SERVER         :
__NAMESPACE      :
__PATH           :	

Дополнительные данные выводятся, поскольку параметр Property командлета Get-WmiObject ограничивает свойства, возвращаемые из экземпляров класса, но не объекты, возвращаемые оболочке Windows PowerShell. Командлет Select-Object позволяет сократить возвращаемый вывод:
PS> Get-WmiObject -Class Win32_QuickFixEngineering -ComputerName . -Property Hot
FixId | Select-Object -Property HotFixId
HotFixId
--------
KB910437	

Вывод сведений о версии операционной среды
Свойства класса Win32_OperatingSystem включают сведения о версии операционной среды и пакета обновлений. Эти свойства можно выбрать явным образом, чтобы из класса Win32_OperatingSystem получить сводные данные о версиях:
Get-WmiObject -Class Win32_OperatingSystem -ComputerName . | Select-Object -Property BuildNumber,BuildType,OSType,ServicePackMajorVersion,ServicePackMinorVersion	

В параметре Select-Object Property можно использовать подстановочные знаки. Поскольку в рассматриваемом случае важны все свойства, имена которых начинаются с Build либо с ServicePack, указанную строку можно сократить:
PS> Get-WmiObject -Class Win32_OperatingSystem -ComputerName . | Select-Object -Property Build*,OSType,ServicePack*

BuildNumber             : 2600
BuildType               : Uniprocessor Free
OSType                  : 18
ServicePackMajorVersion : 2
ServicePackMinorVersion : 0	

Вывод локальных пользователей и владельца
Общие сведения о локальных пользователях — количество зарегистрированных пользователей, текущее число пользователей и имя владельца — можно получить, выбрав соответствующие свойства класса Win32_OperatingSystem. Отображаемые свойства можно указать явным образом:
Get-WmiObject -Class Win32_OperatingSystem -ComputerName . | Select-Object -Property NumberOfLicensedUsers,NumberOfUsers,RegisteredUser	

В более сжатом варианте используются знаки подстановки:
Get-WmiObject -Class Win32_OperatingSystem -ComputerName . | Select-Object -Property *user*	

Получение сведений о доступном месте на диске
Чтобы получить сведения о дисковом пространстве и свободном месте на всех локальных дисках, можно воспользоваться классом Win32_LogicalDisk службы WMI. Для просмотра следует выбрать только те экземпляры, у которых свойство DriveType принимает значение 3, — значение, используемое службой WMI для постоянных жестких дисков.
Get-WmiObject -Class Win32_LogicalDisk -Filter "DriveType=3" -ComputerName .

DeviceID     : C:
DriveType    : 3
ProviderName :
FreeSpace    : 65541357568
Size         : 203912880128
VolumeName   : Local Disk

DeviceID     : Q:
DriveType    : 3
ProviderName :
FreeSpace    : 44298250240
Size         : 122934034432
VolumeName   : New Volume

PS> Get-WmiObject -Class Win32_LogicalDisk -Filter "DriveType=3" -ComputerName . | Measure-Object -Property FreeSpace,Size -Sum

Get-WmiObject -Class Win32_LogicalDisk -Filter "DriveType=3" -ComputerName . | Measure-Object -Property FreeSpace,Size -Sum | Select-Object -Property Property,Sum	

Получение сведений о сеансах подключения
Общие сведения о сеансах подключения, связанных с пользователями, можно получить через класс Win32_LogonSession службы WMI:
Get-WmiObject -Class Win32_LogonSession -ComputerName .	

Получение сведений о пользователе, подключенном к компьютеру
Имя пользователя, подключенного к определенной компьютерной системе, можно отобразить с помощью класса Win32_ComputerSystem. Приведенная ниже команда возвращает только пользователей, подключенных к рабочему столу системы:
Get-WmiObject -Class Win32_ComputerSystem -Property UserName -ComputerName .	

Получение сведений о местном времени компьютера
Данные о текущем местном времени определенного компьютера можно получить с помощью класса Win32_LocalTime службы WMI. Поскольку этот класс по умолчанию отображает все метаданные, пользователю может потребоваться фильтрация с помощью командлета Select-Object:
PS> Get-WmiObject -Class Win32_LocalTime -ComputerName . | Select-Object -Property [a-z]*

Day          : 15
DayOfWeek    : 4
Hour         : 12
Milliseconds :
Minute       : 11
Month        : 6
Quarter      : 2
Second       : 52
WeekInMonth  : 3
Year         : 2006	

Отображение состояния службы
Для просмотра состояния всех служб на определенном компьютере можно локально воспользоваться командлетом Get-Service, как было показано ранее. Для удаленных систем можно использовать класс Win32_Service службы WMI. Если для получения свойств Status, Name и DisplayName отфильтровать данные с помощью командлета Select-Object, то формат выводимых данных будет почти полностью идентичным формату вывода командлета Get-Service:
Get-WmiObject -Class Win32_Service -ComputerName . | Select-Object -Property Status,Name,DisplayName	

Чтобы полностью отобразить службы с очень длинными именами, может потребоваться использование командлета Format-Table с параметрами AutoSize и Wrap, позволяющими оптимизировать ширину столбцов и переносить длинные имена на следующие строки вместо того, чтобы усекать их.
Get-WmiObject -Class Win32_Service -ComputerName . | Format-Table -Property Status,Name,DisplayName -AutoSize -Wrap	

Установка программного обеспечения
Доступ к приложениям, спроектированным для использования установщика Windows, может быть получен через класс Win32_Product службы WMI, но в настоящее время не все приложения используют установщик Windows. Установщик Windows предоставляет широчайший спектр стандартных методов работы с устанавливаемыми приложениями, поэтому главное внимание будет уделяться именно этим приложениям. Приложения, для которых предусмотрены другие процедуры установки, обычно не управляются установщиком Windows. Особенные способы работы с такими приложениями зависят от программного обеспечения установщика и решений, принятых разработчиками приложений.
Примечание
Использование рассматриваемых способов обычно невозможно для управления приложениями, которые устанавливаются копированием файлов приложения на компьютер. Такие приложения можно обрабатывать как отдельные файлы и папки, используя методы, рассмотренные в разделе «Работа с файлами и папками».

Получение списка приложений, установленных при помощи Windows Installer
Быстро построить список приложений, установленных на локальной или удаленной системе при помощи Windows Installer, позволяет несложный запрос WMI:
PS> Get-WmiObject -Class Win32_Product -ComputerName .
IdentifyingNumber : {7131646D-CD3C-40F4-97B9-CD9E4E6262EF}
Name              : Microsoft .NET Framework 2.0
Vendor            : Microsoft Corporation
Version           : 2.0.50727
Caption           : Microsoft .NET Framework 2.0	

В случаях, когда необходимо получить сведения, не отображаемые по умолчанию, по-прежнему окажется полезным командлет Select-Object. Чтобы узнать расположение кэша пакета Microsoft .NET Framework 2.0, можно воспользоваться следующей командой:
PS> Get-WmiObject -Class Win32_Product -ComputerName . | Where-Object -FilterScript {$_.Name -eq "Microsoft .NET Framework 2.0"} | Select-Object -Property [a-z]*
Name              : Microsoft .NET Framework 2.0
Version           : 2.0.50727
InstallState      : 5
Caption           : Microsoft .NET Framework 2.0
Description       : Microsoft .NET Framework 2.0
IdentifyingNumber : {7131646D-CD3C-40F4-97B9-CD9E4E6262EF}
InstallDate       : 20060506
InstallDate2      : 20060506000000.000000-000
InstallLocation   :
PackageCache      : C:\WINDOWS\Installer\619ab2.msi
SKUNumber         :
Vendor            : Microsoft Corporation	

Чтобы выбрать только Microsoft .NET Framework 2.0, можно также воспользоваться параметром Filter командлета Get-WmiObject. В этой команде использован фильтр WMI, который не следует синтаксису фильтров Windows PowerShell. Вместо этого используется язык запросов WMI (WQL):
Get-WmiObject -Class Win32_Product -ComputerName . -Filter "Name='Microsoft .NET Framework 2.0'"| Select-Object -Property [a-z]*	

Примечание
Запросы WQL часто содержат знаки (например, пробелы и знаки равенства), которые имеют в Windows PowerShell специальное значение. Поэтому рекомендуется всегда заключать значение параметра Filter в кавычки. Может быть использован и управляющий знак Windows PowerShell гравис (`), однако при этом чтение команды становится менее удобным. Следующая команда эквивалентна предыдущей, она возвращает тот же результат, однако вместо заключения всей строки фильтра в кавычки в ней применен специальный управляющий символ гравис.
Get-WmiObject -Class Win32_Product -ComputerName . -Filter Name`=`'Microsoft` .NET` Framework` 2.0`' | Select-Object -Property [a-z]*

Другой способ сокращения вывода состоит в явном выборе формата отображения. Следующий пример отображает некоторые из наиболее полезных свойств, характеризующих отдельные установленные пакеты:
Get-WmiObject -Class Win32_Product -ComputerName . | Format-List Name,InstallDate,InstallLocation,PackageCache,Vendor,Version,IdentifyingNumber
...
Name              : HighMAT Extension to Microsoft Windows XP CD Writing Wizard
InstallDate       : 20051022
InstallLocation   : C:\Program Files\HighMAT CD Writing Wizard\
PackageCache      : C:\WINDOWS\Installer\113b54.msi
Vendor            : Microsoft Corporation
Version           : 1.1.1905.1
IdentifyingNumber : {FCE65C4E-B0E8-4FBD-AD16-EDCBE6CD591F}
...	

Наконец, если необходимо определить только имена установленных приложений, сократить вывод позволит следующая простая инструкция Format-Wide:
Get-WmiObject -Class Win32_Product -ComputerName .  | Format-Wide -Column 1	

Итак, существует несколько способов получения сведений о приложениях, установленных при помощи Windows Installer, однако остальные приложения пока не рассмотрены. Поскольку большинство стандартных приложений регистрирует программу удаления в Windows, их можно найти локально путем поиска программ удаления в реестре Windows.
Получение списка приложений, поддерживающих удаление
Не существует гарантированного способа нахождения всех приложений, установленных в системе, однако можно найти все программы, отображаемые в диалоговом окне «Установка и удаление программ». Диалоговое окно «Установка и удаление программ» находит такие приложения в списке, размещенном в разделе реестра HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall. Этот раздел можно использовать и для самостоятельного поиска приложений. Просмотр раздела Uninstall можно упростить, отобразив соответствующее положение в реестре на диск Windows PowerShell:
PS> New-PSDrive -Name Uninstall -PSProvider Registry -Root HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

Name       Provider      Root                                   CurrentLocation
----       --------      ----                                   ---------------
Uninstall  Registry      HKEY_LOCAL_MACHINE\SOFTWARE\Micr...	

Примечание
Диск HKLM: отображает корневой раздел HKEY_LOCAL_MACHINE, поэтому он и был использован в пути к разделу Uninstall. Вместо диска HKLM: при указании пути в реестре можно использовать разделы HKLM или HKEY_LOCAL_MACHINE. Использование существующего диска реестра удобнее, так как вместо ввода имен разделов вручную позволяет воспользоваться функцией автозавершения по нажатию клавиши TAB.

Созданный диск с именем «Uninstall» делает поиск установленных приложений быстрым и удобным. Число установленных приложений можно определить, подсчитав количество разделов реестра на диске Uninstall: Windows PowerShell:
PS> (Get-ChildItem -Path Uninstall:).Length
459	

Дальнейший поиск в полученном списке приложений осуществляется разнообразными методами, начиная с использования командлета Get-ChildItem. Сохранить список приложений в переменной $UninstallableApplications позволит следующая команда:
$UninstallableApplications = Get-ChildItem -Path Uninstall:	

Примечание
Длинное имя переменной использовано здесь лишь для улучшения восприятия. На практике использование длинных имен не имеет особого смысла. Для имен переменных поддерживается автозавершение по нажатию клавиши TAB, но использование имен длиной в 1 - 2 знака позволяет ускорить ввод команд. Более длинные описательные имена наиболее полезны при разработке кода для повторного использования.

Определить отображаемые имена приложений в разделе Uninstall можно при помощи следующей команды:
PS> Get-ChildItem -Path Uninstall: | ForEach-Object -Process { $_.GetValue("DisplayName") }	

Уникальность этих значений не гарантирована. В следующем примере два установленных элемента отображаются как «Windows Media Encoder 9 Series»:
PS> Get-ChildItem -Path Uninstall: | Where-Object -FilterScript { $_.GetValue("DisplayName") -eq "Windows Media Encoder 9 Series"}

   Hive: Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Micros
oft\Windows\CurrentVersion\Uninstall

SKC  VC Name                           Property
---  -- ----                           --------
  0   3 Windows Media Encoder 9        {DisplayName, DisplayIcon, UninstallS...
  0  24 {E38C00D0-A68B-4318-A8A6-F7... {AuthorizedCDFPrefix, Comments, Conta...	

Установка приложений
Класс Win32_Product может использоваться для удаленной или локальной установки пакетов Windows Installer. При удаленной установке необходимо указать путь к устанавливаемому пакету MSI в виде классического сетевого UNC-пути, так как подсистема WMI не распознает пути Windows PowerShell. Например, для установки MSI-пакета NewPackage.msi, расположенного на общем сетевом ресурсе \\AppServ\dsp на удаленном компьютере PC01, нужно ввести в командной строке Windows PowerShell следующую команду:
(Get-WMIObject -ComputerName PC01 -List | Where-Object -FilterScript {$_.Name -eq "Win32_Product"}).InvokeMethod("Install","\\AppSrv\dsp\NewPackage.msi")	

Приложения, не использующие технологию Windows Installer, могут поддерживать собственные методы автоматизированного развертывания. Сведения о наличии метода автоматизации развертывания обычно можно найти в документации к приложению или получить в системе технической поддержки его производителя. В отдельных случаях, даже если автоматизация установки не была явно предусмотрена производителем приложения, некоторые методы автоматизации могут поддерживаться производителем ПО для установки.
Удаление приложений
Удаление пакета, установленного при помощи Windows Installer, осуществляется в оболочке Windows PowerShell приблизительно так же, как и установка пакета при помощи метода InvokeMethod. В следующем примере выбор пакета для удаления производится на основе его имени; в отдельных случаях удобнее использовать фильтр IdentifyingNumber:
(Get-WmiObject -Class Win32_Product -Filter "Name='ILMerge'" -ComputerName . ).InvokeMethod("Uninstall",$null)	

Удаление других приложений несколько сложнее, даже если производится локально. Команды удаления таких приложений из командной строки содержатся в свойстве UninstallString. Следующий метод пригоден как для приложений, установленных при помощи Windows Installer, так и для старых программ, перечисленных в разделе Uninstall:
Get-ChildItem -Path Uninstall: | ForEach-Object -Process { $_.GetValue("UninstallString") }	

При необходимости можно отфильтровать вывод по отображаемому имени:
Get-ChildItem -Path Uninstall: | Where-Object -FilterScript { $_.GetValue("DisplayName") -like "Win*"} | ForEach-Object -Process { $_.GetValue("UninstallString") }	

Однако полученные команды не всегда можно использовать в командной строке Windows PowerShell без изменений.
Обновление приложений, установленных при помощи Windows Installer
Обновление приложения требует наличия двух информационных параметров. Необходимо знать имя обновляемого приложения, а также путь к пакету обновления приложения. При наличии этих сведений обновление осуществляется в Windows PowerShell при помощи следующей простой командной строки:
(Get-WmiObject -Class Win32_Product -ComputerName . -Filter "Name='OldAppName'").InvokeMethod("Upgrade","\\AppSrv\dsp\OldAppUpgrade.msi")	

Изменение состояния компьютера: блокировка, завершение сеанса, завершение работы и перезагрузка
Изменить состояние компьютера в Windows PowerShell можно несколькими различными способами, но в этом начальном выпуске необходимо использовать либо стандартное средство командной строки, либо объекты WMI. Несмотря на то, что для запуска конкретного средства используется только оболочка Windows PowerShell, этапы изменения состояния электропитания компьютера иллюстрируют некоторые важные особенности работы с внешними средствами.
Блокировка компьютера
Блокировка компьютера напрямую при помощи доступных стандартных средств возможна только путем прямого вызова функции LockWorkstation() из библиотеки user32.dll:
rundll32.exe user32.dll,LockWorkStation	

Эта команда немедленно блокирует рабочую станцию. Если используются такие операционные системы, как Windows XP, и включен режим быстрого переключения пользователей, вместо запуска заставки текущего пользователя компьютер отобразит диалог входа в систему. При использовании Terminal Server может потребоваться отключение отдельных сеансов. Для этого применяется средство командной строки tsshutdn.exe.
Завершение текущего сеанса
Завершить сеанс на локальной системе можно несколькими различными способами. Простейшим является использование средства командной строки logoff.exe для служб Remote Desktop и Terminal Services (для получения сведений о ее использовании наберите logoff /? в командной строке Windows PowerShell или командной оболочки). Чтобы завершить текущий активный сеанс, наберите logoff без параметров.
Другим способом является использование средства shutdown.exe с параметром для завершения сеанса:
shutdown.exe -l	

Третьим вариантом является использование службы WMI. Класс Win32_OperatingSystem содержит метод Win32Shutdown. Вызов этого метода с параметром 0 инициирует завершение сеанса:
(Get-WmiObject -Class Win32_OperatingSystem -ComputerName .).InvokeMethod("Win32Shutdown",0)	

Завершение работы и перезагрузка компьютера
Завершение работы и перезагрузка компьютеров в целом представляет собой один и тот же тип задач. Средства, позволяющие завершить работу компьютера, обычно также позволяют и перезагрузить его, и наоборот. Оболочка Windows PowerShell поддерживает два простых варианта перезагрузки компьютера. Выполнить ее можно путем запуска команды tsshutdn.exe или shutdown.exe с соответствующими параметрами. Получить подробные сведения об использовании этих команд можно, набрав tsshutdn.exe /? или shutdown.exe /?.
Выполнять операции завершения работы и перезагрузки при помощи класса Win32_OperatingSystem можно также прямо в Windows PowerShell. Однако детальное рассмотрение этого способа выходит за рамки данного руководства по оболочке Windows PowerShell.
Работа с принтерами
Задачи управления принтерами осуществляются в оболочке Windows PowerShell как через службу WMI, так и при помощи COM-объекта WScript.Network на сервере сценариев WSH. При демонстрации выполнения отдельных задач будут использованы оба типа средств.
Получение списка подключений к принтерам
Получить список принтеров, установленных на компьютере, проще всего при помощи класса Win32_Printer:
Get-WmiObject -Class Win32_Printer -ComputerName .	

Создать список принтеров можно также при помощи COM-объекта WScript.Network, который обычно используется в WSH-сценариях:
(New-Object -ComObject WScript.Network).EnumPrinterConnections()	

Эта команда возвращает простую коллекцию строк, содержащих имена портов и имена принтерных устройств без различительных меток, что затрудняет просмотр.
Добавление сетевого принтера
Добавить новый сетевой принтер проще всего при помощи объекта WScript.Network:
(New-Object -ComObject WScript.Network).AddWindowsPrinterConnection("\\Printserver01\Xerox5")	

Установка принтера по умолчанию
Чтобы установить принтер по умолчанию при помощи службы WMI, необходимо отфильтровать необходимый принтер в коллекции классов Win32_Printer и вызвать метод SetDefaultPrinter:
(Get-WmiObject -ComputerName . -Class Win32_Printer -Filter "Name='HP LaserJet 5Si'").InvokeMethod("SetDefaultPrinter",$null)	

Несколько проще работа с объектом WScript.Network, который также содержит метод SetDefaultPrinter. Ему достаточно передать в качестве параметра имя принтера:
(New-Object -ComObject WScript.Network).SetDefaultPrinter('HP LaserJet 5Si')	

Удаление подключения к принтеру
Удалить подключение к принтеру можно при помощи метода RemovePrinterConnection объекта WScript.Network:
(New-Object -ComObject WScript.Network).RemovePrinterConnection("\\Printserver01\Xerox5")	

Выполнение сетевых задач
Большая часть задач администрирования низкоуровневых сетевых протоколов связана с протоколом TCP/IP, поскольку это наиболее часто используемый сетевой протокол. Рассмотрим выполнение некоторых таких задач в оболочке Windows PowerShell при помощи службы WMI.
Получение списка IP-адресов компьютера
Список всех IP-адресов, используемых компьютером, возвращает следующая команда:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName . | Select-Object -Property IPAddress	

Вывод этой команды отличается от большинства выводов свойств тем, что значения заключены в фигурные скобки:
IPAddress
---------
{192.168.1.80}
{192.168.148.1}
{192.168.171.1}
{0.0.0.0}
Чтобы понять, для чего используются скобки, надо внимательно изучить свойство IPAddress при помощи командлета Get-Member:
PS> Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName . | Get-Member -Name IPAddress

   TypeName: System.Management.ManagementObject#root\cimv2\Win32_NetworkAdapter
Configuration

Name      MemberType Definition
----      ---------- ----------
IPAddress Property   System.String[] IPAddress {get;}
Свойство IPAddress каждого сетевого адаптера в действительности представляет собой массив. Фигурные скобки в определении указывают на то, что свойство IPAddress содержит не значение типа System.String, а массив значений этого типа.
Развернуть эти значения можно при помощи параметра ExpandProperty командлета Select-Object:
PS> Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName . | Select-Object -ExpandProperty IPAddress
192.168.1.80
192.168.148.1
192.168.171.1
0.0.0.0	

Вывод данных IP-конфигурации
Для отображения подробных данных IP-конфигурации каждого сетевого адаптера можно воспользоваться следующей командой:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName .	

Примечание
По умолчанию отображается очень небольшая часть доступных сведений о конфигурации сетевого адаптера. Для более глубокой инспекции и устранения неполадок необходимо воспользоваться командлетом Select-Object, что позволит отобразить большее число свойств. Если свойства IPX или WINS не представляют интереса (что характерно для современной сети TCP/IP), можно также исключить все свойства, начинающиеся с WINS или IPX:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=TRUE -ComputerName . | Select-Object -Property [a-z]* -ExcludeProperty IPX*,WINS*
Эта команда возвратит подробные сведения о DHCP, DNS, маршрутизации, а также других менее значительных свойствах IP-конфигурации.

Проверка связи с компьютерами
Простую проверку связи с компьютером можно выполнить при помощи объекта Win32_PingStatus. Следующая команда произведет проверку связи, но возвратит большой объем сведений:
Get-WmiObject -Class Win32_PingStatus -Filter "Address='127.0.0.1'" -ComputerName .	

Более полезная форма этой команды для отображения сводных данных, содержащих свойства Address, ResponseTime и StatusCode:
PS> Get-WmiObject -Class Win32_PingStatus -Filter "Address='127.0.0.1'" -ComputerName . | Select-Object -Property Address,ResponseTime,StatusCode

Address                                  ResponseTime                StatusCode
-------                                  ------------                ----------
127.0.0.1                                           0                         0	

Код состояния 0 указывает на успешное выполнение проверки связи.
При помощи массива можно протестировать целый ряд компьютеров. Поскольку имеется несколько адресов, необходимо воспользоваться командлетом ForEach-Object для проверки связи с каждым адресом по отдельности:
"127.0.0.1","localhost","research.microsoft.com" | ForEach-Object -Process {Get-WmiObject -Class Win32_PingStatus -Filter ("Address='" + $_ + "'") -ComputerName .} | Select-Object -Property Address,ResponseTime,StatusCode	

Таким же образом можно выполнить проверку связи со всей подсетью. Например, при проверке частной сети, использующей номер сети 192.168.1.0 и стандартную маску подсети класса C (255.255.255.0), допустимы только адреса в диапазоне от 192.168.1.1 до 192.168.1.254 (0 всегда зарезервирован в качестве номера сети, а 255 используется для массовой рассылки по подсети).
Получить массив чисел от 1 до 254 в Windows PowerShell можно при помощи инструкции 1..254. Таким образом, полную проверку связи с подсетью можно осуществить, сформировав этот массив и добавляя его элементы к частичному адресу в инструкции проверки связи:
1..254| ForEach-Object -Process {Get-WmiObject -Class Win32_PingStatus -Filter ("Address='192.168.1." + $_ + "'") -ComputerName .} | Select-Object -Property Address,ResponseTime,StatusCode	

Примечание
Такой метод формирования диапазона адресов может быть использован в любых подобных случаях. Полный набор адресов можно сформировать следующим образом:
$ips = 1..254 | ForEach-Object -Process {"192.168.1." + $_}

Извлечение свойств сетевого адаптера
Ранее в данном руководстве мы упоминали о возможности извлечения общих свойств конфигурации при помощи объекта Win32_NetworkAdapterConfiguration. Такие сведения о сетевом адаптере, как MAC-адреса и типы адаптеров, не относятся, строго говоря, к протоколу TCP/IP, но могут оказаться полезными для понимания того, что происходит в компьютере. Сводные данные можно получить при помощи следующей команды:
Get-WmiObject -Class Win32_NetworkAdapter -ComputerName .	

Назначение домена DMS сетевому адаптеру
Назначение домена DNS для использования при автоматическом разрешении имен можно автоматизировать при помощи метода SetDNSDomain объекта Win32_NetworkAdapterConfiguration. Поскольку назначение домена DNS для каждого сетевого адаптера производится независимо, необходимо воспользоваться инструкцией ForEach-Object, что позволит выбирать адаптеры по отдельности:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=true -ComputerName . | ForEach-Object -Process { $_.InvokeMethod("SetDNSDomain", "fabrikam.com")}	

Здесь была использована инструкция фильтрации «IPEnabled=true», поскольку даже в сети, использующей лишь протокол TCP/IP, некоторые сетевые адаптеры компьютера не являются настоящими адаптерами TCP/IP. Они представляют собой общие программные элементы, поддерживающие службы RAS, PPTP, QoS и т. п. для всех адаптеров, и не имеют собственного адреса.
Фильтрацию в команде можно осуществить при помощи командлета Where-Object вместо Get-WmiObject Filter:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -ComputerName . | Where-Object -FilterScript {$_.IPEnabled} | ForEach-Object -Process {$_.InvokeMethod("SetDNSDomain", "fabrikam.com")}	

Выполнение задач настройки DHCP
Изменение деталей DHCP, так же как и настройка DNS, включает в себя работу с набором адаптеров. Существует несколько отдельных действий, выполняемых при помощи службы WMI. Мы рассмотрим несколько типичных действий.
Определение адаптеров, поддерживающих DHCP
Найти на компьютере адаптеры, поддерживающие DHCP, можно при помощи следующей команды:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter "DHCPEnabled=true" -ComputerName .	

Если отказаться от поиска адаптеров, имеющих проблемы в IP-конфигурации, можно добавить требование поддержки протокола IP:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter "IPEnabled=true and DHCPEnabled=true" -ComputerName .	

Извлечение свойств DHCP
Свойства адаптера, относящиеся к протоколу DHCP, обычно начинаются с DHCP, поэтому для просмотра сводных данных DHCP для адаптеров можно добавить в конвейер элемент Select-Object -Property DHCP*:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter "DHCPEnabled=true" -ComputerName . | Select-Object -Property DHCP*	

Включение поддержки DHCP на каждом адаптере
Если необходимо включить поддержку DHCP сразу для всех адаптеров, можно использовать команду:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter IPEnabled=true -ComputerName . | ForEach-Object -Process {$_.InvokeMethod("EnableDHCP", $null)}	

Вместо этого можно воспользоваться инструкцией Filter следующего вида: «IPEnabled=true and DHCPEnabled=false». Это позволит избежать попытки включения поддержки DHCP для адаптеров, у которых она уже включена, но пропуск этого шага не приведет к появлению ошибок.
Отмена и обновление аренды адреса DHCP для отдельных адаптеров
Объект Win32_NetworkAdapterConfiguration включает методы ReleaseDHCPLease и RenewDHCPLease. Оба метода используются одинаково. Обычно их применяют лишь при необходимости отмены или обновления аренды адресов для адаптера в отдельной подсети. Простейший способ фильтрации адаптеров в подсети является выбор лишь тех адаптеров, которые используют шлюз для этой подсети. Например, следующая команда отменит все аренды адресов DHCP для адаптеров на локальном компьютере, которые арендуют адреса DHCP на шлюзе 192.168.1.254:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter "IPEnabled=true and DHCPEnabled=true" -ComputerName . | Where-Object -FilterScript {$_.DHCPServer -contains "192.168.1.254"} | ForEach-Object -Process {$_.InvokeMethod("ReleaseDHCPLease",$null)}	

Единственная разница при обновлении аренды адреса DHCP состоит в вызове метода RenewDHCPLease вместо метода ReleaseDHCPLease:
Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter "IPEnabled=true and DHCPEnabled=true" -ComputerName . | Where-Object -FilterScript {$_.DHCPServer -contains "192.168.1.254"} | ForEach-Object -Process {$_.InvokeMethod("ReleaseDHCPLease",$null)}	

Примечание
Если эти методы применяются на удаленном компьютере, может быть потерян доступ к удаленной системе, которая подключена через адаптер с отмененной или обновленной арендой.
Отмена и обновление аренды адреса DHCP для всех адаптеров
Отменить или обновить аренду адреса DHCP сразу для всех адаптеров можно при помощи методов ReleaseDHCPLeaseAll и RenewDHCPLeaseAll объекта Win32_NetworkAdapterConfiguration. Однако эту команду следует применять к классу WMI, а не к отдельному адаптеру, поскольку глобальная отмена и обновление аренды осуществляется на уровне класса, а не отдельного адаптера. 
Ссылку на класс WMI вместо ссылки на экземпляры класса можно получить путем вывода всех классов WMI и выбора нужного класса по имени. Например, эта команда возвращает класс Win32_NetworkAdapterConfiguration:
Get-WmiObject -List | Where-Object -FilterScript {$_.Name -eq "Win32_NetworkAdapterConfiguration"}	

Эту команду можно рассматривать как класс и использовать ее при вызове метода ReleaseDHCPAdapterLease. В следующей команде элементы конвейера Get-WmiObject и Where-Object ограничены круглыми скобками, в результате чего обрабатываются первыми:
( Get-WmiObject -List | Where-Object -FilterScript {$_.Name -eq "Win32_NetworkAdapterConfiguration"} ) .InvokeMethod("ReleaseDHCPLeaseAll", $null)	

Такой же формат команды используется при вызове метода RenewDHCPLeaseAll:
( Get-WmiObject -List | Where-Object -FilterScript {$_.Name -eq "Win32_NetworkAdapterConfiguration"} ) .InvokeMethod("RenewDHCPLeaseAll", $null)	

Создание общего сетевого ресурса
Создать общий сетевой ресурс можно при помощи метода Create объекта Win32_Share:
(Get-WmiObject -List -ComputerName . | Where-Object -FilterScript {$_.Name –eq "Win32_Share"}).InvokeMethod("Create",("C:\temp","TempShare",0,25,"test share of the temp folder"))	

Для этой же цели в Windows PowerShell можно использовать команду net share:
net share tempshare=c:\temp /users:25 /remark:"test share of the temp folder"	

Удаление общего сетевого ресурса
Общий сетевой ресурс можно удалить при помощи объекта Win32_Share, но этот процесс немного отличается от процесса создания, поскольку требует получения отдельного общего ресурса, который должен быть удален, а не класса Win32_Share. Следующая инструкция удалит общий ресурс «TempShare»:
 (Get-WmiObject -Class Win32_Share -ComputerName . -Filter "Name='TempShare'").InvokeMethod("Delete",$null)	

Так же работает и команда net share:
PS> net share tempshare /delete
tempshare успешно удалено.	

Подключение сетевого диска, доступного в Windows
Командлет New-PSDrive позволяет создавать диски Windows PowerShell, но такие диски доступны только в Windows PowerShell. Для создания нового сетевого диска можно воспользоваться COM-объектом WScript.Network. Следующая команда отображает общий ресурс \\FPS01\users на локальный диск B:
(New-Object -ComObject WScript.Network).MapNetworkDrive("B:", "\\FPS01\users")	

Так же работает и команда net use:
net use B: \\FPS01\users	

Диски, отображенные при помощи объекта WScript.Network или команды net use, немедленно доступны в оболочке Windows PowerShell.
Работа с файлами и папками
Просмотр содержимого дисков Windows PowerShell и управление хранящимися на них элементами аналогично управлению файлами и папками на физических дисковых накопителях Windows. В этом разделе мы обсудим выполнение отдельных задач управления файлами и папками.

Получение списка файлов и папок, содержащихся в папке
Извлечь все элементы, непосредственно содержащихся в папке, можно при помощи командлета Get-ChildItem. Добавьте необязательный параметр Force для отображения скрытых и системных элементов. Например, эта команда отображает непосредственное содержимое диска C Windows PowerShell (которое совпадает с содержимым физического диска C Windows):
Get-ChildItem -Force C:\	

Эта команда выводит только элементы, содержащиеся на диске непосредственно, так же как и команда DIR приложения Cmd.exe, а также команда ls оболочки UNIX. Для показа вложенных элементов необходимо также указать параметр -Recurse. (Время выполнения этой операции будет очень велико.) Для вывода всего содержимого диска C введите:
Get-ChildItem -Force C:\ -Recurse	

Командлет Get-ChildItem позволяет отфильтровать элементы при помощи параметров Path, Filter, Include и Exclude, но обычно осуществляется лишь фильтрация по имени. Сложную фильтрацию на основе других свойств элементов можно выполнить при помощи командлета Where-Object.
Следующая команда находит все исполняемые файлы в папке Program Files, которые были в последний раз изменены после 1 октября 2005 г., и размер которых не менее 1 мегабайта и не более 10 мегабайт:
Get-ChildItem -Path $env:ProgramFiles -Recurse -Include *.exe | Where-Object -FilterScript {($_.LastWriteTime -gt "2005-10-01") -and ($_.Length -ge 1m) -and ($_.Length -le 10m)}	

Копирование файлов и папок
Копирование выполняется при помощи командлета Copy-Item. Следующая команда создает резервную копию C:\boot.bak для файла C:\boot.ini:
Copy-Item -Path c:\boot.ini -Destination c:\boot.bak	

Если целевой файл уже существует, то попытка копирования завершается неудачей. Для того чтобы перезаписать существующий целевой файл, используйте параметр Force:
Copy-Item -Path c:\boot.ini -Destination c:\boot.bak -Force	

Эта команда работает даже если целевой файл помечен как файл только для чтения.
Так же выполняется и копирование папок. Эта команда рекурсивно копирует папку «C:\temp\test1» в новую папку «c:\temp\DeleteMe»:
Copy-Item C:\temp\test1 -Recurse c:\temp\DeleteMe	

Можно также скопировать избранные элементы. Следующая команда копирует все файлы .txt, содержащиеся в папке «c:\data», в папку «c:\temp\text»:
Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination c:\temp\text	

Для копирования элементов файловой системы можно использовать и другие средства. В Windows PowerShell по-прежнему работают команды XCOPY и ROBOCOPY, а также такие COM-объекты, как Scripting.FileSystemObject. Например, можно воспользоваться COM-классом Scripting.FileSystem сервера сценариев Windows для создания резервной копии «C:\boot.bak» файла «C:\boot.ini»:
(New-Object -ComObject Scripting.FileSystemObject).CopyFile("c:\boot.ini", "c:\boot.bak")	

Создание файлов и папок
Создание новых элементов осуществляется одинаковым образом всеми поставщиками Windows PowerShell. Если поставщик Windows PowerShell поддерживает более одного типа элементов (например, поставщик Windows PowerShell FileSystem различает каталоги и файлы), необходимо указать тип элемента.
Эта команда создает новую папку «C:\temp\New Folder»:
New-Item -Path 'C:\temp\New Folder' -ItemType "directory"	

Эта команда создает новый пустой файл «C:\temp\New Folder\file.txt»:
New-Item -Path 'C:\temp\New Folder\file.txt' –ItemType "file"	

Удаление всех файлов и папок, содержащихся в папке
Удалить вложенные элементы можно при помощи командлета Remove-Item, однако он потребует подтверждения удаления, если элемент сам что-нибудь содержит. Например, при попытке удаления папки «C:\temp\DeleteMe», которая содержит другие элементы, Windows PowerShell предварительно предложит подтвердить удаление этой папки:
Remove-Item C:\temp\DeleteMe

Подтверждение
Элемент в C:\temp\DeleteMe имеет дочерние объекты, и параметр -recurse не указан.
При продолжении все дочерние объекты будут удалены вместе с элементом. Вы действительно хотите продолжить?
[А] Да  [Х] Да для всех  [Н] Нет  [В] Нет для всех  [Т] Приостановить  [?] Справка
(значением по умолчанию является "А"):	

Если подтверждение для каждого вложенного элемента нежелательно, укажите параметр Recurse:
Remove-Item C:\temp\DeleteMe -Recurse	

Отображение локальной папки в виде диска, доступного в Windows
Отобразить локальную папку можно при помощи команды subst. Следующая команда создает локальный диск P:, отображающий локальный каталог Program Files:
subst p: $env:programfiles	

Как и в случае сетевых дисков, диски, отображенные в оболочке Windows PowerShell при помощи команды subst, немедленно доступны в данном сеансе Windows PowerShell.
Чтение текстового файла в массив
Одним из наиболее общих форматов хранения текстовых данных является файл, отдельные строки которого рассматриваются как отдельные элементы. Командлет Get-Content используется для чтения всего файла за один шаг, как показано далее:
PS> Get-Content -Path C:\boot.ini
[boot loader]
timeout=5
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional"
 /noexecute=AlwaysOff /fastdetect
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS=" Microsoft Windows XP Professional 
with Data Execution Prevention" /noexecute=optin /fastdetect	

Командлет Get-Content сразу рассматривает данные, прочитанные из файла, как массив. Каждая строка содержимого файла становится одним элементом этого массива. Убедиться в этом можно, проверив свойство Length полученного содержимого:
PS> (Get-Content -Path C:\boot.ini).Length
6	

Эта команда наиболее полезна для непосредственного ввода в Windows PowerShell информационных списков. Например, можно хранить в файле «C:\temp\domainMembers.txt» список имен компьютеров или IP-адресов по одному имени на каждую строку файла. Можно использовать командлет Get-Content для извлечения содержимого файла и поместить его в переменную $Computers:
$Computers = Get-Content -Path C:\temp\DomainMembers.txt	

Теперь переменная $Computers представляет собой массив, содержащий в каждом элементе имя компьютера.
Работа с разделами реестра
Поскольку разделы реестра представляют собой элементы на дисках Windows PowerShell, работа с ними очень похожа на работу с файлами и папками. Одно важное различие заключается в том, что каждый элемент реестрового диска Windows PowerShell представляет собой контейнер, как и папка на диске файловой системы. Однако записи реестра и связанные с ними значения являются свойствами элементов, а не отдельными элементами.
Получение всех подразделов раздела реестра
Показать все элементы, непосредственно содержащиеся в разделе реестра, можно при помощи командлета Get-ChildItem. Добавьте необязательный параметр Force для отображения скрытых и системных элементов. Например, эта команда отображает элементы, непосредственно расположенные на диске HKCU: Windows PowerShell, который соответствует кусту HKEY_CURRENT_USER:
PS> Get-ChildItem -Path hkcu:\

   Hive: Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER

SKC  VC Name                           Property
---  -- ----                           --------
  2   0 AppEvents                      {}
  7  33 Console                        {ColorTable00, ColorTable01, ColorTab...
 25   1 Control Panel                  {Opened}
  0   5 Environment                    {APR_ICONV_PATH, INCLUDE, LIB, TEMP...}
  1   7 Identities                     {Last Username, Last User ...
  4   0 Keyboard Layout                {}
...	

Это разделы верхнего уровня, которые можно видеть под разделом HKEY_CURRENT_USER в редакторе реестра (Regedit.exe).
Указать этот путь в реестре можно также, задав имя поставщика реестра с последующей строкой «::». Полное имя поставщика реестра выглядит как Microsoft.PowerShell.Core\Registry, но может быть сокращено до Registry. Любая из следующих команд выведет содержимое элементов, непосредственно расположенных под разделом HKCU:
Get-ChildItem -Path Registry::HKEY_CURRENT_USER
Get-ChildItem -Path Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER
Get-ChildItem -Path Registry::HKCU
Get-ChildItem -Path Microsoft.PowerShell.Core\Registry::HKCU
Get-ChildItem HKCU:	

Эти команды выводят только элементы, содержащиеся под разделом непосредственно, так же как и команда DIR приложения Cmd.exe, а также команда ls оболочки UNIX. Для показа вложенных элементов необходимо указать параметр Recurse. Для вывода всех подразделов раздела HKCU используется следующая команда (эта операция может занять очень продолжительное время):
Get-ChildItem -Path hkcu:\ -Recurse	

Командлет Get-ChildItem позволяет выполнять сложную фильтрацию при помощи параметров Path, Filter, Include и Exclude, но обычно осуществляется лишь фильтрация по имени. Сложную фильтрацию на основе других свойств элементов можно выполнить при помощи командлета Where-Object. Следующая команда находит все подразделы раздела HKCU:\Software, у которых не более одного подраздела и ровно четыре значения:
Get-ChildItem -Path HKCU:\Software -Recurse | Where-Object -FilterScript {($_.SubKeyCount -le 1) –and ($_.ValueCount -eq 4) }	

Копирование разделов
Копирование выполняется при помощи командлета Copy-Item. Следующая команда копирует раздел HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion и все его свойства в раздел HKCU:\, создавая новый подраздел с именем «CurrentVersion»:
Copy-Item -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion' -Destination hkcu:	

Если рассмотреть этот новый раздел в редакторе реестра или при помощи командлета Get-ChildItem, видно, что в новом положении отсутствуют копии подразделов содержавшихся в исходном разделе. Чтобы копировать все содержимое контейнера, необходимо указать параметр Recurse. Копирование в предыдущем примере можно сделать рекурсивным, если использовать следующую команду:
Copy-Item -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion' -Destination hkcu: -Recurse	

Можно использовать и другие доступные средства для копирования файловой системы. В оболочке Windows PowerShell можно по-прежнему использовать любые средства для редактирования реестра (в том числе reg.exe, regini.exe и regedit.exe), а также COM-объекты, поддерживающие редактирование реестра (такие как WScript.Shell и WMI-класс StdRegProv).
Создание разделов
Создание новых разделов в реестре проще, чем создание нового элемента в файловой системе. Поскольку все разделы реестра являются контейнерами, нет необходимости указывать тип элемента. Достаточно указать точный путь, например:
New-Item -Path hkcu:\software\_DeleteMe	

Для указания раздела можно также использовать путь на основе имени поставщика:
New-Item -Path Registry::HKCU\_DeleteMe	

Удаление разделов
Удаление элементов в принципе осуществляется одинаково для всех поставщиков. Следующие команды удалят элементы, не выводя никаких сообщений:
Remove-Item -Path hkcu:\Software\_DeleteMe
Remove-Item -Path 'hkcu:\key with spaces in the name'	

Удаление всех подразделов определенного раздела реестра
Удалить вложенные элементы можно при помощи командлета Remove-Item, однако он потребует подтверждения удаления, если элемент сам что-нибудь содержит. Например, при попытке удаления созданного нами подраздела HKCU:\CurrentVersion будет отображено следующее:
Remove-Item -Path hkcu:\CurrentVersion

Подтверждение
Элемент в HKCU:\CurrentVersion\AdminDebug имеет дочерние объекты, и параметр
–recurse не указан. При продолжении все дочерние объекты будут удалены вместе с
элементом. Вы действительно хотите продолжить?
[А] Да  [Х] Да для всех  [Н] Нет  [В] Нет для всех  [Т] Приостановить  [?] Справка
(значением по умолчанию является "А"):	

Для удаления вложенных элементов без подтверждения укажите параметр -Recurse:
Remove-Item -Path HKCU:\CurrentVersion -Recurse	

Если нужно удалить все элементы в разделе HKCU:\CurrentVersion, но не сам раздел, вместо этого введите следующую команду:
Remove-Item -Path HKCU:\CurrentVersion\* -Recurse	

Работа с записями реестра
Поскольку записи реестра являются свойствами разделов, а потому не могут просматриваться напрямую, при работе с ними нужен немного другой подход.
Получение списка записей реестра
Существует много разных способов просмотра записей реестра. Простейшим способом является получение имен свойств, связанных с разделом. Например, для просмотра имен записей раздела реестра HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion можно воспользоваться командлетом Get-Item. Разделы реестра имеют свойство с универсальным именем «Property», содержащее список записей реестра в данном разделе. Следующая команда выбирает свойство Property и разворачивает элементы для отображения в виде списка:
PS> Get-Item -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion | Select-Object -ExpandProperty Property
DevicePath
MediaPathUnexpanded
ProgramFilesDir
CommonFilesDir
ProductId	

Для просмотра записей реестра в более удобной для чтения форме воспользуйтесь командлетом Get-ItemProperty:
PS> Get-ItemProperty -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion

PSPath              : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SO
                      FTWARE\Microsoft\Windows\CurrentVersion
PSParentPath        : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SO
                      FTWARE\Microsoft\Windows
PSChildName         : CurrentVersion
PSDrive             : HKLM
PSProvider          : Microsoft.PowerShell.Core\Registry
DevicePath          : C:\WINDOWS\inf
MediaPathUnexpanded : C:\WINDOWS\Media
ProgramFilesDir     : C:\Program Files
CommonFilesDir      : C:\Program Files\Common Files
ProductId           : 76487-338-1167776-22465
WallPaperDir        : C:\WINDOWS\Web\Wallpaper
MediaPath           : C:\WINDOWS\Media
ProgramFilesPath    : C:\Program Files
PF_AccessoriesName  : Accessories
(default)           :	

Все свойства раздела, относящиеся к Windows PowerShell, имеют префикс «PS», например, PSPath, PSParentPath, PSChildName и PSProvider.
При ссылке на текущее положение можно использовать обозначение «.». Можно воспользоваться командлетом Set-Location, чтобы предварительно перейти к контейнеру реестра CurrentVersion:
Set-Location -Path Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion	

Другой способ состоит в использовании в качестве параметра командлета Set-Location встроенного диска HKLM:
Set-Location -Path hklm:\SOFTWARE\Microsoft\Windows\CurrentVersion	

После этого для обозначения текущего положения можно использовать знак «.» и не указывать полный путь при получении списка свойств:
PS> Get-ItemProperty -Path .
...
DevicePath          : C:\WINDOWS\inf
MediaPathUnexpanded : C:\WINDOWS\Media
ProgramFilesDir     : C:\Program Files
...	

Расширение пути производится так же, как и в файловой системе, то есть из этого положения можно вывести свойства ItemProperty для раздела HKLM:\SOFTWARE\Microsoft\Windows\Help при помощи команды Get-ItemProperty -Path ..\Help.
Извлечение отдельной записи реестра
Если необходимо извлечь конкретную запись из раздела реестра, можно следовать одному из нескольких возможных подходов. В этом примере ищется значение свойства DevicePath в разделе HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion.
При использовании командлета Get-ItemProperty параметр Path указывает имя раздела, а параметр Name указывает имя записи DevicePath.
PS> Get-ItemProperty -Path HKLM:\Software\Microsoft\Windows\CurrentVersion -Name DevicePath

PSPath       : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\
               Microsoft\Windows\CurrentVersion
PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\Software\
               Microsoft\Windows
PSChildName  : CurrentVersion
PSDrive      : HKLM
PSProvider   : Microsoft.PowerShell.Core\Registry
DevicePath   : C:\WINDOWS\inf	

Эта команда возвращает как стандартные свойства Windows PowerShell, так и свойство DevicePath.
Примечание
Командлет Get-ItemProperty имеет параметры Filter, Include и Exclude, но их нельзя использовать для фильтрации по имени свойств. Эти параметры относятся к разделу реестра (то есть путям к элементу), а не к записям реестра, которые являются свойствами элемента.

Другой способ состоит в использовании средства командной строки Reg.exe. Дополнительные сведения о средстве reg.exe можно получить, набрав reg.exe /? в командной строке. Чтобы найти запись DevicePath, воспользуйтесь reg.exe, как показано в следующей команде:
PS> reg query HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion /v DevicePath

! REG.EXE VERSION 3.0

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion
    DevicePath  REG_EXPAND_SZ   %SystemRoot%\inf	

Для нахождения некоторых записей в реестре можно также использовать COM-объект WshShell, однако этот метод не работает с большими блоками двоичных данных, а также в случаях, когда имена записей в реестре включают специальные знаки, такие как «\». Имя свойства добавляется к пути к элементу при помощи разделителя «\»:
PS> (New-Object -ComObject WScript.Shell).RegRead("HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\DevicePath")
%SystemRoot%\inf	

Создание новых записей в реестре
Для добавления новой записи с именем «PowerShellPath» в раздел CurrentVersion воспользуйтесь командлетом New-ItemProperty, указав путь к разделу, имя записи и значение записи. В данном примере используется значение переменной Windows PowerShell $PSHome, которая хранит путь к каталогу установки Windows PowerShell.
Новую запись к разделу можно добавить при помощи следующей команды, которая также возвращает сведения о новой записи:
PS> New-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion -Name PowerShellPath -PropertyType String -Value $PSHome

PSPath         : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWAR
                 E\Microsoft\Windows\CurrentVersion
PSParentPath   : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWAR
                 E\Microsoft\Windows
PSChildName    : CurrentVersion
PSDrive        : HKLM
PSProvider     : Microsoft.PowerShell.Core\Registry
PowerShellPath : C:\Program Files\Windows PowerShell\v1.0	

Параметр PropertyType должен содержать имя члена перечисления Microsoft.Win32.RegistryValueKind из следующей таблицы.

Значение PropertyType	Тип свойства	
Binary	Двоичные данные	
DWord	Допустимое число типа UInt32	
ExpandString	Строка, которая может содержать динамически увеличивающиеся переменные среды	
MultiString	Многострочный текст	
String	Любое строковое значение	
QWord	8 байт двоичных данных	

Примечание
Можно добавить запись в несколько положений в реестре, указав в качестве параметра Path массив значений:
New-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion, HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion -Name PowerShellPath -PropertyType String -Value $PSHome

Можно также переписать ранее существовавшую запись в реестре, добавив в любую команду New-ItemProperty параметр Force.
Переименование записей в реестре
Чтобы переименовать запись PowerShellPath в «PSHome», воспользуйтесь командлетом Rename-ItemProperty:
Rename-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion -Name PowerShellPath -NewName PSHome	

Для отображения переименованного значения добавьте в команду параметр PassThru.
Rename-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion -Name PowerShellPath -NewName PSHome -passthru	

Удаление записей в реестре
Для удаления записей в реестре PSHome и PowerShellPath воспользуйтесь командлетом Remove-ItemProperty:
Remove-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion -Name PSHome
Remove-ItemProperty -Path HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion -Name PowerShellPath	

Приложение 1. Псевдонимы, обеспечивающие совместимость

Оболочка Windows PowerShell включает несколько переходных псевдонимов, которые позволяют пользователям Unix и Cmd использовать в Windows PowerShell знакомые им имена команд. В следующей далее таблице приведены наиболее часто используемые псевдонимы для команд Windows PowerShell, а также стандартные псевдонимы Windows PowerShell, если они имеются.
Примечание
Найти команду PowerShell, на которую указывает любой псевдоним, можно при помощи командлета Get-Alias. Например:
PS> Get-Alias cls
CommandType     Name                            Definition
-----------     ----                            ----------
Alias           cls                             Clear-Host	

Команда CMD	Команда Unix	Команда PS	Псевдоним PS	
dir	ls	Get-ChildItem	gci	
cls	clear	Clear-Host (функция)	Н/Д	
del, erase, rmdir	rm	Remove-Item	ri	
copy	cp	Copy-Item	ci	
move	mv	Move-Item	mi	
rename	mv	Rename-Item	rni	
type	cat	Get-Content	gc	
cd	cd	Set-Location	sl	
md	mkdir	New-Item	ni	
Н/Д	pushd	Push-Location	Н/Д	
Н/Д	popd	Pop-Location	Н/Д	

Приложение 2. Создание пользовательского ярлыка для PowerShell
Описанная далее процедура позволит поэтапно создать ярлык для запуска PowerShell с некоторыми настройками, измененными для удобства пользователя.
1.	Создайте ярлык, указывающий на приложение powershell.exe.
2.	Щелкните ярлык правой кнопкой и выберите пункт «Свойства».
3.	Перейдите на вкладку «Параметры».
4.	Установите флажок «Быстрое редактирование» в группе «Параметры редактирования», чтобы разрешить выбор и копирование при помощи мыши. После этого можно выбирать текст в окне консоли PowerShell, перемещая мышь при нажатой левой кнопке, и копировать его в буфер либо нажатием клавиши ВВОД, либо щелчком правой кнопки.
5.	Установите флажок «Режим вставки» в группе «Параметры редактирования». После этого щелчок правой кнопки в окне консоли будет автоматически вставлять текст из буфера.
6.	В счетчике «Размер буфера команд» группы «Журнал команд» введите или выберите число от 1 до 999. Это позволяет выбрать число введенных команд, сохраняемых в буфере команд консоли. 
7.	Установите флажок «Удалять старые дубликаты» в группе «Журнал команд» для исключения повторяющихся команд из буфера консоли.
8.	Перейдите на вкладку «Расположение».
9.	Введите в счетчике «Высота» группы «Размер буфера экрана» число от 1 до 9999. Этот параметр указывает число строк, буферизуемых при выводе. Это максимальное число строк, которые сохраняются для просмотра при прокрутке окна консоли. Если это число меньше, чем высота, указанная в группе «Размер окна», то параметр «Высота» в группе «Размер окна» будет автоматически уменьшен до того же значения. 
10.	Введите в счетчике «Ширина» группы «Размер окна» число от 1 до 9999. Это значение указывает число знаков, отображаемых по ширине окна консоли. Ширина по умолчанию равна 80, и форматирование вывода PowerShell выполнено именно в этом предположении.
11.	Если необходимо, чтобы консоль располагалась при открытии в определенном месте рабочего стола, снимите флажок «Разрешить системе расположить окно» в группе «Положение окна» и измените значения в полях «По горизонтали» и «По вертикали».
12.	После завершения нажмите кнопку «ОК».