您在非扩展字符串中使用子表达式。查看 Powershell 的 about_Quoting_Rules 帮助主题以获取更多详细信息。但是,简而言之,您需要双引号来扩展 $($_) 之类的内容。
类似:
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 参数接受一个字符串,因此这是可以接受的,并且更易于阅读。
另请注意:您可能需要“*”才能使其正常工作。从技术上讲,类似将适用于完全匹配,但它更常用于使用通配符进行搜索。在您的情况下,使用 '*$($_.P1)*' 可能会帮助您解决问题。
如果您对这些值有信心,特别是考虑到您也在使用-and 运算符,您可能会考虑使用-eq。但是我会担心,因为总是有可能发生常见的名称冲突。例如在美国很容易有 2 个约翰史密斯在公元...
我还要指出,为此使用 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 中,您可能需要按原样指定。
看起来这对你来说是一个学习练习,如果有帮助,请告诉我。