首页 > 解决方案 > 使用powershell获取具有数字名称的目录中的所有目录

问题描述

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

标签: powershelldirectory

解决方案


要获取仅具有数字名称的文件夹的列表,您可以执行以下操作:

$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' 后面。

我们最有可能在这里做的是让 Sort-Object 将名称视为实数,而不是字符串。为了解决这个问题,我们添加了Select-Objectcmdlet 以创建我们自己的具有我们需要的属性的对象。

我们可以获得通过管道传入的 DirInfo 对象的标准属性,并且可以创建一个新的计算属性。

在这里,我添加了一个名为的计算属性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

希望这可以帮助。


推荐阅读