2013-09-25 115 views
11

Tôi mới sử dụng PowerShell, vì vậy kịch bản là một Frankenstein với nhiều ví dụ khác nhau từ các trang web.Có cách nào để buộc cmdlet powershell -Export-CSV duy trì thứ tự cột cụ thể không?

Câu hỏi của tôi là làm cách nào để đảm bảo rằng tệp csv mà tôi đang tạo cho một DataTable giữ thứ tự cột mà tôi chỉ định?

Kịch bản của tôi thực hiện điều này để cư các tiêu đề csv và các giá trị như sau:

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

Tôi muốn các tập tin phải cột theo thứ tự mà tôi chỉ định trong kịch bản, nhưng khi tôi mở nó bằng notepad hoặc vượt trội các cột xuất hiện theo thứ tự dường như ngẫu nhiên. Từ khóa là dường như vì họ có thể có một số phương pháp đặt hàng mình.

Trả lời

15

Trong PowerShell V3, thay vì:

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

Tôi sẽ sử dụng:

 $csv+=[pscustomobject]@{ 

Các phân tích cú pháp PowerShell V3 sẽ giữ gìn trật tự của các phím khi bạn cast một hash đen tới [order] hoặc [pscustomobject]. Một lợi ích nhỏ của phương pháp này - nó cũng sẽ nhanh hơn.

Nếu bạn đang sử dụng V2, bạn sẽ cần bỏ qua tham số -Property thành New-Object và thay vào đó sử dụng nhiều cuộc gọi đến Add-Member. Hình ảnh trông giống như sau:

$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

Cảm ơn, cả hai giải pháp tốt! Yêu cầu của bạn một chút ít gõ, mà tôi là một fan hâm mộ lớn của. – ledgeJumper

+0

Sử dụng ký hiệu [pscustomobject] @ {} đã giúp vô cùng hơn phương pháp v2, cảm ơn – flux9998

10

Chọn các trường theo thứ tự bắt buộc, sau đó xuất.

$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 

Tuy nhiên, bạn có thể đoản mạch điều này một chút. Tùy thuộc vào những gì $dataTable thực sự là, bạn có thể (nên, trong nhiều trường hợp) có thể chọn trực tiếp từ đối tượng đó và bỏ qua việc tạo ra bộ sưu tập của PSObjects. Nhưng nếu bạn cần tiêu đề tùy chỉnh, bạn sẽ cần sử dụng các biểu thức trong select-object (dấu ngắt dòng để có thể đọc được).

$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