2013-09-25 16 views
11

Sono nuovo in PowerShell, quindi lo script è un Frankenstein di vari esempi di siti.Esiste un modo per forzare il cmdlet PowerShell -Export-CSV per mantenere un ordine di colonne specifico?

La mia domanda è: come posso essere sicuro che un file csv che sto creando per un DataTable mantenga l'ordine delle colonne che specifichi?

Il mio script significa questo per popolare le intestazioni ei valori csv in questo modo:

...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... 

voglio il file per avere alle colonne nell'ordine in cui ho specificato nella sceneggiatura, ma quando l'ho aperto in blocco note o eccellere le colonne appaiono in un ordine apparentemente casuale. La parola chiave è apparentemente dal momento che potrebbe avere qualche metodo per ordinarsi.

risposta

15

In PowerShell V3, invece di:

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

userei:

 $csv+=[pscustomobject]@{ 

Il parser PowerShell V3 sarà preservare l'ordine delle chiavi quando lanci un hash letterale su [ordinato] o [oggetto personalizzato]. Un piccolo vantaggio per questo approccio - sarà anche più veloce.

Se si utilizza V2, è necessario saltare il parametro -Property su New-Object e utilizzare invece più chiamate a Add-Member. Assomiglierà a:

$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

Grazie, entrambe buone soluzioni! Il tuo bisogno di un po 'meno di battitura, di cui sono un grande fan. – ledgeJumper

+0

L'uso della notazione [pscustomobject] @ {} ha aiutato immensamente il metodo v2, grazie – flux9998

10

Selezionare i campi nell'ordine richiesto, quindi esportare.

$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 

Tuttavia, potresti essere in grado di cortocircuitarlo leggermente. A seconda di cosa sia realmente lo $dataTable, è possibile (dovrebbe, nella maggior parte dei casi) essere in grado di selezionare direttamente da tale oggetto e ignorare la creazione della raccolta di PSObjects. Ma se hai bisogno delle intestazioni personalizzate, dovrai utilizzare le espressioni in select-object (interruzioni di riga per la leggibilità).

$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 
Problemi correlati