Обзор технологии Microsoft Windows PowerShellMicrosoft ® 1 Назначение PowerShell 2 Установка Windows PowesShell 6 Назначение PowerShell 7


Расширенные возможности конвейеров



Скачать 13.55 Mb.
страница14/27
Дата29.11.2016
Размер13.55 Mb.
Просмотров5779
Скачиваний0
ТипОбзор
1   ...   10   11   12   13   14   15   16   17   ...   27

Расширенные возможности конвейеров


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

Большинство командлетов Windows PowerShell поддерживают множество параметров; каждый параметр предназначен для приема входящих данных определенного типа. Например, закройте все запущенные копии Windows Notepad, а затем откройте новый документ Windows Notepad. Запустите команду:



Get-Process

Обратите внимание, что ваш документ Windows Notepad появился в списке. Попробуйте остановить процесс, запустив команду:



Stop-Process notepad

Почему вы видите ошибку? В сообщении об ошибке указано, что оболочка не смогла привязать параметр ID, потому что она не смогла конвертировать наши входящие данные, notepad, в 32-битное целое число. Сейчас загляните в раздел справочника, где описывается работа Stop-Process:



Help Stop-Process

Обратите внимание на различные наборы параметров. Набор параметров – это группа параметров, которые могут использоваться вместе. Некоторые параметры могут входить в разные наборы. Например, предположите, что набор параметров А включает параметры –computername и –id. Набор параметров В включает параметры –computername, –name, и –noclobber. Это означает, что вы не можете использовать одновременно параметр –id и параметр –name, так как они находятся в разных наборах параметров. Однако вы можете использовать –id вместе с – computername, поскольку они оба находятся в одном наборе. В первом наборе параметров командлета Stop-Process параметр ID является не опционным, то есть, вы должны указать значение для него. Однако настоящее имя параметра, -id, является опционным – оно заключено в квадратные скобки. Когда мы запустили Stop-Process без указания параметра, оболочка решила, что мы указали «notepad» в качестве значения параметра –id. Но параметр –id требует Int32 – 32-битного целого числа, а «notepad» не может быть конвертирован в этот тип данных.

Третий набор параметров может принимать имя процесса в виде строки, но если вы решите использовать эту технику, то параметр –name не будет опционным. Попробуйте:

Stop-Process –name notepad

Это сработало, так как оболочка поняла, что «notepad» относится к параметру –name, а не –id. Суть всего описанного заключается в том, что все параметры слегка отличаются друг от друга, и каждый из них предназначен для приема данных определенного типа.


Позиционные параметры


Если вы увидите в справочном описании командлета что-то вроде этого:



Stop-Process [-Id]

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



Stop-Process –id 53

Или


Stop-Process 53

До тех пор, пока соответствующий тип данных расположен в соответствующем месте (в данном случае на первой позиции), оболочка буде знать, что делать. Данную информацию можно найти в разделе с полным описанием командлета в справочнике:



Help Stop-Process –full

Здесь вы можете увидеть, что параметр является позиционным, что он занимает позицию номер 1 и является обязательным:



-Id

Specifies the process IDs of the processes to be stop

type "get-process". The parameter name ("Id") is optio

(Этот параметр уточняет ID процессов, которые необходимо остановить. Наберите "get-process". Параметр имени («Id») является опционным:)

Required? true

Position? 1

Default value

Accept pipeline input? true (ByPropertyName)

Accept wildcard characters? False

Вот еще один пример из раздела описания командлета Get-ChildItem в справочнике:



Get-ChildItem [[-Path] ] [[-Filter] ] [-Exclude ]

В данном примере весь параметр –path является опционным. Как вы видите, весь параметр, включая тип данных string[], заключен в квадратные скобки. Однако само имя параметра –path находится в отдельных квадратных скобках. Это означает, что параметр является опционным, и если вы захотите использовать его, вы можете опустить его имя, если его значение указано на первой позиции. Параметр –filter также является опционным и позиционным, параметр –exclude – опционным, но не позиционным. Если вы захотите использовать –exclude, вы будете должны указать его имя.

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

Dir –path c:\

Но поскольку –path является позиционным параметром, вы можете набрать более простую и привычную команду:



Dir c:\

Однако использование имен параметров имеет два преимущества:

• Это делает команду намного более понятной для кого бы то ни было, поскольку имя параметра позволяет лучше разобраться в том. Что происходит.

