按前导数字排序文件版本

时间:2018-05-29 19:43:52

标签: powershell

我创建了一个脚本来创建一个报告,列出所有不是最新的文件。我想先以2018年开头的那些人订购这些文件。除此之外,我没有偏好。

dir *.exe | %{ $_.VersionInfo } | Where-Object {$_.FileVersion -NotMatch "^2018.1"} | Sort-Object FileVersion -Descending > V:\file.path\binFileVersion.txt

我目前的输出:

4.0.30319.01
3.10.0.0
2018.0.0.0
2018.0.0.0
2018.0.0.0
2018.0.0.0
2.5.3.5
15, 0, 3, 0
1.0.0.0

期望的输出:

2018.0.0.0
2018.0.0.0
2018.0.0.0
2018.0.0.0
Everything else
Everything else

我一直在修修补补,但还没有真正找到解决方案。我看到另一个关于垫左侧的帖子,但这并没有真正做到预期的动作。

谢谢!

有人发布了一个有效但在我批准之前被删除的答案。

$Match,$NotMatch = (dir *.exe | %{ $_.VersionInfo } | Where-Object {$_.FileVersion -NotMatch "^2018.1"} | Sort-Object FileVersion -Descending).Where({$_.FileVersion -like '2018*'},'Split') 
@($Match,$NotMatch)

欣赏它!

2 个答案:

答案 0 :(得分:2)

您可以将.Where()方法与拆分重载一起使用,将其拆分为两个集合,以确定它是否与2018*匹配。然后首先返回匹配的集合。

$Match,$NotMatch = (dir *.exe | %{ $_.VersionInfo } | Where-Object {$_.FileVersion -NotMatch "^2018.1"} | Sort-Object FileVersion -Descending).Where({$_.FileVersion -like '2018*'},'Split')
@($Match,$NotMatch)

注意:需要PowerShell 4 +

答案 1 :(得分:0)

你可以使用正则表达式,试试这个:

dir *.exe | %{ $_.VersionInfo } | Where-Object {$_.FileVersion -NotMatch "^2018.1"} | 
Sort-Object {[regex]::Match($_,'2018')} -Descending