Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> ระบบ >> Windows Server

PowerShell: วิธีตรวจสอบขนาดโฟลเดอร์บนดิสก์ใน Windows

ผู้ใช้ Windows ส่วนใหญ่รู้ดีว่าวิธีง่ายที่สุดในการตรวจสอบขนาดโฟลเดอร์คือการเปิดคุณสมบัติของโฟลเดอร์ใน File Explorer ส่วนผู้ใช้ระดับสูงมักชอบใช้เครื่องมือของบุคคลที่สามอย่าง TreeSize หรือ WinDirStat อย่างไรก็ตาม หากคุณต้องการสถิติรายละเอียดมากขึ้นเกี่ยวกับขนาดโฟลเดอร์ในไดเรกทอรีเฉพาะ หรือต้องการ исключить ไฟล์บางประเภท การใช้คุณสมบัติของ PowerShell จะเป็นทางเลือกที่ดีกว่า ในบทความนี้ เราจะแสดงวิธีการตรวจสอบขนาดของโฟลเดอร์เฉพาะบนดิสก์ (รวมถึงซับโฟลเดอร์ทั้งหมด) โดยใช้ PowerShell อย่างรวดเร็ว

คุณสามารถใช้คอมมานด์เลต Get-ChildItem (อัลไอแอส gci) และ Measure-Object (อัลไอแอส measure) เพื่อหาขนาดของไฟล์และโฟลเดอร์ (รวมซับโฟลเดอร์) ใน PowerShell คอมมานด์เลตตัวแรกช่วยให้ได้รายการไฟล์ (พร้อมขนาด) ในไดเรกทอรีที่ระบุตามเกณฑ์ที่กำหนด ส่วนตัวที่สองทำการคำนวณทางคณิตศาสตร์

เคล็ดลับ: ในบทความก่อนหน้า เราได้แสดงวิธีใช้คอมมานด์เลต Get-ChildItem ใน PowerShell เพื่อค้นหาไฟล์ขนาดใหญ่ที่สุดบนดิสก์

ตัวอย่างเช่น หากต้องการทราบขนาดของโฟลเดอร์ C:\ISO ให้รันคำสั่งต่อไปนี้:

Get-ChildItem C:\ISO | Measure-Object -Property Length -sum

PowerShell: วิธีตรวจสอบขนาดโฟลเดอร์บนดิสก์ใน Windows

ตามที่เห็น ขนาดรวมของไฟล์ในไดเรกทอรีนี้แสดงในฟิลด์ Sum ประมาณ 2.1 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: วิธีตรวจสอบขนาดโฟลเดอร์บนดิสก์ใน Windows

คุณสามารถใช้ PowerShell คำนวณขนาดรวมของไฟล์ประเภทเฉพาะในไดเรกทอรีได้ ตัวอย่างเช่น ต้องการทราบขนาดรวมของไฟล์ ISO ทั้งหมดในโฟลเดอร์:

(gci c:\iso *.iso | measure Length -s).sum / 1Mb

PowerShell: วิธีตรวจสอบขนาดโฟลเดอร์บนดิสก์ใน Windows

คำสั่งที่แสดงข้างต้นสามารถหาขนาดรวมของไฟล์ในไดเรกทอรีที่ระบุได้อย่างเดียว หากมีซับโฟลเดอร์ ขนาดไฟล์ในซับโฟลเดอร์จะไม่นำมาคำนวณ ในการหาขนาดรวมของไฟล์ในไดเรกทอรีรวมถึงซับไดเรกทอรี ให้ใช้พารามิเตอร์ –Recurse มาดูขนาดรวมของไฟล์ในโฟลเดอร์ C:\Windows กัน:

"{0:N2} GB" -f ((gci –force c:\Windows –Recurse -ErrorAction SilentlyContinue| measure Length -s).sum / 1Gb)

เพื่อนับขนาดไฟล์ที่ซ่อนและไฟล์ระบบ ผมจึงใช้ arguement –force ด้วย

ดังนั้น ขนาดของ C:\Windows บนดิสก์ท้องถิ่นของผมคือประมาณ 40 GB (สคริปต์นี้ไม่คำนึงถึงการบีบอัด NTFS)

เคล็ดลับ: เพื่อป้องกันข้อผิดพลาดการเข้าถึงไดเรกทอรี (PermissionDenied -> DirUnauthorizedAccessError) ให้ใช้พารามิเตอร์ -ErrorAction SilentlyContinue

PowerShell: วิธีตรวจสอบขนาดโฟลเดอร์บนดิสก์ใน Windows

สคริปต์นี้จะคำนวณขนาดไดเรกทอรีได้ไม่ถูกต้อง หากโฟลเดอร์นั้นมี symbolic links หรือ hard links ตัวอย่างเช่น โฟลเดอร์ C:\Windows มี hard links หลายตัวไปยังไฟล์ในโฟลเดอร์ WinSxS (Windows Component Store) ทำให้ไฟล์เหล่านั้นอาจถูกนับซ้ำ ในการเพิกเฉย hard links จากผลลัพธ์ ให้ใช้คำสั่งต่อไปนี้ (ใช้เวลานานกว่า):

"{0:N2} GB" -f ((gci –force C:\windows –Recurse -ErrorAction SilentlyContinue | Where-Object { $_.LinkType -notmatch "HardLink" }| measure Length -s).sum / 1Gb)

PowerShell: วิธีตรวจสอบขนาดโฟลเดอร์บนดิสก์ใน Windows

ตามที่เห็น ขนาดจริงของโฟลเดอร์ Windows น้อยกว่าเล็กน้อย

คุณสามารถใช้ตัวกรองเพื่อเลือกไฟล์ที่ต้องการนำมาคำนวณขนาดสุดท้าย ตัวอย่างเช่น หาขนาดไฟล์ที่สร้างในปี 2020:

(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)
}

PowerShell: วิธีตรวจสอบขนาดโฟลเดอร์บนดิสก์ใน Windows

% เป็นอัลไอแอสของลูป 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”

PowerShell: วิธีตรวจสอบขนาดโฟลเดอร์บนดิสก์ใน Windows

ตามที่เห็น มุมมองกราฟิกของตารางจะปรากฏขึ้น โดยแสดงโฟลเดอร์ทั้งหมดในรูทของไดรฟ์ C:\ และขนาดของแต่ละโฟลเดอร์ (ตารางถูกสร้างโดยคอมมานด์เลต Out-GridView) ด้วยการคลิกหัวคอลัมน์ คุณสามารถจัดเรียงโฟลเดอร์ตามขนาดได้ คุณยังสามารถส่งออกผลลัพธ์เป็น CSV (| Export-Csv folder_size.csv) หรือไฟล์ Excel ได้อีกด้วย

หากคุณใช้การตรวจสอบขนาดไดเรกทอรีในสคริปต์ 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: วิธีตรวจสอบขนาดโฟลเดอร์บนดิสก์ใน Windows

คุณสามารถใช้ฟังก์ชัน PowerShell ในเครื่องเพื่อตรวจสอบขนาดโฟลเดอร์บนคอมพิวเตอร์ระยะไกลผ่านคอมมานด์เลต Invoke-Command (PowerShell Remoting)

Invoke-Command -ComputerName hq-srv01 -ScriptBlock ${Function:Get-FolderSize} –ArgumentList 'C:\PS'

PowerShell: วิธีตรวจสอบขนาดโฟลเดอร์บนดิสก์ใน Windows

คำสั่งเหล่านี้ทำงานในทุกเวอร์ชันของ PowerShell รวมถึง PowerShell Core 7.x ใหม่ๆ