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
这基本上应该做与其他两个答案完全相同的事情,它只是添加了不同的 属性,因为多样性是生活的调味剂! (我在网上看到的,应该是真的。)
我目前正在处理一个 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
这基本上应该做与其他两个答案完全相同的事情,它只是添加了不同的 属性,因为多样性是生活的调味剂! (我在网上看到的,应该是真的。)