Powershell Сортирует объект по [дате-времени] ::синтаксический анализ

#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