微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PowerShell ForEach 循环将 UserPrincipalName 和对象 ID 添加到文件

如何解决PowerShell ForEach 循环将 UserPrincipalName 和对象 ID 添加到文件

我有一个用户电子邮件文件。我需要收集他们的 UPN 和对象 ID。

Get-AzureADUser -Filter "PrimarySMTPAddress eq '$user.EmailAddress'"
  • 我正在使用这一行来查询 AzureAD,它运行良好。但是,当我将其放入循环中时,我似乎无法获取任何数据。
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 举报,一经查实,本站将立刻删除。