首先我会说我是Powershell的新手... 我可以获取指定目录中的所有目录,但只需要获取名称为数字的目录即可。示例:
1 - include
2 - include
3 - include
10 - include
LastFailed - exclude
我还需要按顺序订购它们,以便以后处理。
这是我到目前为止所拥有的:
$Dirs = Get-ChildItem -Path ..\..\..\builds -Attributes D
foreach($D in $Dirs)
{
Write-Host $D.Name
}
答案 0 :(得分:1)
要获取仅包含数字名称的文件夹的列表,可以执行以下操作:
$Path = '..\..\..\builds'
$Dirs = Get-ChildItem -Path $Path -Attributes D |
Where-Object { $_.Name -match '^\d+$' } |
Sort-Object
$Dirs
上面的代码使用Where-Object子句仅过滤出具有纯数字名称的文件夹。
它通过使用-match
运算符和正则表达式^\d+$
来做到这一点,其中:
`^` --> start at the beginning of the line
`\d` --> look for numeric values (0-9)
`+` --> there must be 1 or more numeric values present
`$` --> the end of the string
也可以使用\d
来代替[0-9]
该代码以Sort-Object
结尾,因为OP希望对文件夹列表进行排序。
因为我们不告诉您此处要排序的属性,所以Powershell默认为Name。
上面将产生一个列表,如:
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 18-8-2018 16:13 1
d----- 18-8-2018 16:13 10
d----- 18-8-2018 16:13 2
d----- 18-8-2018 16:13 5
如您所见,列表按属性排序,但是..数字被视为字符串,因此'10'跟随'1'。
我们在这里最想做的是让排序对象将名称视为实数,而不是字符串。
为了解决此问题,我们添加了Select-Object
cmdlet,以创建具有所需属性的自己的对象。
我们可以获得通过管道传递的DirInfo对象的标准属性,并且可以创建一个新的 calculated 属性。
在这里,我添加了一个名为SortIndex
的计算属性,该属性只是从Name转换而来的数字值,然后将其用于数字排序:
$Dirs = Get-ChildItem -Path $Path -Attributes D |
Where-Object { $_.Name -match '^\d+$' } |
Select-Object -Property FullName, Name, LastWriteTime, @{Name = 'SortIndex'; Expression = {[int]$_.Name} } |
Sort-Object -Property SortIndex
$Dirs
现在,它生成了一个对象数组,当打印到控制台时,它看起来像这样:
FullName Name LastWriteTime SortIndex
-------- ---- ------------- ---------
D:\Temp\1 1 18-8-2018 16:13:22 1
D:\Temp\2 2 18-8-2018 16:13:25 2
D:\Temp\5 5 18-8-2018 16:13:28 5
D:\Temp\10 10 18-8-2018 16:13:31 10
希望这会有所帮助。
答案 1 :(得分:0)
您可以利用Where-Object
来过滤您的收藏集:
$dirs = Get-ChildItem -Path ..\..\..\builds -Directory |
Where-Object -Property Name -Match '\d'
此操作使用正则表达式匹配数字类。
如果您只想使用以数字开头的 目录名,则可以使用 anchor :
'^\d'
最后,您可以使用Sort-Object
对它们进行排序:
$dirs = Get-ChildItem -Path ..\..\..\builds -Directory |
Where-Object -Property Name -Match '^\d' |
Sort-Object -Property Name
您可以通过明确显示起始数字来进一步增强这种排序:
-Property {[int]($_.Name -split '[^\d]')[0]}
在这种情况下,我们将分割第一个非数字字符并捕获被分割的第一个片段(该片段应该是表示为字符串的数字,因此我们将其转换为整数)。