PowerShell腳本進(jìn)階統(tǒng)計(jì)目錄大小并包含隱藏文件
1. 引言
在日常系統(tǒng)管理和文件整理工作中,我們經(jīng)常需要統(tǒng)計(jì)某個(gè)目錄(及其子目錄)的占用空間。PowerShell 提供了強(qiáng)大的文件遍歷和計(jì)算能力,但默認(rèn)情況下,它不會(huì)處理隱藏文件或系統(tǒng)文件。本文將詳細(xì)介紹如何使用 PowerShell 遞歸計(jì)算文件夾大小,并確保包含隱藏文件。
2. PowerShell 基礎(chǔ):Get-ChildItem和文件統(tǒng)計(jì)
2.1Get-ChildItem基本用法
Get-ChildItem(別名 dir 或 ls)是 PowerShell 中用于列出文件和目錄的核心命令?;菊Z(yǔ)法:
Get-ChildItem -Path "C:\TargetFolder"
-Path:指定目標(biāo)路徑(默認(rèn)當(dāng)前目錄)-Directory:僅返回目錄-File:僅返回文件-Recurse:遞歸遍歷子目錄
2.2 計(jì)算文件夾大小
要計(jì)算文件夾大小,我們需要:
- 遍歷所有文件
- 累加文件大?。?code>Length 屬性)
- 轉(zhuǎn)換為合適的單位(如 MB、GB)
示例:計(jì)算單個(gè)文件夾大小
$folderPath = "C:\Example"
$files = Get-ChildItem -Path $folderPath -Recurse -File
$totalSize = ($files | Measure-Object -Property Length -Sum).Sum / 1MB
Write-Host "Total Size: $($totalSize.ToString('0.00')) MB"
Measure-Object -Sum計(jì)算總和/ 1MB轉(zhuǎn)換為 MB(1MB = 1024 * 1024 字節(jié))
3. 隱藏文件的處理
3.1 什么是隱藏文件和系統(tǒng)文件
- 隱藏文件:在 Windows 中,文件或目錄可以設(shè)置
Hidden屬性(如.git目錄)。 - 系統(tǒng)文件:通常是操作系統(tǒng)關(guān)鍵文件(如
pagefile.sys)。
默認(rèn)情況下,Get-ChildItem 不會(huì)返回隱藏或系統(tǒng)文件。
3.2-Force參數(shù)的作用
-Force 參數(shù)讓 Get-ChildItem 返回 所有 文件,包括:
- 隱藏文件
- 系統(tǒng)文件
- 只讀文件
示例:列出所有文件(含隱藏文件)
Get-ChildItem -Force
4. 優(yōu)化腳本:遞歸計(jì)算并包含隱藏文件
4.1 原始腳本分析
最初的腳本僅計(jì)算非隱藏目錄和文件:
Get-ChildItem -Directory | ForEach-Object {
$size = (Get-ChildItem -Path $_.FullName -Recurse -File | Measure-Object -Property Length -Sum).Sum / 1MB
[PSCustomObject]@{
Folder = $_.Name
Size_MB = [math]::Round($size, 2)
}
} | Sort-Object Size_MB -Descending
問(wèn)題:
- 不會(huì)統(tǒng)計(jì)隱藏文件夾(如
AppData) - 不會(huì)統(tǒng)計(jì)隱藏文件(如
.gitignore)
4.2 改進(jìn)后的腳本(支持隱藏文件)
添加 -Force 參數(shù),確保包含隱藏文件:
Get-ChildItem -Directory -Force | ForEach-Object {
$size = (Get-ChildItem -Path $_.FullName -Recurse -File -Force | Measure-Object -Property Length -Sum).Sum / 1MB
[PSCustomObject]@{
Folder = $_.Name
Size_MB = [math]::Round($size, 2)
}
} | Sort-Object Size_MB -Descending
改進(jìn)點(diǎn):
Get-ChildItem -Directory -Force:包含隱藏目錄Get-ChildItem -Recurse -File -Force:遞歸計(jì)算所有文件(含隱藏文件)
5. 腳本執(zhí)行優(yōu)化與注意事項(xiàng)
5.1 提高執(zhí)行效率
- 避免重復(fù)計(jì)算:如果目錄層級(jí)很深,遞歸遍歷可能較慢,可考慮并行計(jì)算(
ForEach-Object -Parallel,需 PowerShell 7+)。 - 限制遞歸深度:使用
-Depth參數(shù)(如-Depth 3僅遍歷 3 層子目錄)。
5.2 處理權(quán)限問(wèn)題
- 管理員權(quán)限:某些系統(tǒng)目錄(如
C:\Windows)需要管理員權(quán)限才能訪問(wèn)。 - 錯(cuò)誤處理:使用
-ErrorAction SilentlyContinue忽略無(wú)權(quán)限訪問(wèn)的目錄。
優(yōu)化后的腳本(帶錯(cuò)誤處理)
Get-ChildItem -Directory -Force -ErrorAction SilentlyContinue | ForEach-Object {
$size = (Get-ChildItem -Path $_.FullName -Recurse -File -Force -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum / 1MB
[PSCustomObject]@{
Folder = $_.Name
Size_MB = [math]::Round($size, 2)
}
} | Sort-Object Size_MB -Descending
6. 完整代碼示例
# 計(jì)算當(dāng)前目錄下所有文件夾大小(含隱藏文件)
$results = Get-ChildItem -Directory -Force -ErrorAction SilentlyContinue | ForEach-Object {
$size = (Get-ChildItem -Path $_.FullName -Recurse -File -Force -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum / 1MB
[PSCustomObject]@{
Folder = $_.Name
Size_MB = [math]::Round($size, 2)
}
} | Sort-Object Size_MB -Descending
# 輸出結(jié)果
$results | Format-Table -AutoSize
# 可選:導(dǎo)出到 CSV
$results | Export-Csv -Path "FolderSizes.csv" -NoTypeInformation
7. 總結(jié)
Get-ChildItem -Force是統(tǒng)計(jì)隱藏文件的關(guān)鍵。- 遞歸計(jì)算 適用于文件夾大小統(tǒng)計(jì),但需注意性能問(wèn)題。
- 錯(cuò)誤處理 可避免因權(quán)限問(wèn)題導(dǎo)致腳本中斷。
通過(guò)本文的優(yōu)化方法,您可以更準(zhǔn)確地計(jì)算文件夾大小,適用于磁盤清理、日志分析等場(chǎng)景。
進(jìn)一步優(yōu)化方向:
- 使用
Robocopy進(jìn)行快速統(tǒng)計(jì)(適用于超大型目錄) - 采用多線程加速計(jì)算(PowerShell 7+)
到此這篇關(guān)于PowerShell腳本進(jìn)階統(tǒng)計(jì)目錄大小并包含隱藏文件的文章就介紹到這了,更多相關(guān)PowerShell統(tǒng)計(jì)目錄大小內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
探索PowerShell(五) PowerShell基礎(chǔ)知識(shí)
在PowerShell中,我們可以輕松的與數(shù)據(jù)、對(duì)象進(jìn)行交互,為了簡(jiǎn)化我們?cè)L問(wèn)外部數(shù)據(jù),PowerShell允許我們像操作驅(qū)動(dòng)器、文件一樣對(duì)數(shù)據(jù)、對(duì)象等進(jìn)行操作2012-12-12
PowerShell面向?qū)ο缶幊袒A(chǔ)知識(shí)總結(jié)
這篇文章主要介紹了PowerShell面向?qū)ο缶幊袒A(chǔ)知識(shí)總結(jié),本文著重講解面向?qū)ο蟮囊恍└拍?又給出了Get-Member命令輸出類的屬性和方法的例子,需要的朋友可以參考下2014-08-08
PowerShell中定義哈希散列(Hash)和調(diào)用例子
這篇文章主要介紹了PowerShell中定義哈希散列(Hash)和調(diào)用例子,本文介紹在PowerShell中如何創(chuàng)建一個(gè)哈希變量,并且使用哈希變量,需要的朋友可以參考下2014-08-08
Powershell 之批量獲取文件大小的實(shí)現(xiàn)代碼
這篇文章主要介紹了Powershell 之批量獲取文件大小的實(shí)現(xiàn)代碼,需要的朋友可以參考下2016-11-11
簡(jiǎn)單談?wù)凱owerShell 4.0中的新命令
powershell 4.0都出來(lái)那么長(zhǎng)時(shí)間了,相對(duì)于powershell 3.0,它的命令都改變了哪些,有哪些更新呢?下面我們就來(lái)詳細(xì)談?wù)勂渲械?0個(gè)新命令2015-09-09
PowerShell函數(shù)中的開(kāi)關(guān)參數(shù)介紹和創(chuàng)建實(shí)例
這篇文章主要介紹了PowerShell函數(shù)中的開(kāi)關(guān)參數(shù)介紹和創(chuàng)建實(shí)例,開(kāi)關(guān)參數(shù)顧名思義就是起到一個(gè)開(kāi)關(guān)作用,需要的朋友可以參考下2014-07-07
PowerShell腳本實(shí)現(xiàn)創(chuàng)建桌面快捷方式的方法
這篇文章主要介紹了PowerShell腳本實(shí)現(xiàn)創(chuàng)建桌面快捷方式的方法,本文通過(guò)調(diào)用WScript腳本組件實(shí)現(xiàn),需要的朋友可以參考下2014-08-08
Powershell小技巧之系統(tǒng)運(yùn)行時(shí)間
本文主要教你如何使用powershell計(jì)算系統(tǒng)運(yùn)行時(shí)間,其實(shí)很簡(jiǎn)單,因?yàn)閃indows每次啟動(dòng)都有一個(gè)高進(jìn)度計(jì)數(shù)器并且當(dāng)系統(tǒng)運(yùn)行這個(gè)計(jì)數(shù)器將返回一個(gè)毫秒,我們把這個(gè)毫秒計(jì)算下就得到系統(tǒng)運(yùn)行時(shí)間了2014-09-09

