2013-09-25 12 views
11

Ich bin neu in Powershell, also ist das Skript ein Frankenstein von verschiedenen Beispielen von Seiten.Gibt es eine Möglichkeit zum Erzwingen der Powershell -Export-CSV-Cmdlet eine bestimmte Reihenfolge der Spalten?

Meine Frage ist, wie kann ich sicherstellen, dass eine CSV-Datei, die ich für eine DataTable erstellen, behält die Spalte Reihenfolge, die ich angeben?

Mein Skript tut dies, wie so die CSV-Header und Werte zu füllen:

...snip... 
$dataTable | ForEach-Object { 
      $csv+=New-Object PSObject -Property @{ 
       program_code=$_.ProgramCode; 
       first_name=$_.FirstName; 
       last_name=$_.LastName; 
       email=$_.email; 
       phone=$_.phone; 
       phone2=$_.otherphone; 
       address=$_.addr1; 
       address2=$_.addr2; 
       city=$_.city; 
       state=$_.state; 
       postal_code=$_.Zip; 
       country=$_.Country; 
       grad_year=$_.HsGradDate; 
       lead_date=$_.LeadDate; 
       lead_source=$_.LeadSource; 
       school_status=$_.SchoolStatus; 
     } 
     } 
    $csv | Export-CSV C:\scripts\NewLeads$(Get-Date -Format yyyyMMdd).csv -notype -Append 
...snip... 

mag ich die Datei auf Spalten in der Reihenfolge haben, dass ich im Skript angeben, aber wenn ich es in Notepad öffnen oder Excel erscheinen die Spalten in einer scheinbar zufälligen Reihenfolge. Stichwort scheinbar, da sie vielleicht eine Methode haben, sich selbst zu bestellen.

Antwort

15

In Powershell V3 statt:

 $csv+=New-Object PSObject -Property @{ 

würde ich verwenden:

 $csv+=[pscustomobject]@{ 

Der Parser Powershell V3 wird die Reihenfolge der Tasten erhalten, wenn Sie einen Hash werfen wörtliche zu entweder [ordered] oder [psustomobject]. Ein kleiner Nebeneffekt für diesen Ansatz - es wird auch schneller sein.

Wenn Sie V2 verwenden, müssen Sie den Parameter -Property zu New-Object überspringen und stattdessen mehrere Aufrufe von Add-Member verwenden. Es sieht ungefähr so ​​aus:

$csv+=New-Object PSObject | 
    Add-Member -Name program_code -Value $_.ProgramCode -MemberType NoteProperty -PassThru | 
    Add-Member -Name first_name -Value $_.FirstName -MemberType NoteProperty -PassThru | 
    ... 
+0

Danke, beide gute Lösungen! Du brauchst ein bisschen weniger tippen, worüber ich ein großer Fan bin. – ledgeJumper

+0

Die Verwendung der Notation [pscustobject] @ {} half immens bei der v2-Methode, danke – flux9998

10

Wählen Sie die Felder in der gewünschten Reihenfolge aus und exportieren Sie sie.

$csv | select-object -property program_code,first_name,last_name,email,phone,phone2,address,address2,city,state,psotal_code,country,grad_year,lead_date,lead_source,school_status | 
Export-CSV C:\scripts\NewLeads$(Get-Date -Format yyyyMMdd).csv -notype -Append 

Allerdings können Sie dies möglicherweise ein wenig kurzschließen. Abhängig davon, was $dataTable wirklich ist, können Sie (sollten in den meisten Fällen) in der Lage sein, direkt aus diesem Objekt auszuwählen und die Erstellung der Sammlung PSObjects zu umgehen. Wenn Sie jedoch die benutzerdefinierten Header benötigen, müssen Sie Ausdrücke in select-object (Zeilenumbrüche für Lesbarkeit) verwenden.

$dataTable| select-object @{Name="program_code";Expression={$_.ProgramCode}},` 
@{Name="first_name";Expression={$_.firstname}},` 
@{Name="last_name";Expression={$_.lastname}},email,phone,` 
@{Name="phone2";Expression={$_.otherphone}},` 
@{Name="addr1";Expression={$_.address}},` 
@{Name="addr2";Expression={$_.address2}},city,state,` 
@{Name="postal_code";Expression={$_.zip}},country,` 
@{Name="grad_year";Expression={$_.hsgraddate}},` 
@{Name="lead_date";Expression={$_.leaddate}},` 
@{Name="lead_source";Expression={$_.leadsource}},` 
@{Name="school_status ";Expression={$_.schoolstatus }}| 
Export-CSV C:\scripts\NewLeads$(Get-Date -Format yyyyMMdd).csv -notype -Append 
Verwandte Themen