Исключение / фильтрация с использованием количества слов

#powershell

#powershell

Вопрос:

Я совершенно новичок в PowerShell, и я пытаюсь найти способ фильтровать набор данных в Active Directory с помощью подсчета слов, и, основываясь на всех моих исследованиях, я не нашел ничего подходящего для меня, кроме Name.length . Я искал что-то более похожее Word.length . Например:

Что у меня есть:

 Get-ADUser -filter "Enabled -eq '$true'" -Properties Name | sort-object name | select-object Name | Where-Object {$_.Name -notlike "*Admin*" -and $_.Name "*hotdog*" }
 

Чего бы я хотел:

 Get-ADUser -filter "Enabled -eq '$true'" -Properties Name | sort-object name | select-object Name | Where-Object {$_.Name -notlike "*Admin*" -and $_.Name "*hotdog* -and **$_.Name -ne "1 word"**}
 

Комментарии:

1. Проще говоря… Вы хотите найти всех пользователей, чье имя не содержит слова «Admin», но содержит слово «hotdog» и состоит как минимум из 2 слов?

2. Привет, чтобы уточнить, я хотел бы найти всех пользователей, чье имя содержит более 1 слова. Например, если вместо номера телефона указано phonenumber, я бы хотел исключить только phonenumber.

Ответ №1:

 Get-ADUser -filter "Enabled -eq '$true'" -Properties Name | sort-object name | select-object Name | Where-Object { $wrds=$_.Name.Split(" "); $_.Name -notlike "*Admin*" -and $_.Name "*hotdog* -and wrds[1] }
 

Создайте массив wrds, который создается путем разделения имен на основе пробела в качестве разделителя. Затем проверьте, существует ли второй индекс массива wrds (имя содержит более одного слова)

Ответ №2:

Поскольку Name свойство возвращается по умолчанию для командлета Get-ADUser, вам не нужно указывать его как дополнительное свойство.

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

 # combine the words to exclude with regex OR ('|')
# if they contain regex special characters, you need to escape them first using [regex]::Escape()
$excludeThese = 'Admin|hotdog'

Get-ADUser -Filter "Enabled -eq '$true'" | 
    Where-Object { $_.Name -notmatch $excludeThese -and (($_.Name -split 'W').Count -gt 1) } |
    Select-Object Name | Sort-Object