Benutzer mit den meisten Antworten
Powershell Export-CSV "leere Pipe" Fehler

Frage
-
Hallo Zusammen,
ich habe folgendes Problem, wenn ich meine Ausgabe(im ISE keine Probleme) in eine Datei schreiben will dann bekomme ich folgende Fehlermeldung:
"+ Get-HardDisk -VM $vm |select-object @{Name="VM-Name"; Expression={$vm.name}},Persistence,CapacityKB,Filename}| <<<< Export-Csv C:\temp\dfd.csv -notypeinformation -delimiter ";" -encoding utf8
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : EmptyPipeElement"Beim Code:
$VMs=Get-Datacenter "datacenter" |Get-VM
foreach ($vm in $VMs){
Get-HardDisk -VM $vm |select-object @{Name="VM-Name"; Expression={$vm.name}},Persistence,CapacityKB,Filename}|Export-Csv C:\temp\dfd.csv -notypeinformation -delimiter ";" -encoding utf8bitte um Hilfe. Danke
Antworten
-
Ich vermute mal das du PowerShell 2.0 benutzt, richtig ?
PowerShell 2.0 hat die dumme Angewohnheit eine Foreach Schleife auch dann zu durchlaufen wenn das Array Null ist.
$LeereListe = $Null ForEach($Item in $LeereListe) { Write-Host "Hallo Welt!" }
Dies bedeutet für dich das $VMs Null ist und somit niemals initialisiert wurde. Deshalb können die nachfolgenden Befehle nicht ordentlich laufen (leere pipe).
Dies bedeutet wiederum das der Befehl Get-Datacenter "datacenter" |Get-VM nichts oder einen Fehler zurückgeliefert hat.
Ich vermute mal das du das vSphere Modul nicht geladen hast!?
Meine PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
Mein deutscher PowerShell Blog
Mein 21 Teiliger PowerShell Video Grundlehrgang
Deutsche PowerShell Videos auf Youtube
Folge mir auf:
Twitter | Facebook | Google+ | Deutsches PowerShell Forum (TechNet)- Bearbeitet Peter Kriegel Mittwoch, 30. Oktober 2013 13:39
- Als Antwort markiert Denniver ReiningMVP, Moderator Dienstag, 5. April 2016 20:56
-
Hallo,
deshalb habe ich geschrieben, dass du auch noch den -append Parameter hinzfuegen musst der die Zeilen anhaengt.
Beispiel$aa = Get-Process
so steht in der Datei nur der letzte Process:
foreach ($a in $aa) {$a | Export-Csv .\dfd.csv -notypeinformation -delimiter ";" -encoding utf8}
so alle
foreach ($a in $aa) {$a | Export-Csv .\dfd.csv -notypeinformation -delimiter ";" -encoding utf8 -append}
Und hier auch noch erweitert um ein Select-Object wie in deinem Beispiel:
foreach ($a in $aa) {get-process $a.ProcessName | select-object ProcessName, ID | Export-Csv .\dfd.csv -notypeinformation -delimiter ";" -encoding utf8 -append}
Beste Gruesse
brima
- Bearbeitet brima Mittwoch, 30. Oktober 2013 15:09
- Als Antwort markiert Denniver ReiningMVP, Moderator Dienstag, 5. April 2016 20:57
Alle Antworten
-
Hallo,
sieh dir mal die Ergebnisse beider Beispiele an, das erste geht, das zweite bringt den Fehler.
$aa = 1..5 foreach ($a in $aa) {$a} foreach ($a in $aa) {$a} | out-file abc.txt
Die Ausgabe erfolgt also in der ForEach Schleife, d.h. nach der } liegt nichts in der Pipe, deshalb der Fehler.
Loesung:
foreach ($a in $aa) {$a | out-file abcc.txt -append}
Das bedeutet, dein Export-CSV muss in die Klammer und um -append erweitert werden.
Beste Gruesse
brima
-
Ich vermute mal das du PowerShell 2.0 benutzt, richtig ?
PowerShell 2.0 hat die dumme Angewohnheit eine Foreach Schleife auch dann zu durchlaufen wenn das Array Null ist.
$LeereListe = $Null ForEach($Item in $LeereListe) { Write-Host "Hallo Welt!" }
Dies bedeutet für dich das $VMs Null ist und somit niemals initialisiert wurde. Deshalb können die nachfolgenden Befehle nicht ordentlich laufen (leere pipe).
Dies bedeutet wiederum das der Befehl Get-Datacenter "datacenter" |Get-VM nichts oder einen Fehler zurückgeliefert hat.
Ich vermute mal das du das vSphere Modul nicht geladen hast!?
Meine PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
Mein deutscher PowerShell Blog
Mein 21 Teiliger PowerShell Video Grundlehrgang
Deutsche PowerShell Videos auf Youtube
Folge mir auf:
Twitter | Facebook | Google+ | Deutsches PowerShell Forum (TechNet)- Bearbeitet Peter Kriegel Mittwoch, 30. Oktober 2013 13:39
- Als Antwort markiert Denniver ReiningMVP, Moderator Dienstag, 5. April 2016 20:56
-
Hallo,
danke für deine Antwort, leider benötige ich es als CSV Datei, damit ich diese formatieren kann, aber der ansatz ist perfekt habe alles jetzt einfach per Excel umformatiert. Den gleichen ansatz hatte ich auch nur mit dem befehl export-csv und da schreibt er mir nur den letzten datensatz in die CSV. Aber perfekt Thema so für mich gelöst ;) DANKE
-
Super danke dir auch für deien Antwort, ich habe natürlich das Modul geladen, nur vergessen das in dem forum anzugeben. wenn ich $VMs absetzte dann werden alle meien VMs aufgezählt und wenn ich den Befehl per Commando absetzte kein Problem er schreibt, wer bringt mir nur fehler wenn ich die ergebnisse dann an den befehlt export-csv pipe, aber der kollege obe hat mir einen workaround aufgezeigt. danke aber für deine hilfe
-
Hallo,
deshalb habe ich geschrieben, dass du auch noch den -append Parameter hinzfuegen musst der die Zeilen anhaengt.
Beispiel$aa = Get-Process
so steht in der Datei nur der letzte Process:
foreach ($a in $aa) {$a | Export-Csv .\dfd.csv -notypeinformation -delimiter ";" -encoding utf8}
so alle
foreach ($a in $aa) {$a | Export-Csv .\dfd.csv -notypeinformation -delimiter ";" -encoding utf8 -append}
Und hier auch noch erweitert um ein Select-Object wie in deinem Beispiel:
foreach ($a in $aa) {get-process $a.ProcessName | select-object ProcessName, ID | Export-Csv .\dfd.csv -notypeinformation -delimiter ";" -encoding utf8 -append}
Beste Gruesse
brima
- Bearbeitet brima Mittwoch, 30. Oktober 2013 15:09
- Als Antwort markiert Denniver ReiningMVP, Moderator Dienstag, 5. April 2016 20:57
-
@Brima warum brichst du dir hier einen mit der ForEach Schleife ab?
Hier an der Stelle würde ich das ForEach-Object Cmdlet benutzen.
Export-CSV funktioniert nun mal am besten mit ForEach-Object!
Export-CSV hat erst ab der PowerShell 3.0 einen -Append parameter!
Hier muss immer darauf geachtet werden mit welcher Version jemand arbeitet.
Ich persönlich werde für Code, mindestens die nächsten 5 Jahre, immer die PowerShell 2.0 voraussetzen, da dieser Code dann immer Funktioniert!@Lex87 und @Brima
Es gibt in der PowerShell 2 verschieden ForEach Konstrukte.
Ich habe dazu einen Artikel geschrieben. Lest euch diesen einmal durch!
http://www.admin-source.de/BlogDeu/905/powershell-foreach-und-foreach-objectIch glaube so müsste dein Code funktionieren (ungetestet!):
Get-Datacenter "datacenter" | Get-VM | ForEach-Object { # Das Objekt das gerade in derr ForEach-Objekt Pipeline verarbeitet wird, liegt in der Automatischen Variable $_. # Da in diesem ForEach-Objekt {} noch andere Pipelines verschachtelt erstell werden, die ebenfalls die Variable $_ benutzen, # kommt man da schnell durcheinander. Deshalb Nutze ich für diese Ebene die Variable $VM $VM = $_ Get-HardDisk -VM $VM | Select-Object @{Name="VM-Name"; Expression={$VM.name}},Persistence,CapacityKB,Filename } | Export-Csv C:\temp\dfd.csv -notypeinformation -delimiter ";" -encoding utf8
Meine PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
Mein deutscher PowerShell Blog
Mein 21 Teiliger PowerShell Video Grundlehrgang
Deutsche PowerShell Videos auf Youtube
Folge mir auf:
Twitter | Facebook | Google+ | Deutsches PowerShell Forum (TechNet)- Bearbeitet Peter Kriegel Donnerstag, 31. Oktober 2013 06:36
-
Wenn dein Problem damit zur Gänze gelöst ist, markiere bitte noch die Antworten.
Danke.
Blog: http://bytecookie.wordpress.com
Powershell Codesnippet Manager: Link
Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
Warum das Ganze? Hier gibts die Antwort.