Лекции по информатике на тему "Windows PowerShell. Общие сведения"
Оценка 4.7

Лекции по информатике на тему "Windows PowerShell. Общие сведения"

Оценка 4.7
Лекции
pdf
информатика
10 кл—11 кл +1
24.02.2017
Лекции по информатике на тему "Windows PowerShell. Общие сведения"
Среда Windows PowerShell – это ориентированная на задачи оболочка командной строки и язык сценариев, разработанный для системного администрирования. Несмотря на внешнее сходство с традиционным cmd.exe, PowerShell является превосходной средой для выполнения сценариев предназначенных для автоматизации различных задач, будь то копирование файлов или создание объектов в Active Directory.Windows.
Windows PowerShell. Общие сведения.pdf

Windows PowerShell. Общие сведения.

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

В Windows PowerShell реализована новая концепция командлетов — простых, узкоспециализированных средств командной строки, встроенных в оболочку.

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

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

В отличие от большинства оболочек, которые принимают и возвращают текст, оболочка Windows PowerShell, разработанная на основе среды CRL .NET и платформы .NET Framework, принимает и возвращает объекты .NET. Структуры папок, или службы, к которым обращаются сценарии PowerShell, в сущности, являются экземплярами объектов, которые представляют эти папки и службы.

Конвейерная обработка позволяет получить результаты работы одной команды и передать их на вход следующей команды при композиции. Например, команда getmailbox используется для получения списка почтовых объектов, которыми можно впоследствии манипулировать самыми разными способами. Команда get-mailbox возвращает не список названий почтовых ящиков; а список объектов, которые представляют собой почтовые ящики. В этом и состоит отличие рассматриваемого продукта от других командных оболочек, которые способны только обрабатывать тексты. Таким образом, PowerShell по своей мощности и эффективности намного превосходит традиционные командные оболочки.

 

 

Политики выполнения.

Сценарии  обеспечивают  пользователям  оболочки  Windows  PowerShell широчайшие возможности, но их можно использовать со злым умыслом. Для защиты пользовательских данных и целостности операционной системы в оболочке Windows PowerShell реализованы некоторые средства обеспечения безопасности, в том числе политика выполнения.

Политика выполнения оболочки Windows PowerShell определяет, можно ли выполнять сценарии, и если да, должны ли они быть подписаны цифровой подписью.

Кроме того, она определяет, можно ли загружать конфигурационные файлы.

Политика выполнения по умолчанию (Restricted) обеспечивает максимальную защиту из всех политик. Она не разрешает выполнять сценарии и загружать какиелибо конфигурационные файлы, в том числе профиль Windows PowerShell. Тем не менее, при этом можно работать с оболочкой Windows PowerShell в интерактивном режиме.

Если нужно выполнять сценарии или загружать конфигурационные файлы, политику выполнения можно изменить. Чтобы получить сведения об этом и соответствующие инструкции, выполните следующую команду:

get-help about_signing

Чтобы вывести активную политику выполнения, введите следующую команду: get-executionpolicy

                Для     изменения     политики     выполнения     используйте     командлет      Set-

ExecutionPolicy.

Например, чтобы сделать действующей политикой выполнения политику RemoteSigned, введите следующую команду:

set-executionpolicy remotesigned

Если установлена политика выполнения RemoteSigned, PowerShell не будет запускать неподписанные сценарии, загруженные из Интернета (включая электронную почту и программы мгновенного обмена сообщениями).

Если попытаться выполнить загруженный сценарий, PowerShell выдаст такое сообщение об ошибке:

Нельзя загрузить файл C:\remote.ps1. Файл C:\remote.ps1 не содержит цифровой подписи. Сценарий не будет выполнен.

Более подробные сведения, см. в разделе "Get-Help about_signing"

Перед выполнением сценария, просмотрите исходный код, чтобы убедиться в его надѐжности. Сценарии позволяют сделать то же, что и исполняемые программы. Для выполнения неподписанного сценария необходимо будет его разблокировать с помощью свойств файла в оболочке Windows. Если файл сценария имеет цифровую подпись, но ее издатель не помечен как надежный, PowerShell выполнит сценарий с запросом подтверждения.

Политика выполнения Windows PowerShell хранится в реестре Windows и не удаляется даже при переустановке оболочки Windows PowerShell.

Обзор возможностей Windows PowerShell.

В любом интерфейсе командной строки (CLI), к которым относится и Windows PowerShell, для получения информации используется подход основанный на вводе команд. Перед использованием команд необходимо знать их имена. Хотя можно вводить  сложные  команды,  необходимо  ознакомиться  с  наиболее употребительными командами и параметрами команд.

