#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