首页 > 解决方案 > 使用 powershell 读取 csv 文件

问题描述

我正在努力使用 power shell 读写 csv 文件。我需要读取一个包含三列服务器、用户、状态的文件

我已经完成了第一步(读入文件)

下一步是通过分隔符“;”分割状态字段中的数据。(我也有)

现在问题出在哪里,我通过 Get-ADUser 循环并构建打印行,将 foreach 循环中的所有值放在一起 - 用“;”分隔。(新状态字段)

然后当然在结束时写出完成的文件。

所以输入文件是一个包含以下内容的csv

服务器用户状态 ABC xtom
JKL
CDEA msall;jbec

输出 csv 将是

服务器用户状态 ABC xtom xert.tom@abc.com; JKL CDEA msall;jbec mik.sall@abc.com;jay.bec@abc.com

我的代码就这样

$List = Import-Csv -Path "c:\data\infile.csv"

$outarray = @()

foreach ($item in $List) 
{
   Write-output $item

   $Servers= $($item.Server)
   $Users  = $($item.Users)
   $Status = $($item.Status)

   if ($Users.length -gt 0)
   {
      $CharArray =$Users.Split(";")

      Foreach ($i in $CharArray)
      { 
      
        $email = Get-ADUser -Filter {SamAccountName -like $i} | Select -Property UserPrincipalName
        $outarray = $email

      }
   }

}

$outarray |  Export-Csv "c:\data\testout.csv" -noType

任何帮助,将不胜感激

谢谢

csv 输入文件

Server,Users,Status
ABC,xtom,
JKL,,
CDEA,msall;jbec,

csv 输出文件

Server,Users,Status
ABC,xtom,xert.com@abc.com
JKL,,
CDEA,msall;jbec,mik.sall@abc.com;jay.bec@abc.com

标签: powershellcsv

解决方案


所以,如果我正确理解你需要什么,这段代码应该适合你:

$List = Import-Csv -Path "c:\data\infile.csv"

$outarray = [system.collections.generic.list[pscustomobject]]::new()

foreach ($item in $List) 
{
    Write-output $item

    $Server = $($item.Server)
    $Users  = $($item.Users)
    $Status = $($item.Status)

    if ($Users)
    {
        $CharArray = $Users.Split(";")

        $email = $(
        Foreach ($i in $CharArray)
        {   
            $usr=(Get-ADUser -Filter {SamAccountName -like $i}).UserPrincipalName
            if($usr){$usr}
        }) -join ';'
    }

    $outarray.Add(
        [PSCustomObject]@{
            Server = $Server
            Users = $Users
            Status = $email
    })

}

$outarray |  Export-Csv "c:\data\testout.csv" -NoTypeInformation

值得一提的userPrincipalName是,这绝对不是一回事,mail即使它们看起来一样,但情况并非总是如此。

此外,不需要if$i将实际包含samAccountNamesthen 。-Filter {....}


推荐阅读