Большинство интерфейсов командной строки не содержит структур, которые могли бы помочь пользователю освоить интерфейс. Так как интерфейсы командной строки были первыми оболочками операционных систем, многие имена команд и параметров выбирались произвольно. Лаконичные имена команд обычно использовались для большей ясности. Хотя в большинство CLI встроены справочные системы и стандарты построения команд, эти интерфейсы обычно разрабатывались с учѐтом совместимости с более ранними командами, так что набор команд до сих пор оформлен по решениям, сделанным десятилетия тому назад.

Оболочка  Windows  PowerShell  сконструирована  таким  образом,  чтобы пользователь мог воспользоваться знаниями, полученными при работе с более ранними интерфейсами командной строки. Необходимо подробно рассмотреть некоторые базовые средства и концепции, которые можно использовать для быстрого изучения оболочки Windows PowerShell. Эти средства и концепции включают в себя:

1.использование команды Get;

2.использование Cmd.exe и команд ОС UNIX;

3.использование внешних команд;

4.использование функции автозавершения при помощи клавиши TAB; 5. использование команды Get-Help.

Работа с объектами.

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

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

С технической точки зрения объект .NET — это экземпляр класса .NET, состоящий из данных и операций, определѐнных для этих данных. Объект можно рассматривать как сущность, имеющую свойства (характеристики сущности) и методы (действия, которые можно выполнять над сущностью).

Например, при возврате службы средствами оболочки Windows PowerShell на самом деле возвращается объект, представляющий соответствующую службу. При просмотре сведений о службе отображаются свойства объекта-службы. При запуске службы, то есть при изменении ее свойства Status на «started», выполняется метод объекта-службы.

Все объекты одного типа имеют одни и те же свойства и методы, однако значения свойств каждого экземпляра объекта могут быть разными. Например, каждый объект-служба имеет свойства Name и Status. Однако имя и статус одной службы могут отличаться от имени и статуса любой другой службы.

Получить сведения об объектах несложно. Чтобы узнать, объект какого типа получен командлетом, передайте результат выполнения команды «get» команде GetMember с помощью оператора конвейерной обработки (|). Например, следующая команда передает объекты, возвращенные командой Get-Service, команде Get-Member:

Get-service | Get-member

Отображаются сведения об объекте-службе, в том числе имя типа объекта (System.ServiceProcess.ServiceController) и список его свойств и методов. 

Для получения более подробной справки по работе со свойствами и методами конкретного типа объекта можно, затем, воспользоваться справочной системой MSDN или .NET Framework SDK.

Работа с командлетами.

В оболочку PowerShell встроено свыше 100 команд. Можно создавать дополнительные команды, но при этом следует пользоваться языком стандарта .NET, таким как Visual Basic .NET или C#. Каждый вариант команды представляет собой комбинацию «глагол-существительное»; объясняется это тем, что разработчики хотели использовать единообразную схему именования и тем самым облегчить изучение, а также расширение оболочки PowerShell. Глагол указывает на действие, которое предстоит совершить, а существительное — на тип объекта, на который будет направлено действие. К примеру, команда Get-ChildItem считывает список элементов текущего рабочего каталога или контейнера, например реестра. Для выполнения команды нужно ввести ее в командной строке PowerShell и нажать клавишу ввода. 

Если неизвестно, существует ли команда для решения задачи, которую предстоит выполнить, можно просмотреть список всех команд, выполнив команду Get-Command. Список выводимых команд можно уменьшить при помощи шаблона с подстановочными символами:

Get-Command get*

Оболочка Windows PowerShell может выполнять и другие команды, отличные от командлетов, например, бинарные исполняемые файлы. Оболочка Windows PowerShell поддерживает сценарии, аналогичные сценариям оболочки UNIX и пакетным файлам Cmd.exe, но имеющие в имени файла расширение PS1. Windows PowerShell позволяет также создавать внутренние функции, которые могут использоваться непосредственно в интерфейсе или в сценариях.

Средства ускорения ввода команд.

К средствам ускорения ввода команд в PowerShell относится автозавершение строки с помощью клавиши Tab, использование истории команд с помощью клавиши F7 и задание псевдонимов.

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

Автоматическое завершение имен команд выглядит несколько по-иному. Для использования расширения табуляции в имени команды необходимо ввести глагол и дефис, следующий за глаголом. Повторные нажатия Tab позволят пройти по списку команд, начинающихся с введенной строки.

