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