Powershell Sort-Object by [DateTime] :: ParseExact

时间:2011-04-28 16:15:20

标签: powershell

我正在尝试使用PowerShell按日期对控制台程序返回的行进行排序。

日期是以MM / dd / yyyy格式格式化的,因此必须将它们转换为DateTime对象,使其处于可排序的格式。

要解析日期,我使用:

$dates = %{ "10/24/2010", "02/03/2010" }
$dates | %{ [System.DateTime]::ParseExact($_, "MM/dd/yyyy", $null) }

这会将日期解析为System.DateTime对象并显示其默认的ToString()表示,但它也会在开头显示另一个空行。

现在,如果我尝试使用Sort-Object对日期进行排序,我会收到一条错误消息,我猜错误来自额外的空行:

$sortedDates = $dates | Sort-Object [System.DateTime]::ParseExact($_, "MM/dd/yyyy", $null)

错误讯息:

  

“Sort-Object:找不到接受参数'System.Object []'的位置参数。”

多余的空白行是从哪里来的?我在解析日期或对它们进行排序时做错了吗?

2 个答案:

答案 0 :(得分:7)

我认为部分问题出在第一行。

%{}表示foreach-object {}。

我认为你的意思是@(,)。你甚至不需要@()。

$dates= "10/24/2010", "02/03/2010"  

工作正常 要按“派生字段”排序,请使用脚本块。

$sortedDates = $dates | Sort-Object {[System.DateTime]::ParseExact($_, "MM/dd/yyyy", $null)}

答案 1 :(得分:0)

作为参考,如果有人有类似的问题,这是我的完整解决方案(基于接受的答案)

我按日期排序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