【问题标题】:PowerShell foreach loop export to new column in CSV formatPowerShell foreach 循环以 CSV 格式导出到新列
【发布时间】:2015-04-30 16:46:02
【问题描述】:

我目前正在处理一个 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
}

【问题讨论】:

  • 将select SAMAccountName 更改为select -ExpandProperty SAMAccountName
  • 马蒂亚斯,感谢您的回复。这有点帮助 - 输出更清晰,但基本上发生的事情是它抛出了一个语法错误,它一遍又一遍地覆盖 CSV,只保留一行。解析查询“employeeNumber -eq NO_MANAGER”语法错误时出错。

标签: powershell csv export-to-csv


【解决方案1】:

正如 @MathiasR.Jessen 在 cmets 中提到的:您需要扩展 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

【讨论】:

  • Ansgar - 效果很好。我很感激这方面的帮助。我遇到的一个问题是它不断抛出syntax error。有关如何解决语法错误的任何建议?
  • @jdubs 您在test.csv 中有一个或多个空行。删除它们。
【解决方案2】:

简短的回答是将-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

注意: 看起来 @AnsgarWiechers 击败了我 :-)

【讨论】:

    【解决方案3】:

    我似乎迟到了,但这很少阻止我...我不是通过 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
    

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

    【讨论】:

    • MadTech - 这也很有效,感谢您加入讨论。此方法与 Angars 版本抛出相同的语法错误...您认为它与 CSV 标头有间距有关吗?
    • 它可能需要在搜索字符串周围加上单引号。试试"employeeNumber -eq '$($_.'Manager User Sys ID')'" 看看是否不能解决错误。
    猜你喜欢
    • 2016-03-13
    • 2014-12-05
    • 2022-01-03
    • 2018-03-13
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    相关资源
    最近更新 更多