বেশির উইন্ডোজ ব্যবহারকারী জানেন যে ফোল্ডার সাইজ চেক করার সবচেয়ে সহজ পথ হল ফাইল এক্সপ্লোরারে ফোল্ডার প্রোপার্টিজ খোলা। অভিজ্ঞ ব্যবহারকারীরা TreeSize বা WinDirStat gibi থার্ড-পার্টি টুল পছন্দ করেন। তবে আপনি যদি নির্দিষ্ট ডিরেক্টরিতে ফোল্ডার সাইজের বিস্তারিত Статистиক চান বা নির্দিষ্ট ফাইল টাইপ বাদ দিতে চান, তবে PowerShell ফিচারগুলো ব্যবহার করা ভালো। এই নিবন্ধে আমরা দেখব কিভাবে PowerShell ব্যবহার করে ডিস্কে নির্দিষ্ট ফোল্ডার (এবং সব সাবফোল্ডার) এর সাইজ দ্রুত পেতে হয়।
ফাইল এবং ফোল্ডার (সাবফোল্ডার সহ) সাইজ পেতে PowerShell-এ Get-ChildItem (gci এলিয়াস) এবং Measure-Object (measure এলিয়াস) কমান্ডলেট ব্যবহার করা যায়। প্রথম কমান্ডলেট নির্দিষ্ট ডিরেক্টরিতে নির্দিষ্ট করিটারিয়া অনুযায়ী ফাইল তালিকা (সাইজসহ) পেতে দেয়, এবং দ্বিতীয়টি গাণিতিক অপারেশন انجام দেয়।
টিপ। পূর্বের একটি নিবন্ধে আমরা দেখিয়েছিলাম Get-ChildItem কমান্ডলেট ব্যবহার করে ডিস্কে সবচেয়ে বড় ফাইল খুঁজে বের করার পদ্ধতি।
উদাহরণস্বরূপ, C:\ISO ফোল্ডারের সাইজ পেতে নিচের কমান্ড চালান:
Get-ChildItem C:\ISO | Measure-Object -Property Length -sum

দেখুন, এই ডিরেক্টরির ফাইলগুলোর টোটাল সাইজ Sum ফিল্ডে দেখাচ্ছে প্রায় ২.১ GB (সাইজ বাইটে দেওয়া আছে)।
সাইজকে আরও সুবিধাজনক MB বা GB-তে কনভার্ট করতে এই কমান্ডটি ব্যবহার করুন:
(gci c:\iso | measure Length -s).sum / 1Gb
অথবা:
(gci c:\iso | measure Length -s).sum / 1Mb
ফলাফল দুই দশমিক পর্যন্ত রাউন্ড করতে নিচের কমান্ড চালান:
"{0:N2} GB" -f ((gci c:\iso | measure Length -s).sum / 1Gb)

PowerShell ব্যবহার করে একটি ডিরেক্টরিতে নির্দিষ্ট টাইপের সব ফাইলের টোটাল সাইজ ক্যালকুলেট করা যায়। উদাহরণস্বরূপ, একটি ফোল্ডারে সব ISO ফাইলের টোটাল সাইজ পেতে:
(gci c:\iso *.iso | measure Length -s).sum / 1Mb

উপরের কমান্ডগুলো শুধু নির্দিষ্ট ডিরেক্টরির ফাইলগুলোর টোটাল সাইজ দেয়। যদি ডিরেক্টরিতে সাবফোল্ডার থাকে, তবে সাবফোল্ডারগুলোর ফাইল সাইজ ক্যালকুলেট হবে না। ডিরেক্টরির ফাইল সাইজ সাবডিরেক্টরি সহ পেতে –Recurse প্যারামিটার ব্যবহার করুন। চলুন C:\Windows ফোল্ডারের ফাইলগুলোর টোটাল সাইজ বের করি:
"{0:N2} GB" -f ((gci –force c:\Windows –Recurse -ErrorAction SilentlyContinue| measure Length -s).sum / 1Gb)
হিডেন এবং সিস্টেম ফাইলগুলোর সাইজও গণনা করার জন্য –force আর্গুমেন্টও ব্যবহার করেছি।
তাহলে আমার লোকাল ড্রাইভে C:\Windows-এর সাইজ প্রায় ৪০ GB (স্ক্রিপ্ট NTFS কমপ্রেশন উপেক্ষা করে)।
টিপ. ডিরেক্টরি অ্যাক্সেস এরর (PermissionDenied -> DirUnauthorizedAccessError) এড়াতে -ErrorAction SilentlyContinue প্যারামিটার ব্যবহার করুন।

