Moin,
das ist eigentlich keine Frage, sondern gleich die Lösung. Ich habe ziemlich lange gebraucht das zu kapieren, deshalb dachte ich, ich teile die Erfahrung mit anderen.
Eine CSV Datei importieren ist ganz leicht mit PS.
Man erhält Variaben die sich super leicht weiter verarbeiten lassen.
Eine CSV Datei aus einem vorhandene Objekt zu exportieren ist auch ganz leicht.
Aber ich wollte ein paar Daten so formatieren um sie direkt mit Export-CSV schreiben zu können.
(bis dato hatte ich csv Dateien selbst gebastelt über strings und outfile -append... nicht so schick)
Hier ein Beispiel das zeigt wie ich es nun gelöst habe.
# PS v3 and above # stop the script upon error and prevent nonsens $ErrorActionPreference = "Stop" # clear screen clear-host # in and outpath $fileBase="C:\windows\system32\" $outCSV="C:\temp\hashTable.csv" # create an empty array $outArray=@()
# just used to generate some meaningful data function myGetFileHash( [System.IO.FileInfo] $fullname, [String] $hashType) # accepts e.g. "md5" or "sha256" { $stream = $null; [string] $result = $null; $hashAlgorithm = [System.Security.Cryptography.HashAlgorithm]::Create($hashType ) $stream = $fullname.OpenRead(); $hashByteArray = $hashAlgorithm.ComputeHash($stream); $stream.Close(); trap { if ($stream -ne $null) { $stream.Close(); } break; } # Convert the hash to Hex $hashByteArray | foreach { $result += $_.ToString("X2") } return $result } # enumerate all files without folders and without csv files $files = get-childitem $fileBase -filter "a*" | where {$_.mode -notmatch "d"} | where {$_.Extension -ne ".csv"} foreach ($file in $files) { write-host $file $hash=myGetFileHash $file "sha256" # add a a hash table as customobject to the array and keep value pair order $outArray+=[pscustomobject][ordered]@{"File:"=$file"Hash:"=$hash } } # create csv file without type info $outArray|Export-Csv $outCSV -notypeinformation
Das meiste in dem Script ist nur da, um es hier irgendwie zeigen zu können.
Der Knackpunkt für mich war, ein array zu erzeugen das aus lauter zu Objekten gewandelten hash tables besteht, bzw. erstmal zu verstehen dass das so sein muss.
Der zweite Knackpunkt war, dass sie hash table keys in willkürlicher Reihenfolge erscheinen.
Seit PS 3 geht das aber ganz einfach.
Mit [pscustomobject] casted man in ein custom object und mit [ordered] sorgt man dafür, das die Reihenfolge der keys so bleibt wie man sie erzeugt hat.
Für PS 2 würde es wohlso funktionieren, allerdings ohne die gesicherte Reihenfolge.
$outArray += New-Object PSObject -Property @{"File:"=$file"VT:"=$vt
}Es gibt noch zig andere Schreibweisen, aber so wie oben fand ich es am einfachsten.
Die hash Funktion ist nur schmückendes Beiwerk, damit ich irgendwelche Daten habe um meine "Tabelle" zu füllen.
Korrekturen und Verbesserungen erwünscht ;)
Gruß
Michael