wake-up-neo.com

Wie exportiere ich Daten nach CSV in 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\"
    }
}

Ich möchte Write-Host "\ $ computer\$ DESTINATION \" in die CSV-Dateien exportieren, damit ich weiß, welche Computer beim Ausführen des Skripts offline waren.

Ich führe dies von einem Windows 7-Computer aus

18
software is fun

Diese Lösung erstellt ein PSObject und fügt jedes Objekt einem Array hinzu. Anschließend wird die CSV erstellt, indem der Inhalt des Arrays über Export-CSV weitergeleitet wird.

$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

Wenn Sie ein String-Objekt an eine CSV weiterleiten, wird dessen Länge in die CSV geschrieben. Dies liegt daran, dass dies Eigenschaften des Strings sind. Weitere Informationen finden Sie unter hier .

Deshalb erstelle ich ein neues Objekt.

Versuche Folgendes:

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

Dies gibt Ihnen:

"Length"
"4"

Wenn Sie das Get-Member für Write-Output wie folgt verwenden:

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

Sie werden sehen, dass es eine Eigenschaft gibt - 'length':

   TypeName: System.String

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

Aus diesem Grund wird Länge in die CSV-Datei geschrieben.


Update: Anhängen einer CSV Nicht die effizienteste Methode, wenn die Datei groß wird ...

$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
31
David Martin

verwenden Sie einfach den Befehl Out-File, aber vergessen Sie nicht, einen Codierungstyp anzugeben: -Encoding UTF8

also benutze es so:

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

-Anhängen ist erforderlich, wenn Sie die Datei mehrmals schreiben möchten.

4
user3460304

was du suchst ist das Export-Csv file.csv

verwenden Sie Get-Help Export-Csv, um zu sehen, was möglich ist

ebenfalls Out-File -FilePath "file.csv" wird funktionieren

2
RayofCommand

Sie können immer die

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

Sie müssen "` t "zwischen die Spalten setzen, um die Variablen in ihre eigene Spalte zu trennen. So habe ich mein Drehbuch geschrieben:

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)

}

Das ist der einfachste Weg für mich. Die Ausgabe, die ich erhalte, ist:

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

Sie können mit dem Look herumspielen, aber das ist die Grundidee. Das $ count ist nur ein Fortschrittsbalken, wenn Sie den Look aufpeppen möchten

1
Harry Singh