Для навигации по истории введенных команд можно пользоваться стрелками вверх и вниз, а можно воспользоваться клавишей F7. 

Механизм псевдонимов связывает вводимое имя команды с другой командой. К примеру, внутренняя функция Clear-Host, очищает окно для выводимых данных. Если в командной строке ввести команду cls или clear, Windows PowerShell интерпретирует это как псевдоним для функции Clear-Host и выполняет функцию Clear-Host.

Далее приводится краткий список общих команд Cmd.exe и ОС UNIX, которые можно использовать в оболочке Windows PowerShell:

cat  dir  mount  rm cd  echo  move  rmdir chdir  erase  popd  sleep clear  h  ps  sort cls  history  pushd  tee copy  kill  pwd  type del  lp  r  write diff  ls  ren 

Для получения действительного имени собственной команды Windows

PowerShell, можно для этого использовать команду Get-Alias. 

Оболочка Windows PowerShell предоставляет набор стандартных псевдонимов, основанных на сокращѐнных именах для обычных глаголов и существительных. Это позволяет сформировать базовый набор легко читаемых псевдонимов для общих команд, если известны сокращѐнные имена. Например, в стандартных псевдонимах глагол Get сокращается до g, глагол Set сокращается до s, существительное Item сокращается до i, существительное Location сокращается до l и существительное Command сокращается до cm.

Для создания псевдонима в рамках текущего сеанса можно воспользоваться командой Set-Alias. К примеру, чтобы создать псевдоним cnt для обращения к Get-

Content, нужно выполнить команду

Set-Alias cnt Get-Content

После этого всякий раз, когда потребуется выполнить команду Get-Content, можно будет использовать псевдоним cnt. Этим псевдонимом можно будет пользоваться до завершения сеанса (т.е. до закрытия оболочки PowerShell). Необходимо учитывать, что при определении псевдонима возможность включения параметров не предусмотрена; можно использовать только имя команды.

Использование переменных и типов данных.

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

Чтобы создать переменную, нужно ввести допустимое имя переменной. Создать переменную и присвоить ей какое-либо значение можно одним действием. Windows PowerShell создает переменную, только если она еще не существует, в противном случае указанное значение присваивается существующей переменной.

Для сохранения текущего местоположения в переменной $loc следует ввести: $loc = Get-Location

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

Для отображения сведений о содержимом переменных можно воспользоваться командлетом Get-Member. Передача переменной $loc по конвейеру командлету Get-

Member показывает, что это объект класса PathInfo, также как и вывод командлета Get-Location.

В некоторых случаях может потребоваться явно указать тип данных для переменной. Для этого используется оператор квадратные скобки. Следующий сценарий определит две переменные разных типов:

[int] $i = 1

[double] $d = 1

Типом данных для переменной PowerShell может выступать любой тип .NET Framework.

Действия со строками.

Администраторы часто работают с данными в форме строк. В PowerShell это простой процесс. Так, в следующем примере строка «cat» назначается переменной $a, затем отображается результат, то есть cat:

$a = "cat"; $a

Поскольку строка назначается переменной $a, PowerShell автоматически приводит $a к типу System.String. Можно использовать метод GetType и его свойство FullName, чтобы определить тип данных переменной. Например, команда a.GetType ().FullName возвращает результат System.String. Чтобы объединить строки, используется оператор конкатенации (+). Например, следующий программный код добавляет строку " & dog " (вместе с пробелами) к переменной $a, а затем отображает результат, то есть cat & dog: $a = $a + " & dog "; $a

В строку можно добавить числовое значение. При этом число автоматически преобразуется в строку. Например, следующий программный код добавляет 10 к переменной $a, а затем выводит на экран результат, cat & dog 10: $a = $a + 10; $a

Если проверить тип данных, то это будет String, то есть произойдет неявное преобразование типа.

Действия с числами.

Работать с числовыми данными в PowerShell так же просто, как со строковыми. Числовые значения назначаются как строковые, единственное различие — числовые значения не заключаются в кавычки. Если указано числовое значение, PowerShell автоматически присваивает значению один из четырех типов данных:

1.     System.Int32, 32-разрядное целое (псевдоним [int]).

2.     System.Int64, 64-разрядное целое (псевдоним [long]).

3.     System.Double, 8-байтное   вещественное      число          с        плавающей        запятой

(псевдоним [double]).

4.     System.Decimal, 12-байтное вещественное число (псевдоним [decimal]).

Decimal, в отличие от Double, использует точную арифметику.

Следующие инструкции демонстрируют, как PowerShell назначает типы данных числовым значениям:

$a = 1234; $a

$a.GetType().FullName

$a = 12345678910; $a

$a.GetType().FullName

$a = 1234.5678; $a

$a.GetType().FullName

$a = 1234.5678d; $a

$a.GetType().FullName

Однако, чтобы назначить тип Decimal, необходимо прямо указать символ d после числа; в противном случае PowerShell обрабатывает значение как тип Double. Для соединения числовых значений можно использовать знак «плюс». При этом числовые значения складываются, а не сцепляются, как строковые. Например, следующие инструкции назначают значение 1234 переменной $a, а затем добавляют 1.5678 к $a:

$a = 1234; $a

$a.GetType ().FullName

$a = $a + 1.5678; $a

$a.GetType ().FullName

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

Действия с массивами.

Массивы представляют собой коллекции типа System.Object []. Символы [] после типа данных показывают, что это массив со многими значениями. PowerShell автоматически назначает массивам тип Object []. К примеру, $a = "a","b","c"; $a создаѐт массив с тремя строковыми переменными, а затем возвращает результаты.

Для доступа к отдельным элементам массива используется индекс. Индексы массивов начинаются с 0, поэтому для доступа к первому элементу указывается имя массива, за которым следует индекс в скобках, например $a [0].

Эта инструкция возвращает результат a. Если нужно обратиться к более чем одному значению, просто укажите соответствующее число инструкций.

Например, инструкции $a [1]; $a [2] возвращают результаты

b c

Добавить элемент в массив можно с помощью оператора «плюс». Например, программный код $a = $a + "d"; $a добавляет d к массиву $a, а затем отображает результаты:

Когда элемент d добавляется к массиву, PowerShell назначает ему следующий по порядку индекс (3). 

Действия с хеш-таблицами.

Хеш-таблицы (или ассоциативные массивы) — коллекции, которые принимают тип данных System.Collections.Hashtable. Основное различие между хеш-таблицами и массивами заключается в том, что для идентификации элементов в хеш-таблицах используются именованные ключи вместо индексов. Например, в следующем примере назначаются три ключа и их значения к хеш-таблице $a, а затем отображается содержимое таблицы и тип данных:

$a = @{b="bird"; c="cat"; d="dog"}; $a

$a.GetType ().FullName

Как видно из первой строки, хеш-таблица строится с использованием символа @, за  которым  следуют  фигурные  скобки,  заключающие  коллекцию  пар ключ/значение. Первая пара ключ/значение — b/bird.

Можно получить список ключей хеш-таблицы с использованием свойства Keys, Например, инструкция $a.Keys | sort получает ключи хеш-таблицы $a, а затем использует команду Sort-Object (накоторую указывает псевдоним sort) для сортировки ключей в алфавитном порядке.

Аналогично можно использовать свойство Values для извлечения значений хеш- таблицы, как показывает инструкция $a.Values | sort можно также извлечь отдельное значение, ссылаясь на ключ, как в инструкции $a.b либо $a[―b‖].

Чтобы добавить пару ключ/значение в хеш-таблицу, можно сослаться на новый ключ как на существующий, а затем ввести значение нового ключа, как в следующем примере: $a.e = "elephant"; $a

Чтобы изменить значение существующего ключа, можно сослаться на ключ и ввести новое значение, например $a.d = "dingo"; $a

В этом примере пара d/dog заменяется на d/dingo.

Удалить пару ключ/значение можно с помощью метода Remove. Например, удаление пары d/dingo:

$a.remove ("d"); $a

Приведение и преобразование типов данных.

PowerShell позволяет производить как приведения, так и преобразования типов данных. Например, предположим, что значение «10» обрабатывается как числовое значение, а не как строка. С помощью следующего кода можно создать переменную, которая содержит значение типа Double, хотя начальное значение — строка:

$a = [double] "10"

$a.GetType().FullName

Заметим, что тип Double указывается перед значением. Того же результата можно достичь с помощью кода:

[double] $b = "10"

$a.GetType ().FullName

Однако между двумя подходами есть различие. В первом случае значение просто заменяется на тип System.Double. При втором подходе выполняется строгий контроль типа переменной, то есть этой переменной можно назначать только значения того же типа данных. Проверить различие можно, попытавшись назначить строковое значение переменным $a и $b.

$a = "ten"; $a

$b = "ten"

Можно также контролировать тип данных, назначаемый массиву. Например, программный код

$c = [double[]] ("1","2","3")

$c.GetType().FullName

