最近遇到客戶需要分析一台舊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上執行大約跑了半個小時才完成,不過相信至少比小程式來處理快多了。
沒有留言:
張貼留言