• Когда вы используете имя параметра, вы можете расположить параметры в любом порядке, и вам не придется каждый раз запоминать нужный порядок.

Например, обратите внимание на команду:

Add-Member NoteProperty ComputerName LON-DC1

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



Add-Member –memberType NoteProperty –Name ComputerName –Value LON-DC1

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

Вы использовали позиционные параметры в течение всего курса. Dir, который, конечно, является псевдонимом для командлета Get-ChildItem может стать ярким примером. Where-Object – еще одним примером. Рассмотрим команду:

Get-Service | Where-Object { $_.Status –eq “Running” }

Вот та же самая команда, но все имена параметров в ней напечатаны полностью:



Get-Service | Where-Object –FilterScript { $_.Status –eq “Running”}

Привязка данных конвейера по значению


До настоящего времени мы фокусировали ваше внимание на командлетах, для которых вы указывали параметры, либо по имени, либо по позиции. Однако многие параметры предназначены для того, чтобы принимать данные из конвейера. В действительности, когда вы передаете данные от одного командлета к другому, командлет, который принимает данные, должен присоединить или привязать входящие объекты к одному из своих параметров. Рассмотрим команду:



Get-Service | Where-Object { $_.Status –eq “Running” }

Здесь вы передаете объекты командлету Where-Object. Но что именно делает Where-Object с этими объектами? Заглянем в справочник.



-InputObject


Specifies the objects to be filtered. You can a

(Указывает, какие объекты следует отфильтровать. )

Required? false

Position? named

Default value

Accept pipeline input? true (ByValue)

Accept wildcard characters? False

Командлет поддерживает только два параметра: -FilterScript и –InputObject. Критерий фильтрации передается параметру –FilterScript по позиции. Что же происходит с –InputObject? –InputObject привязывается к входящим из конвейера данным. Из справочника вы можете узнать, что этот параметр принимает входящие данные по значению. Тип входящих данных, который он требует, указан прямо рядом с именем параметра -


.. Это означает, что принимаются объекты любого типа. В справочнике говорится: «Указывает, какие объекты следует отфильтровать». Это означает, что этот параметр содержит объекты, подлежащие фильтрации.

Как это работает:

1. Get-Service обрабатывает и производят ряд служебных объектов.

2. Служебные объекты передаются командлету Where-Object.

3. Where-Object «видит», что есть данные для параметра –FilterScript.

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

5. Where-Object определяет, что его собственный параметр может принять этот тип данных по значению.

Многие командлеты могут привязывать входящие данные по значению. Найдите в справочнике полную информацию по таким командлетам как Stop- Process, Stop-Service, Start-Service, Remove-ChildItem и другим.

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

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


Этот тип привязки входящих данных является более сложным. В рамках данной техники оболочка ищет имя параметра, после чего проверяют, обладают ли входящие объекты соответствующими свойствами. Если да – соответствующее свойство привязывается к параметру. Обратите внимание, что данный тип привязки встречается только тогда, когда оболочка не смогла привязать входящие данные по значению. Например, изучите справочную информацию по командлету Invoke-Command. Обратите внимание, что параметр –inputObject привязывает входящие данные по значению и принимает такой тип входящих данных, как объекты [object]. Этот тип объектов [object] является общим типов. По сути все что угодно можно назвать объектом. Это означает, что –inputObject всегда будет привязывать входящие данные по значению. То есть, для параметра не будет возможности привязать входящие данные по имени свойства.

Изучите полную информацию по командлету Get-Service, и вы обнаружите следующий параметр:

-ComputerName

Gets the services running on the specified computers

Type the NetBIOS name, an IP address, or a fully qua

, a dot (.), or "localhost".

This parameter does not rely on Windows PowerShell or

configured to run remote commands.

Required? false

Position? named

Default value Localhost

Accept pipeline input? true (ByPropertyName)

Accept wildcard characters? False

(Здесь текст был урезан, чтобы поместиться в формат книги; чтобы прочитать его полностью, изучите раздел справочника по командлету Get-Service).

В справочнике указано, что параметр –computername принимает входящие данные из конвейера по имени свойства. Одним из способов запустить данную команду будет:

Get-Service –computername LON-DC1

Можно даже перечислить имена компьютеров через запятую:



Get-Service –computername LON-DC1,SEA-DC1

Однако можно использовать и другую технику – принять входящие данные, используя свойство ComputerName. Например, вы можете создать с помощью Windows Notepad такой файл:



ComputerName

LON-DC1

