使用powershell获取具有数字名称的目录中的所有目录

时间:2018-08-17 20:43:17

标签: powershell directory

首先我会说我是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
}

2 个答案:

答案 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]}

在这种情况下,我们将分割第一个非数字字符并捕获被分割的第一个片段(该片段应该是表示为字符串的数字,因此我们将其转换为整数)。