Есть ли способ принудительно передать командлет -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