назначает тип System.Double [] массиву $c вместо выбираемого по умолчанию типа System.Object []. Символы [] означают, что это по-прежнему массив со многими значениями. Следующий фрагмент программного кода приносит те же результаты:

[double[]] $d = ("1","2","3") $d.GetType ().FullName

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

$c[2] = "ten"

$d[2] = "ten" ничего не получится.

Иногда требуется преобразовать тип данных существующей переменной. Например, преобразовать переменную date-time в строковую переменную можно с помощью программного кода

$e = Get-Date

$e.GetType().FullName

$e = [string] $e

$e.GetType().FullName

Создание объектов .NET.

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

New-Object -TypeName System.Diagnostics.EventLog

Хотя команда и создала экземпляр класса EventLog, этот экземпляр не содержит данных. Это происходит в связи с тем, что не был указан определенный журнал событий.

Чтобы обратиться к определенному журналу событий, нужно указать его имя. Командлет New-Object имеет параметр ArgumentList. Значения, передаваемые в этом параметре, используются специальным методом запуска объекта. Этот метод называет конструктором, поскольку используется для создания объекта.

Например, чтобы получить ссылку на журнал приложений, нужно указать строку «Application» в качестве аргумента:

New-Object -TypeName System.Diagnostics.EventLog - ArgumentList Application

Использование статических классов и методов.

Не все классы .NET Framework можно создать с помощью командлета NewObject. Классы являются библиотеками ссылок для методов и свойств, не изменяющих свое состояние. Нет необходимости в их создании — их можно просто использовать. Классы и методы, подобные этим, называются статическими классами, поскольку они не создаются, не уничтожаются и не изменяются.

Обычно при работе с объектом в оболочке Windows PowerShell в первую очередь используется командлет Get-Member, чтобы просмотреть элементы объекта. Для статических классов эта процесс выглядит несколько иначе, поскольку класс не является объектом как таковым.

Обращение к статическому классу возможно при заключении имени класса в квадратные скобки. Например, ссылка на System.Environment состоит из имени класса внутри скобок. При использовании командлета New-Object оболочка Windows PowerShell автоматически подразумевает наличие определения «System» в имени. То же самое происходит при заключении имени в скобки, поэтому ссылку

[System.Environment] записать просто как [Environment].

В классе System.Environment содержатся общие данные о рабочей среде текущего процесса, то есть процесса powershell.exe, при работе в оболочке Windows PowerShell.

Если для просмотра подробных сведений об этом классе вводится команда [System.Environment] | Get-Member то будет сообщен тип объекта System.RuntimeType, а не System.Environment.

Для просмотра статических элементов с помощью командлета Get-Member необходимо указать параметр Static:

[Environment] | Get-Member -Static -MemberType Property

Свойства класса System.Environment являются статическими, как и сам класс, и способ их задания отличается от указания обычных свойств. Знак «::» используется для указания в PowerShell, что работа ведется со статическими методами или свойствами. К примеру, чтобы увидеть команду, используемую для запуска

PowerShell, следует использовать свойство CommandLine:

[Environment]::Commandline

Конвейерная обработка.

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

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

Каждая команда генерирует объект и передает его по конвейеру. Принимающая команда использует полученный объект в качестве входных данных и генерирует собственные выходные данные опять же в виде объекта. Команды объединяются в конвейер с помощью оператора конвейера (|).

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

Обход элементов в конвейере.

Командлет ForEach-Object использует блоки сценариев и дескриптор $_ для текущего объекта конвейера, чтобы та или иная команда была выполнена для всех объектов конвейера. Эта возможность позволяет выполнить некоторые сложные действия.

Одним из них является обработка данных с целью повышения их применимости. Например, класс Win32_LogicalDisk из инструментария управления Windows может использоваться для просмотра сведений о свободном месте на каждом локальном диске.

Get-WmiObject -Class Win32_LogicalDisk

Значение свойства FreeSpace можно преобразовать в мегабайты, дважды разделив исходное значение на 1048576 (1024x1024). Для этого в блоке сценария ForEach-Object нужно ввести:

                Get-WmiObject      -Class      Win32_LogicalDisk      |      ForEach-Object      -Process

{($_.FreeSpace)/1048576}

Создание производных объектов.

Командлет Select-Object позволяет создавать новые объекты Windows PowerShell, которые содержат избранные свойства существующих объектов, используемых при создании новых. Чтобы создать новый объект, который содержит только свойства Name и FreeSpace WMI-класса Win32_LogicalDisk, введите следующее:

