Глава 9. Различные ключевые слова
В этой главе вам будет предоставлено введение в ключевые слова PowerShell. Эти ключевые слова способны осуществлять манипуляцию данными, что выступает критически важной частью любой операции создания сценария автоматизации.
В своей нашей главе вы примените те познания, которые вы получили на протяжении всей книги для создания неких практических промышленных сценариев при помощи кодов шпаргалок, которыми я поделился в этой книге.
Ключевое слово split
может применяться для извлечения данных из строки. Допустим,
внутри какой- то строки имеется некий адрес электронной почты, который вы бы хотели получить, либо вы бы хотели выделить
некие полезные сведения из какой- то текстовой строки.
Чтобы подробнее разобраться с этим, давайте пройдёмся по какому- то примеру. Давайте выделим имя и фамилию из строки адреса
электронной почты. Вы воспользуетесь split
, потому как оно способно расщеплять вашу
строку по любому символу и преобразовывать её в массив. Вы можете расщепить адрес своей электронной почты по точке
(.
). После этого в элементе 0 полученного массива вы получаете имя, однако для
фамилии вы должны снова выполнить расщепление по символу @
.
$email = "Vikas.Sukhija@labtest.com"
$emsplit = $email.split(".")
$firstname = $emsplit[0]
$lastname = ($emsplit[1] -split "@")
$lastn = $lastname[0]
$emsplit[0] and $lastname[0]
На Рисунке 9-1 просмотрите пошаговые действия расщепления чтобы лучше разобраться как им пользоваться.
Другим ключевым словом выступает replace
. Вместо расщепления своей строки, вы можете
заменить определённое содержимое этой строки иным содержимым.
Вы можете применять replace
когда вы хотите заменять данные в строке. Допустим, вы
желаете добавлять подчёркивание вместо точки, потому как вы хотите обновлять вторичный адрес. Вы можете применить такой
код и просмотреть полученный результат на Рисунке 9-2:
$email = "Vikas.Sukhija@labtest.com"
$emreplace = $email.replace(".","_")
Select-String
способен творить чудеса, поскольку вы можете пользоваться им для
поиска строк внутри файлов. Вот практическое применение этого, которым я многократно пользовался (в то время как прочие
боролись и тратили множество часов пытаясь это решить): поиск верной даты и времени операции в большом количестве файлов
журналов.
Допустим, у вас имеется большое число файлов внутри папки logs
и вы желаете
отыскать те файлы, в которых присутствует строка error
:
Get-ChildItem c:\data\logs | Select-String -Pattern "Error"
Этот простой код в одну стоку отыщет вхождения строки error
во всех имеющихся
файлах журналов из папки logs
.
Рисунок 9-3
показывает как выделяются имена файлов в тех файлах, которые содержат error
.
Compare-Object
с синонимом Compare
многократно
применяется для сравнения двух файлов или двух массивов. Это быстрее чем сопоставление массивов или файлов при помощи
циклов for
. Я неоднократно применял его для выборки участников из групп и сопоставления
их с текстовым файлом, который обладает идентификаторами пользователей. Такой подход выполняет выборку лишь тех участников,
которые уже часть соответствующей группы и добавляет их, вместо обработки всех участников.
Листинг 9-1 добавляет участников из одной группы в другую.
Замечание | |
---|---|
Для такой работы требуется модуль Active Directory. |
Листинг 9-1. Код шпаргалки для добавления участников при помощи Compare-Object
##########################выборка из group1 ##################
$collgroup1 = Get-ADGroup -id "group1" -Properties member |
Select-Object -ExpandProperty member |
Get-ADUser |
Select-Object -ExpandProperty samaccountname
##########################выборка из group2 ##################
$collgroup2 = Get-ADGroup -id "group2" -Properties member |
Select-Object -ExpandProperty member |
Get-ADUser |
Select-Object -ExpandProperty samaccountname
####################сопоставление двух групп#####################
$change = Compare-Object -ReferenceObject $collgroup1 -DifferenceObject $collgroup2
$Addition = $change |
Where-Object -FilterScript {$_.SideIndicator -eq "<="} |
Select-Object -ExpandProperty InputObject
#######добавление лишь тех участников, которые пропущены в group2##############
$Addition | ForEach-Object{
$sam = $_
Add-ADGroupMember -identity "group2" -Members $sam
}
##############################################################
Аналогично, вы можете осуществлять операцию удаления при помощи Compare-Object
, как
это показано в
Листинге 9-2.
Листинг 9-2. Код шпаргалки для удаления участников при помощи Compare-Object
##########################выборка из group1 ##################
$collgroup1 = Get-ADGroup -id "group1" -Properties member |
Select-Object -ExpandProperty member |
Get-ADUser |
Select-Object -ExpandProperty samaccountname
##########################выборка из group2 ##################
$collgroup2 = Get-ADGroup -id "group2" -Properties member |
Select-Object -ExpandProperty member |
Get-ADUser |
Select-Object -ExpandProperty samaccountname
####################сравнение двух групп####################
$change = Compare-Object -ReferenceObject $collgroup1 -DifferenceObject $collgroup2
$Removal = $change |
Where-Object -FilterScript {$_.SideIndicator -eq "=>"} |
Select-Object -ExpandProperty InputObject
####Удаление участников, которые имеются в group2, но отсутствуют в group1########
$Removal | ForEach-Object{
$sam = $_
Remove-ADGroupMember -identity "group2" -Members $sam -confirm:$false
}
##############################################################
Вы можете соединить обе операции в одном сценарии и осуществить синхронизацию двух групп на основе group1 как соответствующего якоря. Эту операцию отображает Листинг 9-3.
Листинг 9-3. Код шпаргалки для для синхронизации двух групп при помощи Compare-Object (на основе group1 в качестве якорной)
##########################выборка из group1 ##################
$collgroup1 = Get-ADGroup -id "group1" -Properties member |
Select-Object -ExpandProperty member |
Get-ADUser |
Select-Object -ExpandProperty samaccountname
##########################выборка из group2 ##################
$collgroup2 = Get-ADGroup -id "group2" -Properties member |
Select-Object -ExpandProperty member |
Get-ADUser |
Select-Object -ExpandProperty samaccountname
####################сравнение двух групп####################
$change = Compare-Object -ReferenceObject $collgroup1 -DifferenceObject $collgroup2
$Addition = $change |
Where-Object -FilterScript {$_.SideIndicator -eq "<="} |
Select-Object -ExpandProperty InputObject
$Removal = $change |
Where-Object -FilterScript {$_.SideIndicator -eq "=>"} |
Select-Object -ExpandProperty InputObject
#######добавление лишь тех участников, которые пропущены в group2########
$Addition | ForEach-Object{
$sam = $_
Add-ADGroupMember -identity "group2" -Members $sam
}
####Удаление присутствующих в group2, но отсутствующих в group1 участников########
$Removal | ForEach-Object{
$sam = $_
Remove-ADGroupMember -identity "group2" -Members $sam -confirm:$false
}
##############################################################
Вы также можете воспользоваться иным подходом чтобы вместо удаления из group2 вы просто применили
ADD-Groupmember
для group1 с тем, чтобы вы могли и в самом деле выполнить синхронизацию
обеих групп. Все объекты пользователей, которые не присутствуют в group2, но имеются в group1, должны быть добавлены в group2,
а все объекты пользователей, которые отсутствуют в group1, но имеются в group2, должны быть добавлены в group1:
ADD-ADGroupMember -identity "group1" -Members $sam
вместо
Remove-ADGroupMember -identity "group2" -Members $sam -confirm:$false
Имеются две примечательные уловки, которыми вы можете пользоваться при помощи Compare-Object
.
Скажем, у вас имеются два файла CSV. Один это просто адреса электронной почты пользователей; другой обладает адресами электронной
почты и прочими свойствами. Вам нужны все подробности из второго файла CSV для пользователей, имеющихся в первом файле CSV.
Листинг 9-4 отображает пример для свойств OneDrive. Имеются два файла CSV. Один содержит адреса электронной почты пользователей, а другой содержит адреса электронной почты и в прочих столбцах иные свойства.
Листинг 9-3. Код шпаргалки для для синхронизации двух групп при помощи Compare-Object (на основе group1 в качестве якорной)
$importallonedrivesites = import-csv "c:\importonedrives.csv" # onedrive file with other attributes
$importspofile = import-csv "c:\users.csv" #адреса электронной почты пользователей
$change = Compare-Object -ReferenceObject $importallonedrivesites -DifferenceObject $importspofile -Property owner -IncludeEqual -PassThru #владельцы это названия колонок для пользователей с адресами электронной почты
$change | where{$_.SideIndicator -eq "==" -or $_.SideIndicator -eq "=>"} |
select Owner, Title, url, StorageUsageCurrent, StorageQuota, StorageQuotaWarningLevel |
Export-Csv "c:\newfile.csv" -NoTypeInformation