যদি ডিরেক্টরিতে সিম্বলিক বা হার্ড লিংক থাকে, তবে এই স্ক্রিপ্ট সঠিক সাইজ ক্যালকুলেট করে না। উদাহরণস্বরূপ, C:\Windows ফোল্ডারে WinSxS ফোল্ডার (Windows Component Store) এর ফাইলগুলোর অনেক হার্ড লিংক থাকে। ফলে এমন ফাইল একাধিকবার কাউন্ট হতে পারে। হার্ড লিংক রেজাল্টে উপেক্ষা করতে নিচের কমান্ড ব্যবহার করুন (সময় বেশি লাগে):
"{0:N2} GB" -f ((gci –force C:\windows –Recurse -ErrorAction SilentlyContinue | Where-Object { $_.LinkType -notmatch "HardLink" }| measure Length -s).sum / 1Gb)

দেখুন, Windows ফোল্ডারের আসল সাইজ কিছুটা কম।
ফাইনাল সাইজ ক্যালকুলেশনে কোন ফাইলগুলো বিবেচনা করা হবে সেটি নির্বাচন করতে ফিল্টার ব্যবহার করা যায়। উদাহরণস্বরূপ, ২০২০ সালে তৈরি ফাইলগুলোর সাইজ পেতে:
(gci -force c:\ps –Recurse -ErrorAction SilentlyContinue | ? {$_.CreationTime -gt ‘1/1/20’ -AND $_.CreationTime -lt ‘12/31/20’}| measure Length -s).sum / 1Gb
নির্দিষ্ট ডিরেক্টরির সব ফাস্ট-লেভেল সাবফোল্ডারের সাইজ পাওয়া যায়। উদাহরণস্বরূপ, 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)
}

% হল foreach-object লুপের এলিয়াস।
আরও এগিয়ে যাই। ধরুন, আপনার টাস্ক হল সিস্টেম হার্ড ড্রাইভের রুটে প্রতিটি ডিরেক্টরির সাইজ বের করে সেটি সুবিধাজনক টেবিল ফর্মে উপস্থাপন করা যাতে সেটি অ্যানালাইসিস এবং ফোল্ডার সাইজ অনুযায়ী সর্ট করা যায়।
সিস্টেম C:\ ড্রাইভের ডিরেক্টরি সাইজ সম্পর্কে তথ্য পেতে নিচের PowerShell স্ক্রিপ্ট চালান:
$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”

দেখুন, গ্রাফিক্যাল টেবিল ভিউ দেখা যাচ্ছে যেখানে সিস্টেম ড্রাইভ C:\-এর রুটে সব ফোল্ডার এবং তাদের সাইজ দেখানো হয়েছে (টেবিলটি Out-GridView কমান্ডলেট দিয়ে জেনারেট করা হয়েছে)। কলাম হেডার ক্লিক করলে ফোল্ডারগুলো সাইজ অনুযায়ী সর্ট করা যাবে। আপনি রেজাল্ট CSV-এ এক্সপোর্ট করতে পারেন (| Export-Csv folder_size.csv) বা এক্সেল ফাইলে।
আপনি যদি আপনার PowerShell স্ক্রিপ্টে ডিরেক্টরি সাইজ চেকিং ব্যবহার করেন, তবে একটি আলাদা ফাংশন তৈরি করতে পারেন:
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
}
}
}
ফাংশনটি ব্যবহার করতে শুধু ফোল্ডার পাথ আর্গুমেন্ট হিসেবে দিয়ে কমান্ড চালান:
Get-FolderSize ('C:\PS')

আপনার লোকাল PowerShell ফাংশন ব্যবহার করে Invoke-Command (PowerShell Remoting) কমান্ডলেট দিয়ে রিমোট কম্পিউটারে ফোল্ডার সাইজ চেক করা যায়।
Invoke-Command -ComputerName hq-srv01 -ScriptBlock ${Function:Get-FolderSize} –ArgumentList 'C:\PS'

এই কমান্ডগুলো সব PowerShell ভার্সনে কাজ করে, নये PowerShell Core 7.x ভার্সন সহ।