Get-WmiObject-Class Win32_LogicalDisk | Select-Object - Property Name,FreeSpace

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

Get-WmiObject -Class Win32_LogicalDisk | Select-Object -Property Name,FreeSpace | Get-Member

Командлет Select-Object имеет достаточно широкое применение. Одним из примеров является репликация данных, которые затем можно изменить. Значение свойства FreeSpace вновь созданных объектов можно обновить, и выводимые данные будут содержать описательную метку:

                Get-WmiObject     -Class     Win32_LogicalDisk     |     Select-Object      -     Property

Name,FreeSpace | ForEach-Object –Process 

{$_.FreeSpace = ($_.FreeSpace)/1024.0/1024.0; $_}

Сортировка объектов.

С помощью командлета Sort-Object отображаемые данные можно организовать таким образом, чтобы упростить их просмотр. Командлету Sort-Object передаются имена свойств, по которым нужно произвести сортировку, и возвращает данные отсортированными по значениям этих свойств.

Рассмотрим проблему перечисления экземпляров класса Win32_SystemDriver. Чтобы отсортировать данные сначала по свойству State, а затем по свойству Name, необходимо ввести следующую команду:

Get-WmiObject -Class Win32_SystemDriver | Sort-Object -Property State,Name |

Format-Table –Property Name,State,Started,DisplayName -AutoSize -Wrap

Объекты можно отсортировать в обратном порядке, для чего требуется указать параметр Descending. Это изменяет порядок сортировки таким образом, что имена сортируются в обратном алфавитном порядке, а числа — по убыванию.

Get-WmiObject -Class Win32_SystemDriver | Sort-Object - Property State,Name -

Descending | Format-Table –Property Name,State,Started,DisplayName -AutoSize Wrap

Форматирование вывода.

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

Format-командлетами являются командлеты Format-Wide, Format-List, Format-

Table и Format-Custom. Мы рассмотрим командлеты Format-Wide, Format-List и Format-Table.

Каждый командлет форматирования имеет свойства по умолчанию, которые используются, если не задается отображение каких-либо определенных свойств. Для задания — какие свойства необходимо отобразить, каждый командлет использует также одно и то же имя параметра Property. Так как командлет Format-Wide отображает только одно свойство, для его параметра Property задается только одно значение, но в качестве значений параметров свойств командлетов Format-List и Format-Table задается список имен свойств.

Формирование вывода с одним элементом.

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

Можно также задать свойство, отличное от свойства «по умолчанию»:

Get-Process -Name powershell | Format-Wide Id

При помощи командлета Format-Wide в определенный момент времени можно отобразить только одно свойство. Это может быть полезным при отображении простых списков, в которых в каждой строке отображается только один элемент.

Параметр Column указывает, на сколько колонок будет разделяться вывод. Для получения простой распечатки можно установить значение параметра Column равным

1. 

Форматирование представления списка.

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

Можно указать произвольное число свойств:

Get-Process -Name powershell | Format-List –Property ProcessName,Id или сокращенный вариант той же команды: Get-Process powershell | fl ProcessName,Id

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

Get-Process -Name powershell | Format-List -Property *

Хотя команда Format-List и полезна для вывода подробных сведений, если нужно получить сведения, содержащие много элементов, обычно удобнее использовать упрощенное табличное представление.

 

Получение вывода в виде таблицы.

Если использовать командлет Format-Table без указания имен свойств для форматирования вывода команды Get-Process, будет получен точно такой же вывод, что и без использования форматирования. Причина состоит в том, что процессы обычно показываются в виде таблицы, как и большинство объектов Windows

PowerShell.

Get-Process -Name powershell | Format-Table

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

Get-Process -Name powershell | Format-Table –Property Path,Name,Id,Company

Если указать параметр AutoSize при выполнении команды Format-Table, Windows PowerShell вычислит ширину столбцов на основании ширины реально

отображаемых данных. Это улучшит внешний вид столбца Path, но значение столбца с названием компании останется обрезанным:

Get-Process -Name powershell | Format-Table –Property Path,Name,Id,Company -

AutoSize

Командлет Format-Table может обрезать данные, но это происходит только на правой границе экрана. Свойствам, за исключением последнего отображаемого, выделяется столько места, сколько нужно для корректного вывода самого длинного элемента данных. Название компании будет видно полностью, но путь будет обрезан, если поменять местами элементы Path и Company в списке значений  Property.  Команда  Format-Table  предполагает,  что  свойство, расположенное ближе к началу списка свойств, является более важным. В связи с этим предпринимается попытка отобразить полностью свойства, находящиеся ближе всего к началу. Если команда Format-Table не может отобразить все свойства, она удалит некоторые столбцы из вывода и выдаст предупреждение. Это поведение можно увидеть, если поместить свойство Name в конец списка.

