如何解决PowerShell ForEach 循环将 UserPrincipalName 和对象 ID 添加到文件
我有一个用户电子邮件文件。我需要收集他们的 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。