簡體   English   中英

使用powershell獲取具有數字名稱的目錄中的所有目錄

[英]Get all directories in directory that has a numeric name with 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
}

要僅獲取具有數字名稱的文件夾的列表,可以執行以下操作:

$Path = '..\..\..\builds'
$Dirs = Get-ChildItem -Path $Path -Attributes D | 
        Where-Object { $_.Name -match '^\d+$' } | 
        Sort-Object
$Dirs

上面的代碼使用Where-Object子句僅過濾出具有純數字名稱的文件夾。 它通過使用-match運算符和正則表達式^\\d+$來執行-match操作,其中:

`^`  --> 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對象的標准屬性,並且可以創建一個新的計算屬性。

在這里,我添加了一個名為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

希望這可以幫助。

您可以利用Where-Object來過濾您的集合:

$dirs = Get-ChildItem -Path ..\..\..\builds -Directory |
    Where-Object -Property Name -Match '\d'

此操作使用正則表達式來匹配數字類。


如果您只想以數字開頭的目錄名稱,則可以使用錨點

'^\d'

最后,您可以使用Sort-Object對它們進行Sort-Object

$dirs = Get-ChildItem -Path ..\..\..\builds -Directory |
    Where-Object -Property Name -Match '^\d' |
    Sort-Object -Property Name

您可以通過明確說明起始數字來進一步增強這種排序:

-Property {[int]($_.Name -split '[^\d]')[0]}

在這種情況下,我們將分割第一個非數字字符並捕獲被分割的第一個片段(該片段應為表示為字符串的數字,因此我們將其轉換為整數)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM