问题描述
我有一个用户电子邮件文件。我需要收集他们的 UPN 和对象 ID。
Get-AzureADUser -Filter "PrimarySMTPAddress eq '$user.EmailAddress'"
import-csv .\Book4.csv | ForEach-Object{
Get-AzureADUser -Filter "PrimarySMTPAddress eq '$_.EmailAddress'" | Select-Object UserPrincipalName,ObjectID
} | Export-Csv -Path .\Book4.csv -NoTypeinformation
谁能告诉我哪里出错了。我以为这会很简单,但我已经被困了一个小时。 CSV 文件具有三个列标题:EmailAddress、UserPrincipalName、ObjectID
解决方法
"PrimarySMTPAddress eq '$_.EmailAddress'"
未按预期工作,因为尝试对变量 $_
、.EmailAddress
进行的属性访问无效:
在 "..."
中,expandable string,您需要 $(...)
,subexpression operator 才能访问变量的属性[1],在其上调用方法,或者更普遍地嵌入整个语句。
因此,请改用以下字符串:
"PrimarySMTPAddress eq '$($_.EmailAddress)'"
此外,您错误地尝试在同一管道中读取和写回同一文件 (.\Book4.csv
),这不起作用(无需额外努力),如{{3}中所述}.
[1] 不包含在 $(...)
中,"...$_.EmailAddress..."
导致 $_
被自身扩展,而使用 .EmailAddress
逐字。例如,将 Write-Output "$HOME.Length"
与 Write-Output "$($HOME.Length)"
进行比较。
@mklement0 是正确的。
但另一个重要的事情是我们不能在同一个管道中读取和写回同一个文件。除非您确保在通过管道发送其行之前将输入文件完整读入内存。
使用这个:
$users = import-csv E:\temp\Book4.csv | ForEach-Object{
Get-AzureADUser -Filter "PrimarySMTPAddress eq '$($_.EmailAddress)'" | Select-Object UserPrincipalName,ObjectID
}
$users | Export-Csv -Path E:\temp\Book4.csv -NoTypeInformation