Computer >> คอมพิวเตอร์ >  >> ระบบ >> Windows Server

PowerShell:รับขนาดโฟลเดอร์บนดิสก์ใน Windows

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

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

เคล็ดลับ ในบทความก่อนหน้านี้ เราได้แสดงวิธีใช้ Get-ChildItem cmdlet ใน 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)

เพื่อพิจารณาขนาดของไฟล์ที่ซ่อนอยู่และไฟล์ระบบ ฉันได้ใช้ –force อาร์กิวเมนต์เช่นกัน

ดังนั้นขนาดของ C:\Windows บนไดรฟ์ในเครื่องของฉันคือประมาณ 40 GB (สคริปต์ละเว้นการบีบอัด NTFS)

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

PowerShell:รับขนาดโฟลเดอร์บนดิสก์ใน Windows

สคริปต์นี้คำนวณขนาดของไดเร็กทอรีอย่างไม่ถูกต้องหากมีลิงก์สัญลักษณ์หรือฮาร์ดลิงก์ ตัวอย่างเช่น 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)

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 cmdlet) เมื่อคลิกที่ส่วนหัวของคอลัมน์ คุณจะจัดเรียงโฟลเดอร์ตามขนาดได้ คุณยังสามารถส่งออกผลลัพธ์เป็น 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) cmdlet

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

PowerShell:รับขนาดโฟลเดอร์บนดิสก์ใน Windows

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