2016-07-20 7 views
1

Ich habe ein Stück Code, den ich schrieb, die einige Daten erfasst und in eine CSV-Datei schreiben. Ich habe es in zwei Richtungen geschrieben. 1) Der erste Weg gibt mir nur das letzte Ergebnis und nicht alle Ergebnisse fast so, als ob es sich selbst überschreiben würde. 2) Die zweite Möglichkeit gibt mir einen Fehler, der "Ein Leerrohrelement nicht erlaubt"Export-CSV funktioniert nicht mit meiner foreach-Schleife

WAY 1)

foreach ($Computer in $CompObjToRM) 
{ 
Get-ADComputer -Identity $Computer | Select Name, DistinguishedName | Export-CSV C:\T2\ServersToRemoveFromAD2.csv -NoTypeInformation 
} 

WAY 2) sagt

foreach ($Computer in $CompObjToRM) 
{ 
Get-ADComputer -Identity $Computer | Select Name, DistinguishedName 
} | Export-CSV C:\T2\ServersToRemoveFromAD2.csv -NoTypeInformation 

Was mache ich falsch?

+0

Way 1 - Ja, Ihre Annahme ist richtig. Weg 2 - '| Out-File' ist ein Befehl ** für sich **. Ich nehme an, du hast versucht, die 'foreach' in' Out-File' zu ​​pipern, aber so funktionieren diese Klammern '{}' nicht. Die Klammern geben einfach den Beginn und das Ende der 'foreach' an. Es werden keine Daten per se ausgegeben, ohne dass Sie es ihm sagen. – gravity

+0

Ich denke, ich könnte ein Idiot sein Ich denke, ich brauche -NoClobber im Export-CSV-Befehl nach dem Vermitteln der Befehlsergebnisse zu meinem Export-CSV. Lassen Sie mich den Code reparieren und ausführen und bestätigen oder leugnen Sie meine Dummheit. – JRN

+0

Ok, wenn ich das code: foreach ($ Computer in $ CompObjToRM) { Get-ADComputer -Identität $ Computer | Wählen Sie Name, DistinguishedName | Export-CSV -NoClobber C: \ T2 \ ServersToRemoveFromAD2.csv -NoTypeInformation } Ich bekomme und Fehler: Die Datei 'C: \ T2 \ ServersToRemoveFromAD2.csv' existiert bereits. – JRN

Antwort

1

entweder den -Append Schalterparameter mit Export-Csv zu vermeiden, ist es die gleiche Datei überschrieben:

foreach ($Computer in $CompObjToRM) 
{ 
    Get-ADComputer -Identity $Computer | Select Name, DistinguishedName | Export-CSV C:\T2\ServersToRemoveFromAD2.csv -Append -NoTypeInformation 
} 

oder verwenden Sie das ForEach-Object Cmdlets (von der aus du Rohr alle Ausgaben zu Export-Csv)

$CompObjToRM |ForEach-Object { 
    Get-ADComputer -Identity $_ | Select Name, DistinguishedName 
} | Export-CSV C:\T2\ServersToRemoveFromAD2.csv -NoTypeInformation 

Der große Unterschied hier ist, dass foreach($thing in $things){} eine eingebaute semantische Eigenschaft der Sprache ist, wo als ForEach-Object ist ein Cmdlet - ein Stück wiederverwendbaren Code, der Pipeline-Eingabe und -Ausgabe unterstützt.

ForEach-Object kann etwas langsamer (und verhalten sich etwas anders) sein als die foreach Schleife, aber in den meisten Fällen ist es einfach nur bietet ein höheres Maß an Flexibilität in Ihrer Pipeline Komponieren

+0

Sehr nette Verwendung der '|' vor und nach dem 'foreach' Anruf. Ich würde diese Option erweitern, da das ursprüngliche Poster ein wenig verwirrt war, warum eine Post-Pipe nicht so lief, wie sie es erwartet hatte! :-) – gravity

+1

@gravity true, aktualisiert die Antwort mit ein paar Absätzen (Feel free to add) –

+0

Mathias wirklich tolle Sachen danke – JRN

Verwandte Themen