SEA-DC1

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



Import-CSV computernames.csv

Командлет Import-CSV произведет в качестве выходных данных два объекта, каждый из которых будет обладать свойством ComputerName. Эти объекты можно передать командлету Get-Service:



Import-CSV computernames.csv | Get-Service

Поскольку свойство объектов ComputerName совпадает с параметром –computername, ваши два имени будут отправлены в качестве входящих данных параметру –computername, и командлет Get-Service попытается извлечь данные из обоих компьютеров.

Параметр, осуществляющий привязку по имени свойства, работатет только тогда, когда входящие объекты имеют имя свойства, которое полностью и в точности совпадает с именем параметра (хотя регистр здесь не учитывается). Так, свойство под названием comp не совпадет с параметром –computername.

Переименование свойств


Предположим, вы используете командлет, который генерирует имена компьютеров, и хотите передать эти имена компьютеров другому командлету, который обладает параметром –computername. Проблема в том, что первый командлет может не суметь превратить имена компьютеров в свойство computername. Примером может быть командлет Get-ADComputer.

Мы еще не рассматривали командлеты Active Directory; мы приступим к этому лишь в следующей главе. Пока просто используйте Get-ADComputer в качестве примера. Можете попробовать запустить следующие команды, если вы используете контроллер домена классной комнаты и пользуетесь при этом либо консолью Windows PowerShell, либо Windows PowerShell ISE.

Запустите команды:



Import-Module ActiveDirectory

Get-ADComputer –filter *

Результат будет примерно следующим:



DistinguishedName : CN=SERVER-R2,OU=Domain

Controllers,DC=company,DC=pri

DNSHostName : server-r2.company.pri

Enabled : True

Name : SERVER-R2

ObjectClass : computer

ObjectGUID : 0f04c9d6-44af-4e4f-bb7e-4ebc52ab343f

SamAccountName : SERVER-R2$

SID : S-1-5-21-1842503001-3345498097-2301419571-1000

UserPrincipalName

Данные объекты имеют свойство Name. Это не соответствует параметру –computerName, который привязывает входящие данные по имени свойства. Поэтому, например, данная команда не увенчается успехом:



Get-ADComputer –filter * | Get-Service

Тем не менее, вы можете сделать нечто подобное. Например, использовать Select-Object, чтобы добавить новые свойства объектам. Свойство получит имя computername и будет содержать то же значение, что и существующее свойство name. Вот команда:



Get-ADComputer –filter * | Select

@{Label=”ComputerName”;Expression={$_.Name}}

В результате вы получите объекты, обладающие только одним свойством – ComputerName. Если вы хотите сохранить существующие свойства, вы должны дать команду Select-Object включить эти свойства в выходные данные:



Get-ADComputer –filter * | Select *,

@{Label=”ComputerName”;Expression={$_.Name}}

Добавление символа * к списку свойств означает команду сохранить все свойства из входящих данных. С новым свойством computername данная команда сработает (конечно, учитывая, что у вас есть разрешение на соединение с удаленными компьютерами):



Get-ADComputer –filter * | Select *,

@{Label=”ComputerName”;Expression={$_.Name}} | Get-Service

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


passThru


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



New-ADUser –name JohnD –samaccountname JohnD

Однако никаких выходных данных произведено не будет, и имя пользователя будет находиться в отключенном состоянии. Если вы хотите «оживить» пользователя, то после предыдущей команды запустите такую:



Get-ADUser –filter “name –eq JohnD” | Enable-ADAccount

Однако командлет New-ADUser, так же как и многие другие командлеты действия, поддерживает параметр –passThru. Этот параметр дает командлету команду отправлять в конвейер в качестве выходных данных тот объект, с которым он работал или который он создал. Поэтому, можете попробовать что-то в этом роде:



New-ADUser –name JohnD –samaccountname JohnD –passThru | Enable-ADAccount

Stop-Service – еще один командлет, который поддерживает –passThru. Обычно Stop-Service не производит никаких выходных данных. Однако с помощью –passThru он меняет поведение. Попробуйте:



Get-Service –name BITS | Stop-Service –passthru

Данная команда сгенерирует выходные данные, и вы увидите сервисы, которые командлет пытается закрыть.




Поделитесь с Вашими друзьями:
1   ...   10   11   12   13   14   15   16   17   ...   27


База данных защищена авторским правом ©nethash.ru 2019
обратиться к администрации

войти | регистрация
    Главная страница


загрузить материал