Можно принудительно перенести длинные данные вывода командлета FormatTable на следующую строку в пределах столбца с помощью параметра Wrap.

Использование параметра Wrap в отдельности не всегда приводит к ожидаемому результату, поскольку используются установки по умолчанию, если также не указан параметр AutoSize:

Get-Process -Name powershell | Format-Table -Wrap –Property Name,Id,Company,

Path

Преимуществом использования параметра Wrap без других параметров является то, что обработка при этом не замедляется существенным образом. Использование параметра AutoSize во время выполнения рекурсивного вывода списка файлов в большом каталоге может потребовать значительного объема памяти и времени перед отображением первых элементов вывода.

Если загрузка системы не имеет решающего значения, параметр AutoSize хорошо работает в сочетании с параметром Wrap. Начальным столбцам всегда выделяется необходимый размер для вывода элементов в одной строке, как и при указании параметра AutoSize без параметра Wrap. Единственное отличие состоит в том, что последний столбец будет при необходимости перенесен на следующую строку:

Get-Process -Name powershell | Format-Table -Wrap –AutoSize -Property

Name,Id,Company,Path

Организация табличного вывода.

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

Get-Process -Name powershell | Format-Table -Wrap –AutoSize -Property Id,Path -

GroupBy Name

Перенаправление данных.

Windows PowerShell предоставляет несколько командлетов, которые позволяют напрямую управлять выводом данных. Эти командлеты обладают двумя общими важными характеристиками.

Во-первых,  они  обычно  преобразуют  данные  в  некоторое  текстовое представление. Преобразование выполняется, поскольку данные выводятся в системные компоненты, ожидающие текстовый ввод. Это означает, что объекты должны быть представлены в текстовом виде. Поэтому текст форматируется в виде, пригодном для отображения в окне консоли PowerShell.

Во-вторых, эти команды используют глагол PowerShell Out, поскольку отправляют сведения из PowerShell за пределы оболочки. Командлет Out-Host не является исключением: окно главного приложения отображается вне PowerShell. Это важно, поскольку при передаче из PowerShell данные в действительности удаляются. Убедиться в этом можно, если попытаться создать конвейер, который постранично передает данные в окно главного приложения и пытается отформатировать их в виде списка, как показано ниже:

Get-Process | Out-Host -Paging | Format-List

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

Get-Process | Format-List | Out-Host -Paging

Это относится ко всем командлетам Out. Командлет Out всегда должен находиться в конце конвейера.

Все командлеты Out подготавливают вывод в виде текста, используя текущее форматирование для окна консоли, включая ограничения на длину строки. Для разбиения данных на страницы можно также использовать функцию more. В Windows PowerShell функция more вызывает команду Out-Host -Paging.

Следующая команда демонстрирует использование функции more для разбиения на страницы вывода командлета Get-Command:

Get-Command | more

Если в качестве параметров этой функции указать одно или несколько имен файлов, функция прочитает указанные файлы и разобьет на страницы их содержимое при передаче в главное приложение:

more \autoexec.bat

Отбрасывание ненужного вывода.

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

Get-Command | Out-Null

Командлет Out-Null не отбрасывает сообщения об ошибках. Например, если ввести следующую команду, будет отображено сообщение о том, что оболочка Windows PowerShell не распознала вызов «Is-NotACommand»: Get-Command Is-NotACommand | Out-Null

Печать данных.

Данные можно распечатать при помощи командлета Out-Printer. Командлет Out- Printer использует принтер по умолчанию, если не указано имя принтера. Можно использовать любой принтер Windows, указав его отображаемое имя. Отсутствует необходимость как в привязке порта принтера, так и в присутствии реального физического принтера. Например, если имеются установленные средства создания документов XPS, можно создать документ, введя следующее:

Get-Command | Out-Printer -Name "Microsoft XPS Document Writer"

Сохранение данных.

Можно направить вывод в файл вместо окна консоли с помощью командлета Out-File. Следующая команда направляет список процессов в файл C:\processlist.txt:

Get-Process | Out-File -FilePath C:\processlist.txt

Результаты использования командлета  Out-File не всегда соответствуют ожидаемым, если пользователь привык к традиционному перенаправлению вывода. Чтобы разобраться в его поведении, следует учесть контекст, в котором выполняется командлет Out-File.

