#powershell
#powershell
Вопрос:
Я пытаюсь отсортировать строки, возвращаемые консольной программой, по дате, используя PowerShell.
Даты отформатированы в формате ММ / дд / гггг, поэтому их необходимо преобразовать в объекты DateTime, чтобы они были в сортируемом формате.
Для анализа дат я использую:
$dates = %{ "10/24/2010", "02/03/2010" }
$dates | %{ [System.DateTime]::ParseExact($_, "MM/dd/yyyy", $null) }
Это преобразует даты в систему.Объекты DateTime и отображает их представление toString() по умолчанию, но в начале также отображается дополнительная пустая строка.
Теперь, если я пытаюсь отсортировать даты с помощью Sort-Object, я получаю сообщение об ошибке, и я предполагаю, что ошибка возникает из дополнительной пустой строки:
$sortedDates = $dates | Sort-Object [System.DateTime]::ParseExact($_, "MM/dd/yyyy", $null)
Сообщение об ошибке:
«Объект сортировки: не удается найти позиционный параметр, который принимает аргумент ‘System.Объект[]’.»
Откуда берется лишняя пустая строка? Я делаю что-то неправильно для анализа дат или для их сортировки?
Ответ №1:
Я думаю, что часть проблемы заключается в первой строке.
%{ } означает foreach-object { } .
Я думаю, вы имели в виду @( , ). На самом деле вам даже не нужен @( ) .
$dates= "10/24/2010", "02/03/2010"
работает нормально.
Для сортировки по «производному полю» используйте scriptblock.
$sortedDates = $dates | Sort-Object {[System.DateTime]::ParseExact($_, "MM/dd/yyyy", $null)}
Ответ №2:
Для справки, если у кого-то есть подобная проблема, вот мое полное решение (основанное на принятом ответе)
Я сортирую выходные данные tf.exe метки (командная строка TFS) по дате, а затем получает самую последнюю метку:
$lines = tf labels | Select-Object -skip 2 # Skip the header lines
$sortedLines = $lines | Sort-Object { [DateTime]::ParseExact(($_ -split 's ')[2],"M/d/yyyy",$null) }
$labels = $sortedLines | %{ ($_ -split 's ')[0] } # get the first column
$latestLabel = $labels[-1] # Last item in the list