Как экспортировать данные в CSV в PowerShell?

foreach ($computer in $computerlist) {
    if((Test-Connection -Cn $computer -BufferSize 16 -Count 1 -ea 0 -quiet))
    {
        foreach ($file in $REMOVE) {
            Remove-Item "\\$computer\$DESTINATION\$file" -Recurse
            Copy-Item E:\Code\powershell\shortcuts\* "\\$computer\$DESTINATION\"            
        }
    } else {
        Write-Host "\\$computer\$DESTINATION\"
    }
}

Я хочу экспортировать Write-Host "\ $computer\$DESTINATION \" в CSV файлы, поэтому я знаю, какие компьютеры были в автономном режиме, когда запускался script.

Я запускаю это с компьютера Windows 7

Ответ 1

Это решение создает psobject и добавляет каждый объект к массиву, затем создает csv, связывая содержимое массива с помощью Export-CSV.

$results = @()
foreach ($computer in $computerlist) {
    if((Test-Connection -Cn $computer -BufferSize 16 -Count 1 -ea 0 -quiet))
    {
        foreach ($file in $REMOVE) {
            Remove-Item "\\$computer\$DESTINATION\$file" -Recurse
            Copy-Item E:\Code\powershell\shortcuts\* "\\$computer\$DESTINATION\"            
        }
    } else {

        $details = @{            
                Date             = get-date              
                ComputerName     = $Computer                 
                Destination      = $Destination 
        }                           
        $results += New-Object PSObject -Property $details  
    }
}
$results | export-csv -Path c:\temp\so.csv -NoTypeInformation

Если вы передаете строковый объект в csv, вы получите его длину, записанную в csv, это потому, что это свойства строки, см. здесь для получения более подробной информации. Информация.

Вот почему я сначала создаю новый объект.

Попробуйте следующее:

write-output "test" | convertto-csv -NoTypeInformation

Это даст вам:

"Length"
"4"

Если вы используете Get-Member на Write-Output следующим образом:

write-output "test" | Get-Member -MemberType Property

Вы увидите, что у него есть одно свойство - 'length':

   TypeName: System.String

Name   MemberType Definition
----   ---------- ----------
Length Property   System.Int32 Length {get;}

Вот почему Длина будет записана в файл csv.


Обновление: добавление CSV Не самый эффективный способ, если файл становится большим...

$csvFileName = "c:\temp\so.csv"
$results = @()
if (Test-Path $csvFileName)
{
    $results += Import-Csv -Path $csvFileName
}
foreach ($computer in $computerlist) {
    if((Test-Connection -Cn $computer -BufferSize 16 -Count 1 -ea 0 -quiet))
    {
        foreach ($file in $REMOVE) {
            Remove-Item "\\$computer\$DESTINATION\$file" -Recurse
            Copy-Item E:\Code\powershell\shortcuts\* "\\$computer\$DESTINATION\"            
        }
    } else {

        $details = @{            
                Date             = get-date              
                ComputerName     = $Computer                 
                Destination      = $Destination 
        }                           
        $results += New-Object PSObject -Property $details  
    }
}
$results | export-csv -Path $csvFileName -NoTypeInformation

Ответ 2

то, что вы ищете, это Export-Csv file.csv

попробуйте использовать Get-Help Export-Csv, чтобы узнать, что возможно

также Out-File -FilePath "file.csv" будет работать

Ответ 3

просто используйте командлет Out-File, но НЕ забудьте указать тип кодировки:  -Encoding UTF8

поэтому используйте его так:

$log | Out-File -Append C:\as\whatever.csv -Encoding UTF8

-Append требуется, если вы хотите записать в файл более одного раза.

Ответ 4

Вы всегда можете использовать

echo "Column1`tColumn2`tColumn3..." >> results.csv

Вам нужно будет поместить "t" между столбцами, чтобы разделить переменные на их собственный столбец. Вот как я написал свой script:

echo "Host`tState" >> results.csv
$names = Get-Content "hostlist.txt"
foreach ($name in $names) {
    $count = 0
    $count2 = 13490

    if ( Test-Connection -ComputerName $name -Count 1 -ErrorAction SilentlyContinue ) {
        echo "$name`tUp" >> results.csv
    }
    else {
        echo "$name`tDown" >> results.csv
    }

    $count++
    Write-Progress -Activity "Gathering Information" -status "Pinging Hosts..." -percentComplete ($count / $count2 *100)

}

Это самый простой способ для меня. Выход, который я получаю:

Host|State
----------
H1  |Up
H2  |UP
H3  |Down

Вы можете поиграть со взглядом, но это основная идея. Счетчик $- это просто индикатор выполнения, если вы хотите оживить внешний вид