По умолчанию командлет Out-File создает файл в формате Юникод. Это наилучшее долговременное решение, но средства, которые принимают на входе файлы ASCII, не будут корректно работать с таким форматом вывода по умолчанию.

Формат вывода по умолчанию можно изменить на ASCII с помощью параметра Encoding:

Get-Process | Out-File -FilePath C:\processlist.txt -Encoding ASCII

Командлет Out-file форматирует содержимое файла так, чтобы оно выглядело аналогично выводу консоли. Это приводит к обрезанию вывода, как это чаще всего и происходит в окне консоли. Предположим, например, что выполняется следующая команда:

Get-Command | Out-File -FilePath output.txt

Чтобы получить вывод, который не использует переносы для обеспечения соответствия ширине экрана, можно воспользоваться параметром Width для указания ширины строки. Поскольку параметр Width представляет собой 32-разрядное целое число, его максимальное значение может быть равно 2147483647.

Чтобы установить ширину строки в максимальное значение, введите следующее: Get-Command | Out-File -FilePath c:\temp\output.txt –Width 2147483647

Командлет Out-File наиболее полезен, когда нужно сохранить вывод в том же виде, в каком он отображается на консоли.

Windows PowerShell. Общие сведения

Windows PowerShell. Общие сведения

Таким образом, PowerShell по своей мощности и эффективности намного превосходит традиционные командные оболочки

Таким образом, PowerShell по своей мощности и эффективности намного превосходит традиционные командные оболочки

Если установлена политика выполнения

Если установлена политика выполнения

Оболочка Windows PowerShell сконструирована таким образом, чтобы пользователь мог воспользоваться знаниями, полученными при работе с более ранними интерфейсами командной строки

Оболочка Windows PowerShell сконструирована таким образом, чтобы пользователь мог воспользоваться знаниями, полученными при работе с более ранними интерфейсами командной строки

Например, при возврате службы средствами оболочки

Например, при возврате службы средствами оболочки

Для выполнения команды нужно ввести ее в командной строке

Для выполнения команды нужно ввести ее в командной строке

Механизм псевдонимов связывает вводимое имя команды с другой командой

Механизм псевдонимов связывает вводимое имя команды с другой командой

Использование переменных и типов данных

Использование переменных и типов данных

Администраторы часто работают с данными в форме строк

Администраторы часто работают с данными в форме строк

GetType().FullName $a = 12345678910; $a $a

GetType().FullName $a = 12345678910; $a $a

Добавить элемент в массив можно с помощью оператора «плюс»

Добавить элемент в массив можно с помощью оператора «плюс»

Чтобы изменить значение существующего ключа, можно сослаться на ключ и ввести новое значение, например $a

Чтобы изменить значение существующего ключа, можно сослаться на ключ и ввести новое значение, например $a

System.Double [] массиву $c вместо выбираемого по умолчанию типа

System.Double [] массиву $c вместо выбираемого по умолчанию типа

New-Object -TypeName System.Diagnostics

New-Object -TypeName System.Diagnostics

Если для просмотра подробных сведений об этом классе вводится команда [System

Если для просмотра подробных сведений об этом классе вводится команда [System

Первый результат возвращается в то же время, что и последний

Первый результат возвращается в то же время, что и последний

Get-WmiObject -Class Win32_LogicalDisk |

Get-WmiObject -Class Win32_LogicalDisk |

Имена всех этих командлетов начинаются глаголом

Имена всех этих командлетов начинаются глаголом

Get-Process -Name powershell |

Get-Process -Name powershell |

Это улучшит внешний вид столбца

Это улучшит внешний вид столбца

AutoSize без параметра Wrap. Единственное отличие состоит в том, что последний столбец будет при необходимости перенесен на следующую строку:

AutoSize без параметра Wrap. Единственное отличие состоит в том, что последний столбец будет при необходимости перенесен на следующую строку:

Get-Process | Out-Host -Paging |

Get-Process | Out-Host -Paging |

PowerShell не распознала вызов «Is-NotACommand»:

PowerShell не распознала вызов «Is-NotACommand»:

Чтобы получить вывод, который не использует переносы для обеспечения соответствия ширине экрана, можно воспользоваться параметром

Чтобы получить вывод, который не использует переносы для обеспечения соответствия ширине экрана, можно воспользоваться параметром
Материалы на данной страницы взяты из открытых истончиков либо размещены пользователем в соответствии с договором-офертой сайта. Вы можете сообщить о нарушении.
24.02.2017