2016-07-01 16 views
0

Ich weiß, dass diese Frage schon einmal gestellt wurde, aber ich habe es wirklich schwer, die Lösungen anderer auf meine Situation anzuwenden. Bitte geben Sie sowohl die konzeptionellen als auch die technischen (Code-) Erklärungen zu Ihrer Antwort an, da ich verstehen muss, wie das funktioniert, so dass ich nicht erneut nach verschiedenen Szenarien fragen muss. :)PowerShell Export-Csv nimmt nur die letzte Zeile auf

Frage: Wie bekomme ich dies, um alle Zeilen in meinem PSObject zu exportieren, und warum exportiert es derzeit nur die letzte Zeile? (bitte erinnere ich bin nur auf PS 2,0)

$d = Get-SPDatabase | Sort-Object DiskSizeRequired -desc 
$d | %{ 
    #Report 
    $t = New-Object PSObject 
    $t | Add-Member NoteProperty "Size (MB)"([string]("{0:N0}" -f ($_.DiskSizeRequired/1MB)) + " MB") 
    $t | Add-Member NoteProperty "Database"($_.Name) 
    Write-Output $t 
} 
#Save Report to Tab Delimited File on the Desktop 
$t | Export-Csv ("{0}\Desktop\SP DB Sizes ({1}).txt" -f $Env:UserProfile, (Get-Date -Format "yyyy-MM-dd")) -Delimiter `t -Encoding UTF8 -NoTypeInformation 

Die oben ist eine Sharepoint-spezifische Skript, aber ich erwarte, dass die gleichen Konzepte auf jede Situation anwenden sollten ein PSObject zur Ausgabe von Tabellendaten beteiligt ist. Ja, ich möchte sowohl die Ausgabe als auch eine Datei in die Konsole schreiben.

+0

Sie realisieren, dass Sie für jedes Element "write-output $ t" ausgeben, aber niemals pipen oder speichern, also ist nur noch das letzte übrig? – Eris

+0

Hmmm, ich verstehe, was du meinst, aber ich bin mir nicht sicher, wie ich das beheben soll, weshalb ich hier bin. Ich habe viele Dinge ausprobiert, aber bisher hat noch nichts funktioniert. – Chiramisu

Antwort

1

Wie ich im Kommentar gesagt habe, wird der Wert von $ t niemals in einem Array oder in der Pipeline gespeichert.

Um dies zu beheben, nehme ich an, Sie meinen, die Werte zu sehen, und die Werte in der Pipeline gehen nur nach Export-Csv. Ich habe keine Powershell 2.0 zur Verfügung zu testen, aber ich weiß HashTables

$d = Get-SPDatabase | Sort-Object disksizerequired -desc 
$d | %{ 
    #Report 
    # We don't really need a PSObject, since it's just a hashtable/dictionary anyway 
    $t = @{ 
    "Size (MB)" = '{0:N0} MB' -f ($_.DiskSizeRequired/1MB) 
    "Database" = $_.Name 
    } 
    # Write to pipeline 
    Write-Output $t 
    # Write to console host 
    Write-Host $t 
} | # move pipe here, which will feed the pipeline output to the next non-commented command 
#Save Report to Tab Delimited File on the Desktop 
Export-Csv ("{0}\Desktop\SP DB Sizes ({1}).txt" -f $Env:UserProfile, (Get-Date -Format "yyyy-MM-dd")) -Delimiter `t -Encoding UTF8 -NoTypeInformation 
+0

OK, das scheint in die richtige Richtung zu gehen, aber die 'Write-Host'-Zeile spuckt nur eine Reihe von Arrays aus, anstatt den tabellarisch formatierten Stil, den ich anstrebe. – Chiramisu

+0

@Chiramisu Ich änderte es, stattdessen eine Hashtabelle zu verwenden, die korrekt schreiben sollte, jedoch habe ich Powershell 2.0 nicht verfügbar, um im Moment zu testen. – Eris

+0

Ich bekomme 'System.Collections.DictionaryEntry System.Collections.DictionaryEntry' im Host zurück, und viele zusätzliche Felder mit einigen 'Hashtable + KeyCollection' und anderen Daten. Denkst du es ist besser das 'PSObject' nicht zu benutzen? Ich lese, um das auf TechNet zu verwenden, aber ich bin offen für andere Optionen. ;) – Chiramisu

0

Nach vielen Herumspielen zur Verfügung steht (und mehr über PS Lernen;) ich auf folgende Lösung angesiedelt. Danke an @Eris, dass er mich in die richtige Richtung weist.

$t = @() #Reporting Table 
$d = Get-SPDatabase | Sort-Object DiskSizeRequired -desc 
$d | %{ 
    #Report 
    $t += New-Object PSObject -Property @{ 
     "Size (MB)" = "{0:N0} MB" -f ($_.DiskSizeRequired/1MB) 
     "Database" = $_.Name 
    } | Select "Size (MB)","Database" 
} 
$t 
#Save Report to Tab Delimited File on the Desktop 
$t | Export-Csv ("{0}\Desktop\SP DB Sizes ({1}).txt" -f $Env:UserProfile, (Get-Date -Format "yyyy-MM-dd HH-mm-ss")) -Delimiter `t -Encoding UTF8 -NoTypeInformation 

Hinweis: Es ist nicht die beste Ergebnis erzielt Lösung sein kann (und ich bin offen für Vorschläge, dass), aber es erzeugt die Ausgabe ich sowohl in der Konsole und die Datei möge. ;)