Hầu hết người dùng Windows đều biết rằng cách dễ nhất để kiểm tra kích thước thư mục là mở thuộc tính thư mục trong File Explorer. Người dùng có kinh nghiệm hơn thích sử dụng công cụ của bên thứ ba như TreeSize hoặc WinDirStat. Tuy nhiên, nếu bạn muốn có thống kê chi tiết hơn về kích thước thư mục trong thư mục cụ thể hoặc loại trừ các loại file nhất định, bạn nên sử dụng tính năng PowerShell. Trong bài viết này, chúng tôi sẽ chỉ cho bạn cách nhanh chóng lấy kích thước của thư mục cụ thể trên ổ đĩa (và tất cả thư mục con) bằng PowerShell.
Bạn có thể sử dụng cmdlet Get-ChildItem (alias gci) và Measure-Object (alias measure) để lấy kích thước file và thư mục (kể cả thư mục con) trong PowerShell. Cmdlet đầu tiên cho phép bạn lấy danh sách file (với kích thước) trong thư mục được chỉ định theo tiêu chí đã cho, và cmdlet thứ hai thực hiện các phép toán số học.
Mẹo. Trong một bài viết trước, chúng tôi đã chỉ cách sử dụng cmdlet Get-ChildItem trong PowerShell để tìm file lớn nhất trên ổ đĩa.
Ví dụ, để lấy kích thước thư mục C:\ISO, hãy chạy lệnh sau:
Get-ChildItem C:\ISO | Measure-Object -Property Length -sum

Như bạn thấy, tổng kích thước file trong thư mục này được hiển thị trong trường Sum và khoảng 2.1 GB (kích thước được cho bằng byte).
Để chuyển đổi kích thước sang MB hoặc GB thuận tiện hơn, sử dụng lệnh này:
(gci c:\iso | measure Length -s).sum / 1Gb
Hoặc:
(gci c:\iso | measure Length -s).sum / 1Mb
Để làm tròn kết quả đến hai chữ số thập phân, chạy lệnh sau:
"{0:N2} GB" -f ((gci c:\iso | measure Length -s).sum / 1Gb)

Bạn có thể sử dụng PowerShell để tính tổng kích thước của tất cả file thuộc một loại nhất định trong thư mục. Ví dụ, bạn muốn lấy tổng kích thước của tất cả file ISO trong một thư mục:
(gci c:\iso *.iso | measure Length -s).sum / 1Mb

Các lệnh hiển thị ở trên chỉ cho phép bạn lấy tổng kích thước file trong thư mục được chỉ định. Nếu có thư mục con trong thư mục, kích thước file trong thư mục con sẽ không được tính. Để lấy tổng kích thước file trong thư mục bao gồm thư mục con, sử dụng tham số –Recurse. Hãy lấy tổng kích thước file trong thư mục C:\Windows:
"{0:N2} GB" -f ((gci –force c:\Windows –Recurse -ErrorAction SilentlyContinue| measure Length -s).sum / 1Gb)
Để tính đến kích thước file ẩn và hệ thống, tôi đã sử dụng đối số –force cũng như vậy.
Vì vậy, kích thước của C:\Windows trên ổ cục bộ của tôi là khoảng 40 GB (script bỏ qua nén NTFS).
Mẹo. Để ngăn lỗi truy cập thư mục (PermissionDenied -> DirUnauthorizedAccessError), sử dụng tham số -ErrorAction SilentlyContinue.

Script này tính toán không chính xác kích thước thư mục nếu nó chứa symbolic link hoặc hard link. Ví dụ, thư mục C:\Windows chứa nhiều hard link đến file trong thư mục WinSxS (Windows Component Store). Kết quả, các file như vậy có thể được đếm nhiều lần. Để bỏ qua hard link trong kết quả, sử dụng lệnh sau (mất nhiều thời gian để hoàn thành):
"{0:N2} GB" -f ((gci –force C:\windows –Recurse -ErrorAction SilentlyContinue | Where-Object { $_.LinkType -notmatch "HardLink" }| measure Length -s).sum / 1Gb)

