PowerShell foreach 循环导出到 CSV 格式的新列

PowerShell foreach loop export to new column in CSV format

我目前正在处理一个 CSV 文件,其中包含经理的员工编号,但没有他们的 SAMAccountName。我想利用 Get-ADUser 从经理的 EmployeeNumber 属性中获取经理的 SAMAccountName,并将其放在同一个 CSV 文件的新列中。

CSV 样本:

"Full Name","Username","Manager","Manager User Sys ID"
"User 1","u1","1, Manager","123456"
"User 2","u2","2, Manager","234567"
"User 3","u3","3, Manager","345678"

我愿意:

"Full Name","Username","Manager","Manager User Sys ID","Manager SamAccountName"
"User 1","u1","1, Manager","123456","m1"
"User 2","u2","2, Manager","234567","m2"
"User 3","u3","3, Manager","345678","m3"

我花了一些时间整理了以下代码。我可以添加一个新列并可以进一步获取 SAMAccountName,但它只在新的 CSV 文件中导出一行,如下所示:

"SAMAccountName","managerUsername"
"m1","@{SAMAccountName=m1}"

代码如下:

$managers = Import-Csv -Path .\test.csv
$usermananger = @()
foreach ($manager in $managers)
{
  $getmanagersam = Get-ADUser -Filter "employeeNumber -eq $($manager."Manager User Sys ID")" -Properties SAMAccountName |
    Select-Object SAMAccountName
  $exportstring = $testmanager |
    Select-Object *,@{Name='managerUsername';Expression={"$getmanagersam"}}
  $exportstring | Export-Csv -Path .\simpletest.csv -NoTypeInformation
}

简短的回答是将 -Append 选项添加到您的 export-csv 语句以阻止它在每次循环时覆盖。

或者将导出移到循环外,如下所示:

$managers = Import-Csv -Path .\test.csv

$managers|foreach-object{
  $getmanagersam = Get-ADUser -Filter "employeeNumber -eq $($_.'Manager User Sys ID')" | select -ExpandProperty SAMAccountName
  $_|Select *,@{Name='managerUsername';Expression=$getmanagersam}
} | Export-Csv -Path .\simpletest.csv -NoTypeInformation

注: 看起来@AnsgarWichers 比我先一步 :-)

正如@MathiasR.Jessen 在评论中提到的那样:您需要扩展 SamAccountName 属性 以获取值。此外,每次迭代都会覆盖输出 CSV。附加到文件,或将 Export-Csv cmdlet 移到循环之外。前者需要 PowerShell v3 或更新版本,后者需要您将循环更改为 ForEach-Object 循环(或 运行 子表达式中的 foreach 循环)。

我个人更喜欢使用管道,所以我会选择后者:

Import-Csv -Path .\test.csv | ForEach-Object {
  $acct = Get-ADUser -Filter "employeeNumber -eq $($_.'Manager User Sys ID')" |
          select -Expand SamAccountName
  $_ | select *,@{Name='managerUsername';Expression={$acct}}
} | Export-Csv -Path .\simpletest.csv -NoTypeInformation

我似乎迟到了,但这很少阻止我...我不太喜欢通过 Select cmdlet 添加属性,所以我要提供另一种方法是将 CSV 传递到 ForEach-Object 循环(就像其他答案一样),但在其中使用 Add-Member-PassThru 参数,然后将其传递到输出文件。我将在管道后添加一个新行并缩进,只是为了更容易阅读。

Import-Csv -Path ".\test.csv" | 
    ForEach-Object {Add-Member -InputObject $_ -NotePropertyName 'managerUserName' -NotePropertyValue (Get-ADUser -Filter "employeeNumber -eq $($_.'Manager User Sys ID')").samaccountname -PassThru} |
    Export-Csv -Path ".\simpletest.csv" -NoTypeInformation

这基本上应该做与其他两个答案完全相同的事情,它只是添加了不同的 属性,因为多样性是生活的调味剂! (我在网上看到的,应该是真的。)