Вы используете подвыражение внутри нерасширяющейся строки. Ознакомьтесь с Powershell about_Quoting_Rules help topi c для получения более подробной информации. Но вкратце, вам нужны двойные кавычки, чтобы раскрыть что-то вроде $($_)
.
Что-то вроде:
Get-Content C:\temp\users.txt -encoding UTF8 |
ConvertFrom-String |
ForEach-Object {Get-ADUser -Filter "( givenName -like '$($_.P1)' ) -and (sn -like '$($_.P2)' )" -Properties *} |
Select-object givenName, Surname, SamAccountName | Export-CSV C:\Temp\usersexport.csv -NoTypeInformation
Обратите внимание, что я процитировал весь фильтр. Технически Get-ADUser
параметр -Filter
принимает строку, так что это приемлемо и упрощает чтение.
Также обратите внимание: вам может понадобиться "*", чтобы это работало правильно. Технически -like будет работать с точными совпадениями, но чаще используется при поиске с использованием подстановочных знаков. В вашем случае использование '*$($_.P1)*'
может помочь вам решить эту проблему.
Если вы уверены в значениях, особенно учитывая, что вы также используете оператор -and
, вы можете подумать об использовании -eq
. Однако я был бы обеспокоен, так как всегда есть вероятность столкновения общих имен. Например, в США в AD легко может быть 2 John Smiths ...
Я бы также заметил, что для этого более целесообразно использовать Import-CSV. После исправления ваш подход работает, но, в первую очередь, он более читабелен и его проще писать:
Пример с -eq
:
Import-Csv -Path C:\temp\users.txt -header "givenName","sn" -Delimiter " " |
ForEach-Object{
$GivenName = $_.givenName
$LastName = $_.sn
ForEach-Object { Get-ADUser -Filter "(givenName -eq '$GivenName') -and (sn -eq '$LastName')" -Properties * }
} |
Select-Object givenName, Surname, SamAccountName |
Export-CSV C:\Temp\usersexport.csv -NoTypeInformation
Пример с -like
и подстановочными знаками:
Import-Csv -Path C:\temp\users.txt -header "givenName","sn" -Delimiter " " |
ForEach-Object{
$GivenName = $_.givenName
$LastName = $_.sn
ForEach-Object { Get-ADUser -Filter "(givenName -like '*$GivenName*') -and (sn -like '*$LastName*')" -Properties * }
} |
Select-Object givenName, Surname, SamAccountName |
Export-CSV C:\Temp\usersexport.csv -NoTypeInformation
Вы также можете избежать -Properties *
и вместо этого определить более точный набор свойств для извлечения. В более крупных проектах, которые могут повлиять на производительность.
Да, и, кстати, вам обычно не нужно указывать кодировку для Get-Content
, это очень хорошо помогает понять это самостоятельно.
В PowerShell Core значение по умолчанию для параметра - UTF8NoBOM. NoBOM просто означает, что нет «метки порядка байтов», объявляющей кодировку, и поэтому у него не должно быть никаких проблем с файлом UTF8. В Windows PowerShell 5.1 вам может потребоваться указать его так же, как и у вас.
Похоже, это обучающее упражнение для вас, дайте мне знать, если это поможет.