Глава 9. Различные ключевые слова

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

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

Split

Ключевое слово 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 просмотрите пошаговые действия расщепления чтобы лучше разобраться как им пользоваться.

 

Рисунок 9-1


Отображение операции расщепления

Replace

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

Вы можете применять replace когда вы хотите заменять данные в строке. Допустим, вы желаете добавлять подчёркивание вместо точки, потому как вы хотите обновлять вторичный адрес. Вы можете применить такой код и просмотреть полученный результат на Рисунке 9-2:


$email = "Vikas.Sukhija@labtest.com"
$emreplace = $email.replace(".","_")
		
 

Рисунок 9-2


Отображение операции замены

Select-String

Select-String способен творить чудеса, поскольку вы можете пользоваться им для поиска строк внутри файлов. Вот практическое применение этого, которым я многократно пользовался (в то время как прочие боролись и тратили множество часов пытаясь это решить): поиск верной даты и времени операции в большом количестве файлов журналов.

Допустим, у вас имеется большое число файлов внутри папки logs и вы желаете отыскать те файлы, в которых присутствует строка error:


Get-ChildItem c:\data\logs | Select-String -Pattern "Error"
		

Этот простой код в одну стоку отыщет вхождения строки error во всех имеющихся файлах журналов из папки logs. Рисунок 9-3 показывает как выделяются имена файлов в тех файлах, которые содержат error.

 

Рисунок 9-3


Отображение операции Select-String

Compare-Object

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
 	   

Выводы

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