Powershell导出到csv(保留原始数据顺序)

时间:2019-03-19 10:05:43

标签: powershell csv

我有以下脚本,该脚本根据用户的名称导出他们的samaccountname。它正在/正在做它应该做的事情。

$users = Get-Content C:\Users\metho\Desktop\users1.txt

$output = foreach ($user in $users){
Get-ADUser -Filter "Name -eq '$user'" | Select-Object name, samaccountname
} 

$output | export-csv C:\Users\metho\Desktop\Users_Export_Test.csv -NoTypeInformation

原始csv包含527个用户...输出csv包含480个用户。基本上,未找到的用户会在输出csv中跳过(但我希望输出也以相同顺序列出缺少的用户),这导致了我的问题。我想有一个输出CSV,它也列出了不在系统上的用户,因此我可以进行手动挖掘,此刻,我必须通过比较原始的csv和导出的csv来查找丢失的用户。时间太长。

有没有一种方法可以导出具有找到的用户名的csv并列出在系统上发现的用户。我认为它必须与export-csv开关有关。我正在尽力找到答案,也许有人知道答案?任何帮助都将得到高度重视。

-方法

2 个答案:

答案 0 :(得分:2)

您可以尝试这样的事情:

$users = Get-Content C:\Users\metho\Desktop\users1.txt

$output = @()
foreach ($user in $users) {
    $adUser = Get-ADUser -Filter "Name -eq '$user'" | Select-Object Name, SamAccountName
    if ($adUser) {
        $output += $adUser
    }
    else {
        $output += [PSCustomObject]@{
            Name           = $user
            SamAccountName = 'Not found in AD'
        }
    }
} 

$output | Export-Csv C:\Users\metho\Desktop\Users_Export_Test.csv -NoTypeInformation

如果在AD中找不到用户,则该用户的输出为

"Name","SamAccountName"
"Username as in the txt file","Not found in AD"

答案 1 :(得分:1)

分两点优化Theo的好答案

  • 将foreach输出直接分配给变量$output,避免使用+=
  • 将分配$adUser = Get-ADUser ...if($adUser)集成为一个步骤。

$users = Get-Content C:\Users\metho\Desktop\users1.txt

$output = foreach ($user in $users) {
    if ($adUser = Get-ADUser -Filter "Name -eq '$user'" | Select-Object Name, SamAccountName){
       $adUser
    } else {
        [PSCustomObject]@{
            Name           = $user
            SamAccountName = 'Not found in AD'
        }
    }
} 

$output | Export-Csv C:\Users\metho\Desktop\Users_Export_Test.csv -NoTypeInformation