2024年10月25日 星期五

[PowerShell] 查詢路徑底下所有檔案名稱、副檔名

        最近遇到客戶需要分析一台舊Server,想知道上面共有哪些檔案及其類型(聽粗估約有幾百萬個檔案)
原本是被要求寫支小程式來跑迴圈分析,但考慮到執行效能等問題,
所以花了點時間研究了一下該如何寫PowerShell來達到效果,下面紀錄結果。

假設目前有一資料夾如下圖結構,共兩個檔案(A.txt、Google.url)、一個資料夾

現在要使用語法將資料下底下檔案抓出:
$FolderPath = 'D:\目標目錄'         #宣告變數=目標目錄
Get-ChildItem -Path $FolderPath -Recurse -File         #-Recurse:搜尋子目錄、-File:只取檔案清單(沒有-File的話資料夾也會取出來)

執行後如下圖:

在輸出成CSV檔案之前,先整理只留下需要的檔案屬性

$FolderPath = 'D:\目標目錄'
Get-ChildItem -Path $FolderPath -Recurse -File |         #|運算子(pipeline operators):代表把第一個cmd結果丟到第二個cmd執行
     ForEach-Object -Process {         #物件集合迴圈、-Process{}:要執行的腳本區塊
         [PSCustomObject][ordered]@{         #[ordered]@{}:OrderedDictionary物件、[PSCustomObject]:轉成一般物件
             Directory = $_.DirectoryName         #$_:迴圈中的element物件
             Name = $_.Name
             Extension = $_.Extension
         }
     }

執行後如下圖:

最後再把整理完後的物件集合輸出成CSV檔案,並加上輸出完成訊息

$FolderPath = 'D:\目標目錄'
Get-ChildItem -Path $FolderPath -Recurse -File |
     ForEach-Object -Process {
         [PSCustomObject][ordered]@{
             Directory = $_.DirectoryName
             Name = $_.Name
             Extension = $_.Extension
         }
     } |
     Export-Csv -Path 'D:\test1.csv' -NoTypeInformation -encoding utf8
Write-Output '完成'

執行後如下圖:

開啟CSV成果如圖

這樣就可以很明確知道 所在目錄、檔名、副檔名資訊。
最後在那台Server上執行大約跑了半個小時才完成,不過相信至少比小程式來處理快多了。



沒有留言:

張貼留言