我正在编写一个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.1
,Extras_1.3.8
和etc_1.2.6
并运行一个名为run.bat
的文件,该文件存在于每个文件夹中那些目录。
所以我需要找到Core_*
中的最高版本,Extras_*
中的最高版本等。
如果有某种方法可以获得具有特定前缀的文件夹名称数组,那么按字母顺序对该数组的元素进行排序,并返回数组中可以完美运行的最后一项。我希望远离根据修改日期选择文件夹,因为这可能会有问题。
答案 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的目的是有用的。