Hello!
Я сам в Powershell являюсь нулевиком плюс.
Поэтому данные заметки ориентированы на таких же начинающих. На тех, кто не имеет опыта не только в Powershell, но и в программировании на других языках. На тех, кто не понимает, как это все вообще устроено и удивляется каждому небольшому открытию.
Нужно сказать, что если вы используете Powershell для администрирования компьютерной сети из десятка серверов и полусотни компьютеров, выгода использования Powershell не всегда очевидна. Однако, когда речь идет о сотнях серверов и тысячах компьютеров, Powershell является вашим спасательным кругом, без которого почти невозможно обойтись.
Еще замечание. Большинство статей в интернете ориентировано на тех, кто, как считается по умолчанию, уже знает, что такое параметры, переменные, условия и что делают все эти забавные значки - @#$%*.
Я буду считать, что это все вам неизвестно и стараться пояснять логику, стоящую за этими штуками.
Кроме того, я собираюсь постоянно обновлять этот пост по мере нахождения новых принципов работы, разных фишек, трюков и полезностей, т.е., по мере собственного роста.
Но сначала скажем о главном...
Команды Powershell напоминают английское предложение.
Последнее обычно имеете форму S-V-O или Subject-Verb-Object.
Subject - подлежащее/существительное или тот, кто производит действие,
Verb - глагол или действие, которое осуществляет Subject,
Object - объект или то, над чем производится действие (или тот, над кем...).
Пример:
Я несу стол = S-V-O = субъект (Я)-глагол (несу)-объект (стол).
Поскольку в Powershell действие всегда производите вы сами (или программа от вашего имени), то субъект не указывается. Подразумевается, что субъект - всегда Я. Получаем структуру V-O = глагол-объект. Простейший пример предложения Powershell - Get-Help. Get - глагол, действие которое вы хотите произвести - в данном случае получить что-то. Help - объект или, в данном случае, информация о том как получить помощь (помощь о помощи ;) ).
Если написать Get-Process, вы получите на экране вполне внятный форматированный вывод.
По определению результат команды выводится на экран, но часто нужно
бывает вывести команду в текстовый файл. Можно сделать это традиционным DOS-овским путем:
А можно в стиле PowerShell:
Get-Process | Out-File -filepath C:\processes.txt
Чтобы открыть файл в Notepad, предварите имя файла двумя буквами i: ii C:\processes.txt
Так вы получите первый мини-скрипт:
==Start==
Get-Process | Out-File -filepath C:\processes.txt
ii C:\processes.txt
==End==
Если вместо простого текстового файла вам нужно получить документ в более цивилизованном формате CSV, используйте коммандлет Export-CSV:
==Start==
Get-Process | Export-CSV C:\processes.csv
ii C:\processes.csv
==End==
Здесь вместо значка 'больше' мы использовали знак Pipe (|) плюс коммандлет Export-CSV.
Этот способ содаст файл с почти бесконечным к-вом параметров.
Если же вам нужны не все, а только определенные параметры, используйте коммандлет Select-Object до вывода в файл. Но об этих подробностях позже.
А теперь о запросах к домену Active Directory, что часто бывает нужно системным администраторам.
Начнем с компьютров. Здесь самый нужный коммандлет - Get-ADComputer. Он вытаскивает информацию из Active Directory. Если вы запустите его в чистом виде, он не сработает, ему нужна добавка -Filter, которая фильтрует компьютеры по имени.
Если нужна информация по одному компьютеру, используйте параметр -Identity: Get-ADComputer -Identity ComputerName
Чтобы выдать список всех компьютеров в данном домене, используйте -Filter со звездочкой:
Get-ADComputer -Filter *
Можете воспринимать -Filter как прилагательное.
Я (Subject) хочу получить (Get) список компьютеров домена (ADComputer).
Такой список обладает некоторыми свойствами или качествами (прилагательные).
У человека есть глаза, которые обладают качеством цвета (прилагательное), где определенный цвет (голубой, зеленый) - это значение (value) этого свойства.
Значения -Filter в данном случае это определенный набор компьютеров. Мы можем задать и получить либо все имеющиеся компьютеры, либо часть из них.
Если вы хотите получить только часть списка, используйте параметр -like с шаблоном имен:
Get-ADComputer -Filter "Name -like 'DC*'"
Вы получите список всех компьютеров с именами, начинающимися на DC (в моей тестовой среде только один DC, который вы и видите).
Обратите внимание, что выражение после слова -Filter заключено в двойные кавычки, а имя компьютера со звездочкой в одинарные.
Таким образом, звездочка или "Name -like 'DC*'" являются значениями параметра/прилагательного -Filter.
Обратите внимание, что в выдаче команды мы получили только 9 свойств компьютерного объекта.
На самом деле у объекта компьютер свойств намого больше, но пока вы можете использовать только 9 стандартных. Как получить их больше и как узнать какие в принципе существуют?
Для этого можно использовать параметр -Properties со звездочкой:
Get-ADComputer -Identity ComputerName -Properties *
Вы не можете извлечь ни одно расширенное свойство, пока не используете параметр -Properties со звездочкой (что не совсем экономно, но работает) или не укажите специфичиское свойство с параметром -Properties.
Get-ADComputer -Identity ComputerName -Properties whenCreated | Select Name,whenCreated
или
При помощи Pipe мы передали полученное свойство команде Select для выдачи на экран.
Для выдачи на экран можно также использовать параметр Format-Table.
Get-ADComputer -Identity ComputerName -Properties whenCreated | Format-Table Name, whenCreated
Часто нужно знать IP адрес компьютера, который к сожалению отсутствует в стандартных свойствах. Для этого используем параметры -Properties и (опционально) Select-Object.
Get-ADComputer -Filter "Name -like 'DC*'" -Properties IPv4Address | Select-ObjectName,IPv4Address
Разберем, что происходит?
Параметр -Properties добавляет IPv4Address к списку стандарных свойств, сравните:
Мы получаем столбик со всеми доступными сейчас свойствами объекта Computer.
Вспомните, что -Properties это еще один пример прилагательного, свойства которого являются свойствами компьютера.
Зачем нужен параметр Select-Object?
Его мы можем использовать опционально при желании получить на экран только часть свойств в удобочитаемой форме.
Get-ADComputer -Filter "Name -like 'DC*'" -Properties IPv4Address | Select-Object Name,IPv4Address
Вместе с Select-Object мы использовали два доступных значения - Name и IPv4Address.
Name входил в список стандарных свойств, поэтому мы не указали его в -Properties, а
IPv4Address добавили при помощи -Properties и вывели при помощи Select-Object вместе с
Name.
У вас может возникнуть вопрос, а как мы вообще можем узнать, какие дополнительные свойства нам доступны? Ответ - да поможет нам звездочка. Используйте -Properties *.
Get-ADComputer -Filter "Name -like 'DC*'" -Properties *
Не пожалеем места на экране.
Ну не фантастика ли. При приблизительном подсчете мы получили более 70 свойств!
Вот если бы в языке мы тоже могли использовать звездочку, чтобы получить список всех возможных свойств объекта человек... Впрочем, сегодня это почти возможно...
Человек
Еще раз, если стандарные свойства вы можете выдать на экран или в файл всегда, то расширенные свойства можно добавить, если указать их после параметра -Properties. Можете указать специфические свойства или использовать звездочку (*), чтобы "вытащить" их все. При помощи Select-Object (после знака пайп "|") вы указываете системе показывать только часть полученных свойств.
Таким образом, у нас есть уже 3 параметра, которые сначала отфильтровывают нужные компьютеры из полного списка, затем добавляют их нужные свойства в дополнение к стандартным (-Properties) и, наконец, показывают их в удобной форме (Select-Object или Format-Table).
Пока что нам скорость и эффективность работы не так важна, нужно понять хотя бы принципы. Но, как задел на будущее, надо сказать, что есть смысл выбирать только нужные компьютеры (разумно используйте -Filter), а у полученных компьютеров брать только нужные добавочные свойства (при помощи -Properties). Нет смысла выбирать лишние компьютеры и свойства, чтобы затем не показать их при помощи Select-Object, особенно, если у вас не десятки компьютеров, а сотни или тысячи.
Теперь давайте всмотримся в другие свойства компьютера.
Можем ли мы выделить при помощи -Filter любое из них? Давайте попробуем.
Get-ADComputer -Filter "Object-Class -like 'comp*'"
Очевидно, нет, поскольку вывод на экран пуст. Что же делать?
Оказывается, есть более универсальное средство, которое работает в любом случае. Оно называется Where-Object.
Его применение выглядит немного сложнее, но на самом деле все доступно нашему пониманию.
Get-ADComputer -Filter * -Properties IPv4Address | Where-Object { $_.ObjectClass -Like "computer" } | FT Name,IPv4Address
Теперь вывод на экран нормальный. Здесь мы не стали ограничивать себя на стадии -Filter, и получили все известные компьютеры. Затем передали их при помощи Pipe команде Where-Object, и уже на этом этапе осуществили фильтрацию компьютерных объектов по свойству ObjectClass. Нам был нужен класс объектов computer, что мы и получили.
-Like "computer" нам понятно, хотя обратим внимание на использование фигурных скобок вместо двойных кавычек и двойных кавычек вместо одинарных, как это было с параметром -Properties. А вот $_. для нас ново. Пока примем как данность, что сюда переходит все, что отфильтровалось на предыдущем этапе. В нашем случае это все компьютеры.
В отличие от -Properties, Where-Object работает с любыми свойствами объекта.