2014-01-10 7 views
14

Ich möchte Write-Host "\ $ computer \ $ DESTINATION \" in die CSV-Dateien exportieren, damit ich weiß, welche Computer offline waren, als das Skript ausgeführt wurde.So exportieren Sie Daten in PowerShell in CSV?

ich dies von einem Windows-7-Maschine für

+1

Schauen Sie sich das 'Export-CSV' Cmdlet an: http://technet.microsoft.com/en-us/library/ee176825.aspx –

+0

Danke aber ich habe nachgesehen. Kannst du mir bitte zeigen, wie man diesen Schreib-Host exportiert "\\ $ computer \ $ DESTINATION \" –

Antwort

24

Diese Lösung erstellt ein psobject und fügt jedes Objekt einem Array hinzu. Anschließend erstellt es die CSV, indem es den Inhalt des Arrays über Export-CSV leitet.

$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 Rohr ein String-Objekt in eine CSV werden Sie seine Länge an die csv geschrieben werden, ist dies, weil diese Eigenschaften des Strings sind, finden Sie here für weitere Informationen.

Deshalb erstelle ich zuerst ein neues Objekt.

Versuchen Sie Folgendes:

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

Dies gibt Ihnen:

"Length" 
"4" 

Wenn Sie das Get-Member auf Write-Output wie folgt verwenden:

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

Sie werden sehen Sie, dass es eine Eigenschaft hat - 'Länge':

TypeName: System.String 

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

Deshalb wird Länge in die CSV-Datei geschrieben werden.


Update: Anfügen eines CSV nicht die effizienteste Art und Weise, 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 
+0

trotzdem, um die Datei anhängen statt überschreiben? Ich versuchte die NoClobber Flagge, aber schien nicht zu helfen –

+2

Als eine kleine Verbesserung, können Sie $ details = ** [georderte] ** @ {... Dies wird sicherstellen, dass die Spalten in der CSV-Datei erscheinen in der gleiche Reihenfolge wie angegeben. – vmb100

2

, was Sie suchen leite die Export-Csv file.csv

versuchen Get-Help Export-Csv um zu sehen, was möglich

auch wird Out-File -FilePath "file.csv"

arbeiten
+0

Ich habe das schon versucht, aber meine Datei wird ohne Daten erstellt.Write-Host "\\ $ computer \ $ DESTINATION \" | Export-Csv E: \ Code \ Powershell \ Logs \ Offline.txt –

+5

Verwenden Sie nicht Write-Host. Verwenden Sie Write-Ausgabe. Write-Host geht nicht zur Pipe. – EBGreen

2

einfach verwenden, um die Out-File cmd aber vergessen Sie nicht ein geben Kodierungsart: -Encoding UTF8

so ist es so verwenden:

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

-Append ist erforderlich, wenn Sie mehr als einmal in die Datei schreiben möchten.

1

können Sie immer die

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

Sie müssen setzen „` t“zwischen den Spalten die Variablen in ihre eigene Spalte trennt. Hier ist die Art, wie ich mein Skript schrieb:

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) 

} 

Dies ist der einfachste Weg für mich.Die Ausgabe, die ich bekomme, ist:

Sie können mit dem Aussehen herumspielen, aber das ist die Grundidee. Die $ -Zählung ist nur ein Fortschrittsbalken, wenn Sie das Aussehen aufpeppen wollen

+0

Hey, stolperte über deine Antwort und es funktioniert super, danke! Das einzige Problem, das ich habe, ist, wenn ich den Hostnamen verwende, wird es automatisch als offline alias "Down" angezeigt. Wenn ich die IP-Adresse des Hostnamens verwende, wird dies als online aka "Up" angezeigt. Könnten Sie vielleicht helfen? Danke noch einmal –