Hoe exporteer ik gegevens naar CSV in PowerShell?

Ik wil Write-Host “\$computer\$DESTINATION\” exporteren naar de CSV-bestanden, zodat ik weet welke computers offline waren toen het script werd uitgevoerd.

Ik voer dit uit vanaf een Windows 7-machine


Antwoord 1, autoriteit 100%

Deze oplossing maakt een psobject en voegt elk object toe aan een array, waarna het de csv maakt door de inhoud van de array door Export-CSV te leiden.

$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

Als je een string-object naar een csv pipet, wordt de lengte ervan naar de csv geschreven, dit komt omdat dit eigenschappen van de string zijn, zie hier voor meer informatie.

Daarom maak ik eerst een nieuw object.

Probeer het volgende:

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

Dit geeft je:

"Length"
"4"

Als je Get-Member op Write-Output als volgt gebruikt:

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

Je zult zien dat het één eigenschap heeft – ‘length’:

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

Daarom wordt Lengte naar het csv-bestand geschreven.


Update: een CSV toevoegen
Niet de meest efficiënte manier als het bestand groot wordt…

$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

Antwoord 2, autoriteit 20%

gebruik gewoon de Out-File cmd, maar vergeet niet een coderingstype op te geven:
-Encoding UTF8

dus gebruik het zo:

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

-Toevoegen is vereist als u meer dan één keer in het bestand wilt schrijven.


Antwoord 3, autoriteit 4%

waar u naar zoekt is het Export-Csv file.csv

probeer Get-Help Export-Csv te gebruiken om te zien wat er mogelijk is

ook Out-File -FilePath "file.csv" zal werken


Antwoord 4, autoriteit 2%

Je kunt altijd de

. gebruiken

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

U moet “`t” tussen de kolommen plaatsen om de variabelen in hun eigen kolom te scheiden. Dit is de manier waarop ik mijn script heb geschreven:

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)
}

Dit is voor mij de gemakkelijkste manier. De output die ik krijg is:

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

Je kunt met het uiterlijk spelen, maar dat is het basisidee. De $count is slechts een voortgangsbalk als je de look wilt opfleuren

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes