Командлет get-member возвращает NoteProperties, всегда отсортированные в алфавитном порядке. См. Пример выходных данных ниже.
Из import-csv я получил массив в памяти, теперь я хочу, чтобы get-member сортировал имена членов по исходной позиции, а не по буквенно-цифровому значению.
Исходная последовательность отображается в строке $ _. Psextended.Definition (имена столбцов объединяются запятыми)
Я не могу редактировать имена свойств на месте, так как они доступны только для чтения.
В качестве обходного пути я попытался добавить числовой префикс к имени столбца, см. Код ниже
Есть идеи получше?
Я не хочу редактировать исходный файл данных на месте.
$content = (import-csv -delimiter "`t" $infile_abs );
$colnames = $content | get-Member | where-object {$_.MemberType -eq "NoteProperty"} ; #| out-gridview;
$cols = $content | get-Member -force | where-object {$_.Name -eq "psextended"} ;
echo($cols.Definition -replace "psextended" , "");
$i = 0;
$colnames| sort-object -descending | foreach-object {
$i++ ;
$cn = [string]::Format( "{0:00}_{1}", $i, $_.Name ) ;
Write-Host $cn
};
Пример вывода psextended
{Имя файла, Метка, ObsDateTime,
Порт №, Obs #, Exp_Flux, IV Cdry, IV
Чам, IV Давление, IV H2O, IV V3, IV
V4, IV RH}
Вывод $ colnames = $ content | get-Member | Out-GridView;
Exp_Flux NoteProperty System.String Exp_Flux=0,99
File Name NoteProperty System.String File Name=xxx-11040
IV Cdry NoteProperty System.String IV Cdry=406.96
IV H2O NoteProperty System.String IV H2O=9.748
IV Pressure NoteProperty System.String IV Pressure=100.7
IV RH NoteProperty System.String IV RH=53.12
IV Tcham NoteProperty System.String IV Tcham=16.19
IV V3 NoteProperty System.String IV V3=11.395
IV V4 NoteProperty System.String IV V4=0.759
Label NoteProperty System.String Label=5m
Obs# NoteProperty System.String Obs#=1
ObsDateTime NoteProperty System.String ObsDateTime=2011-04-04 13:19:37
Port# NoteProperty System.String Port#=1
РЕДАКТИРОВАТЬ: (пока нет ответов)
Вот пользовательская функция сортировки, теперь мне нужно сказать Get-Member, чтобы использовать эту функцию сортировки. Как это сделать в конвейере?
#$orig_seq = $cols.Definition -replace "psextended", "" -replace "[{}]", "";
$orig_seq = "File Name, Label, ObsDateTime, Port#, Obs#, Exp_Flux, IV Cdry, IV Tcham, IV Pressure, IV H2O, IV V3, IV V4, IV RH";
echo $orig_seq;
#exit;
&{
$byPos= @{};
$i = 0;
$orig_seq.Split(",") | % { $byPos[$i++] = $_.trim()}
$order = ([int[]] $byPos.keys) | sort
#$order | %{ ([string]::Format( "{0} => {1}", $_, $byPos[$_])) }
$order | %{ $byPos[$_] }
}