输出数组为CSV

时间:2016-01-19 16:18:22

标签: arrays csv powershell

我有两张CSV:

  1. Total 19_01_16.csv

    hostname,user,path,size,creation,LastAccess,Copied,NewName,Completed
    comp1,user1,\\comp1\users1\file.pst,100,17/02/2015,17/01/2016,Yes,file_user1_.pst,
    comp1,user1,\\comp1\users1\file2.pst,200,17/02/2015,17/01/2016,Yes,file2_user1_.pst,
    comp2,user2,\\comp2\users2\file.pst,100,17/02/2015,17/01/2016,Yes,file_user2_.pst,
  2. PST Passwords.csv

    user,Path,Password1,Password2,Password3,Error
    user1,\\comp1\users1\file.pst,openme,openme,openme,
  3. 我正在尝试将两者合并为不同的标头和其他内容。 这就是我到目前为止所做的:

    $a = Import-Csv "$PST_PARENT\DailyReports\Total 19_01_16.csv"
    "Hostname,User,PST_Name,Original_Path,New_Path,Size,AcceptableLoss,Password1,Password2,Password3" |
      Set-Content "$PST_PARENT\DailyReports\New Build.csv"
    
    $a | foreach {
      $HOSTNAME  = $_.hostname
      $USER      = $_.User 
      $PATH      = $_.path
      $NEW_NAME  = $_.NewName
      $NEWPATH   = "$PST_SHARE\$USER\$NEW_NAME"
      $SIZE      = $_.Size
      $SIZE_FAIL = ( [convert]::ToSingle( $SIZE ) / 2 )
    
      $b = Import-Csv "$PST_PARENT\DailyReports\PST Passwords.csv"
    
      $b | foreach {
        if ( $USER -like $b.user ) {
          $PASSWORD1 = $b.password1 
          $PASSWORD2 = $b.password2
          $PASSWORD3 = $b.password3
        } else {
          $PASSWORD1 = "none"
          $PASSWORD2 = "none"
          $PASSWORD3 = "none"
        }
      }
    
      $HOSTNAME,$USER,$NEW_NAME,$PATH,$NEWPATH,$SIZE,$SIZE_FAIL,$PASSWORD1,$PASSWORD2,$PASSWORD3 | 
        Add-Content "$PST_PARENT\DailyReports\New Build.csv"
    }
    

    New Build.csv的输出如下所示:

    Hostname,User,PST_Name,Original_Path,New_Path,Size,AcceptableLoss,Password1,Password2,Password3
    comp1
    user1
    file.pst
    \\comp1\users1\file.pst
    \\share\PST_Storage\file_user1_.pst
    100
    5
    none
    none
    none

    本质上输出是有效的,它不是每行都滚动,而是将每个数组放到一个新行上。 我尝试添加| ConvertTo-Csv -NoTypeInformation,但所做的只是将数组转换为数字,但它们仍然没有结束。

    有什么想法吗?我是在正确的路线还是整个事情都非常错误?

1 个答案:

答案 0 :(得分:0)

$HOSTNAME,$USER,...定义一个数组,每行输出一个元素。您需要将列表放在双引号中以将其转换为逗号分隔的字符串,您可以将其作为单行写入输出文件。

"Hostname,User,PST_Name,Original_Path,New_Path,Size,AcceptableLoss,Password1,Password2,Password3" |
  Set-Content "$PST_PARENT\DailyReports\New Build.csv"

$a | foreach { 
  ...
  "$HOSTNAME,$USER,$NEW_NAME,$PATH,$NEWPATH,$SIZE,$SIZE_FAIL,$PASSWORD1,$PASSWORD2,$PASSWORD3"
} | Add-Content "$PST_PARENT\DailyReports\New Build.csv"

或者您可以从可以通过Export-Csv导出的元素构建自定义对象。

$a | foreach { 
  ...
  New-Object -Type PSCustomObject -Property @{
    'Hostname'  = $HOSTNAME
    'User'      = $USER
    'NewName'   = $NEW_NAME
    'Path'      = $PATH
    'NewPath'   = $NEWPATH
    'Size'      = $SIZE
    'SizeFail'  = $SIZE_FAIL
    'Password1' = $PASSWORD1
    'Password2' = $PASSWORD2
    'Password3' = $PASSWORD3
  }
} | Export-Csv "$PST_PARENT\DailyReports\New Build.csv" -NoType