Есть ли способ принудительно передать командлет -sport-CSV powershell для поддержания определенного порядка столбцов?

Я новичок в powershell, поэтому script является Frankenstein различных примеров из сайтов.

Мой вопрос в том, как я могу убедиться, что созданный мной CSV файл для DataTable сохраняет порядок столбцов, который я указываю?

My script делает это для заполнения заголовков и значений csv следующим образом:

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

Я хочу, чтобы файл имел столбцы в порядке, указанном мной в script, но когда я открываю его в блокноте или преуспеваю, столбцы отображаются в случайном порядке. Ключевое слово кажется, так как у них может быть некоторый метод упорядочения себя.

Ответ 1

В PowerShell V3 вместо:

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

Я бы использовал:

        $csv+=[pscustomobject]@{

Анализатор PowerShell V3 сохранит порядок ключей, когда вы нарисуете хеш литерал на [упорядоченный] или [pscustomobject]. Небольшое преимущество этого подхода - оно также будет быстрее.

Если вы используете V2, вам нужно пропустить параметр -Property для New-Object и вместо этого использовать несколько вызовов для Add-Member. Он будет выглядеть примерно так:

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

Ответ 2

Выберите поля в требуемом порядке, затем экспортируйте.

$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

Однако, возможно, вы сможете коротко закоротить это. В зависимости от того, что действительно существует $dataTable, вы можете (в большинстве случаев) иметь возможность напрямую выбирать из этого объекта и обходить создание коллекции PSObjects. Но если вам нужны пользовательские заголовки, вам нужно будет использовать выражения в select-object (linebreaks для чтения).

$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