Như bạn thấy, kích thước thực tế của thư mục Windows nhỏ hơn một chút.
Bạn có thể sử dụng bộ lọc để chọn file cần xem xét khi tính toán kích thước cuối cùng. Ví dụ, bạn có thể lấy kích thước file được tạo trong năm 2020:
(gci -force c:\ps –Recurse -ErrorAction SilentlyContinue | ? {$_.CreationTime -gt ‘1/1/20’ -AND $_.CreationTime -lt ‘12/31/20’}| measure Length -s).sum / 1Gb
Bạn có thể lấy kích thước của tất cả thư mục con cấp một trong thư mục được chỉ định. Ví dụ, bạn muốn lấy kích thước của tất cả hồ sơ người dùng trong thư mục C:\Users.
gci -force 'C:\Users'-ErrorAction SilentlyContinue | ? { $_ -is [io.directoryinfo] } | % {
$len = 0
gci -recurse -force $_.fullname -ErrorAction SilentlyContinue | % { $len += $_.length }
$_.fullname, '{0:N2} GB' -f ($len / 1Gb)
}

% là alias cho vòng lặp foreach-object.
Tiếp tục. Giả sử, nhiệm vụ của bạn là tìm kích thước của từng thư mục trong gốc ổ cứng hệ thống và trình bày thông tin dưới dạng bảng thuận tiện để phân tích và có thể sắp xếp theo kích thước thư mục.
Để lấy thông tin về kích thước thư mục trên ổ hệ thống C:\, hãy chạy script PowerShell sau:
$targetfolder='C:\'
$dataColl = @()
gci -force $targetfolder -ErrorAction SilentlyContinue | ? { $_ -is [io.directoryinfo] } | % {
$len = 0
gci -recurse -force $_.fullname -ErrorAction SilentlyContinue | % { $len += $_.length }
$foldername = $_.fullname
$foldersize= '{0:N2}' -f ($len / 1Gb)
$dataObject = New-Object PSObject
Add-Member -inputObject $dataObject -memberType NoteProperty -name “foldername” -value $foldername
Add-Member -inputObject $dataObject -memberType NoteProperty -name “foldersizeGb” -value $foldersize
$dataColl += $dataObject
}
$dataColl | Out-GridView -Title “Size of subdirectories”

Như bạn thấy, giao diện đồ họa của bảng sẽ xuất hiện nơi tất cả thư mục trong gốc ổ hệ thống C:\ và kích thước của chúng được hiển thị (bảng được tạo bởi cmdlet Out-GridView). Bằng cách nhấp vào tiêu đề cột, bạn có thể sắp xếp thư mục theo kích thước. Bạn cũng có thể xuất kết quả ra CSV (| Export-Csv folder_size.csv) hoặc file Excel.
Nếu bạn đang sử dụng kiểm tra kích thước thư mục trong script PowerShell của mình, bạn có thể tạo một function riêng:
function Get-FolderSize {
[CmdletBinding()]
Param (
[Parameter(Mandatory=$true,ValueFromPipeline=$true)]
$Path
)
if ( (Test-Path $Path) -and (Get-Item $Path).PSIsContainer ) {
$Measure = Get-ChildItem $Path -Recurse -Force -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum
$Sum = '{0:N2}' -f ($Measure.Sum / 1Gb)
[PSCustomObject]@{
"Path" = $Path
"Size($Gb)" = $Sum
}
}
}
Để sử dụng function, chỉ cần chạy lệnh với đường dẫn thư mục làm đối số:
Get-FolderSize ('C:\PS')

Bạn có thể sử dụng function PowerShell cục bộ của mình để kiểm tra kích thước thư mục trên máy tính từ xa qua cmdlet Invoke-Command (PowerShell Remoting).
Invoke-Command -ComputerName hq-srv01 -ScriptBlock ${Function:Get-FolderSize} –ArgumentList 'C:\PS'

Các lệnh này hoạt động trong tất cả phiên bản PowerShell, bao gồm các phiên bản mới hơn của PowerShell Core 7.x.