Powershell:按版本号选择文件夹

时间:2014-08-29 16:37:13

标签: powershell

我正在编写一个PowerShell脚本,该脚本会进入几个文件夹并在所述文件夹中运行.bat文件。这些文件夹经常更新,我只需要从某种类型的最新文件夹运行脚本。

文件夹看起来像这样:

Core_1.1.2
Core_1.3.4
Core_1.4.1
Extras_1.0.4
Extras_1.2.5
Extras_1.3.8
etc_1.1.2
etc_1.1.9
etc_1.2.6

使用上述文件夹作为示例,我需要进入Core_1.4.1Extras_1.3.8etc_1.2.6并运行一个名为run.bat的文件,该文件存在于每个文件夹中那些目录。

所以我需要找到Core_*中的最高版本,Extras_*中的最高版本等。

如果有某种方法可以获得具有特定前缀的文件夹名称数组,那么按字母顺序对该数组的元素进行排序,并返回数组中可以完美运行的最后一项。我希望远离根据修改日期选择文件夹,因为这可能会有问题。

3 个答案:

答案 0 :(得分:4)

有一个System.Version类可以帮助您进行解析和排序。这解决了比较字符串引起的问题。比较字符串将导致词典排序,其中1.10.0是"较低"比1.2.0。这不是比较版本号时使用的典型顺序。这样的事情可以找到最新的" Core"文件夹:

$core = ls -Filter Core_* | sort { [version]($_.Name -replace '^.*_(\d+(\.\d+){1,3})$', '$1') } -Descending | select -Index 0

然后只需调用bat文件:

 & "$($core.FullName)\activate.bat"

答案 1 :(得分:2)

我的第一个想法是这样的:

$versions = { [int]($_.Name -replace '.*?_(\d+)\.(\d+)\.(\d+)', '$1') }, { [int]($_.Name -replace '.*?_(\d+)\.(\d+)\.(\d+)', '$2') }, { [int]($_.Name -replace '.*?_(\d+)\.(\d+)\.(\d+)', '$3') }

#Get folders
Get-ChildItem |
#Extract versions and sort highest first
Sort-Object $versions -Descending |
#Get first item/folder (highest version)
Select-Object -First 1


    Directory: C:\Users\Frode\Desktop\test


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        29.08.2014     18:43            Core_1.4.1  

答案 2 :(得分:1)

我将使用RegEx,Group和一些字符串组合提供替代方案。

PS C:\Users> $Folders = Get-ChildItem $path -directory | Where{$_.name -match "(.+?_)(.*)$"} | ForEach{[pscustomobject]@{'base'=$matches[1];'version'=$matches[2]}} | group base | ForEach{($_.Name)+($_.group|select -last 1 -ExpandProperty version)}

PS C:\Users> $Folders 
Core_1.4.1
Extras_1.3.8
BP_1.2.6

PS C:\Users> $Folders | ForEach{& "$path\$_\BatchFile.bat"}

编辑:我喜欢人们如何记下事情,但是不愿意评论他们为何将其标记下来。我的答案对于OP的目的是有用的。