ในบทความนี้เราจะแสดงวิธีตรวจสอบพื้นที่ดิสก์ว่างและการใช้งานดิสก์บนโฮสต์ Windows ท้องถิ่นหรือระยะไกลโดยใช้ PowerShell นอกจากนี้ยังพิจารณาวิธีแจ้งเตือนผู้ดูแลระบบด้วยการแจ้งเตือนป๊อปอัปหรืออีเมลหากเกินเกณฑ์พื้นที่ว่างที่กำหนด
วิธีตรวจสอบพื้นที่ว่างของไดรฟ์ใน Windows ด้วย WMI และ PowerShell
คุณสามารถรับข้อมูลเกี่ยวกับไดรฟ์ตรรกะใน Windows โดยใช้คลาส WMI Win32_logicalDisk
คำสั่งด้านล่างจะแสดงข้อมูลทั้งหมดเกี่ยวกับไดรฟ์ตรรกะบนคอมพิวเตอร์ของคุณ:
Get-WmiObject -Class Win32_LogicalDisk
หากคุณใช้ PowerShell Core 7.x ใหม่กว่า โปรดทราบว่า WMI ไม่ได้รับการรองรับในเวอร์ชัน PowerShell นี้ (เพราะ PowerShell Core พัฒนาบน .Net Core) หากคุณพยายามรันคำสั่ง Get-WmiObject คุณจะเห็นข้อผิดพลาด: The term 'Get-WmiObject' is not recognized as a name of a cmdlet, function, script file, or executable program ให้ใช้ CIM แทน WMI เช่น:
Get-CimInstance win32_logicaldisk

คุณสมบัติ FreeSpace มีจำนวนพื้นที่ว่างในหน่วยไบต์ที่เหลืออยู่บนแต่ละไดรฟ์ เพื่อความสะดวก คุณสามารถแปลงเป็น GB และแสดงจำนวนพื้นที่ว่างบนแต่ละไดรฟ์ตรรกะเป็น % (เป็นอัตราส่วนของพื้นที่ว่างต่อขนาดดิสก์ทั้งหมด) คุณสามารถใช้สคริปต์ PowerShell ต่อไปนี้:
Get-WmiObject -Class Win32_LogicalDisk |
Select-Object -Property DeviceID, VolumeName, @{Label='FreeSpace (Gb)'; expression={($_.FreeSpace/1GB).ToString('F2')}},
@{Label='Total (Gb)'; expression={($_.Size/1GB).ToString('F2')}},
@{label='FreePercent'; expression={[Math]::Round(($_.freespace / $_.size) * 100, 2)}}|ft

สคริปต์แสดงรายการไดรฟ์ตรรกะ ขนาด และเปอร์เซ็นต์พื้นที่ว่าง
หากต้องการใช้สคริปต์นี้ใน PowerShell Core ให้แทนที่ Get-WmiObject ด้วย Get-CimInstance เท่านั้น
หากคุณไม่ต้องการเพียงแสดงข้อมูลพื้นที่ว่างบนดิสก์ แต่ต้องการดำเนินการบางอย่างแทน (ส่งอีเมลหรือแสดงข้อความป๊อปอัป) หากพื้นที่ว่างน้อยกว่าเกณฑ์ที่ระบุ คุณสามารถใช้สคริปต์ PowerShell ด้านล่าง:
$percentWarning = 20
$percentCritcal = 5
$ListDisk = Get-WmiObject -Class Win32_LogicalDisk
Foreach($Disk in $ListDisk){
if ($Disk.size -ne $NULL) {
$DiskFreeSpace = ($Disk.freespace/1GB).ToString('F2')
$DiskFreeSpacePercent = [Math]::Round(($Disk.freespace/$Disk.size) * 100, 2)
if($DiskFreeSpacePercent -lt $percentWarning){
$Message= "Warning!"
if($DiskFreeSpacePercent -lt $percentCritcal){
$Message= "Alert!"
}
$wshell = New-Object -ComObject Wscript.Shell
$Output = $wshell.Popup("Disk $($Disk.DeviceID) has only $DiskFreeSpace GB of free space left",0,$Message,48)
}
}
}

สคริปต์นี้ตั้งค่าเกณฑ์พื้นที่ว่างบนดิสก์ — 5% และ 20% หากพื้นที่ว่างบนดิสก์ใดๆ ต่ำกว่าค่าที่ระบุ จะแสดงหน้าต่างข้อมูลโมดัล คุณสามารถแสดงเป็นการแจ้งเตือนป๊อปอัปหรือรันทันทีเครื่องมือ Disk Cleanup (cleanmgr.exe)
หากคุณต้องการส่งอีเมลแจ้งเตือนผู้ดูแลระบบ คุณสามารถส่งอีเมลผ่านเซิร์ฟเวอร์ SMTP (อาจเป็นโฮสต์ Exchange หรือบริการ SMTP อื่นๆ แม้แต่บทบาท SMTP ในตัวของ Windows Server ก็ทำได้) ด้วย cmdlet Send-MailMessage:
Send-MailMessage -To "srv_admin@woshub.com" -From "$env:computername@woshub.com" -Subject "Insufficient disk space on server $env:computername" -Body "Disk $($Disk.DeviceID) has only $DiskFreeSpace GB left" -Credential (Get-Credential) -SmtpServer smtp.woshub.com -Port 587
ในตัวอย่างนี้ คุณต้องป้อนข้อมูลประจำตัวเพื่อเชื่อมต่อกับโฮสต์ SMTP แบบโต้ตอบ คุณสามารถกำหนดค่าโฮสต์ SMTP ให้ยอมรับข้อความจากโฮสต์ที่เชื่อถือได้โดยไม่ต้องตรวจสอบสิทธิ์ หรือกำหนดค่าการตรวจสอบสิทธิ์ SMTP โดยใช้ข้อมูลประจำตัวที่บันทึกไว้ในไฟล์ (ไม่สามารถใช้ Managed Service Accounts เพื่อส่งอีเมลได้)
คุณสามารถรันสคริปต์ PowerShell เป็นประจำโดยใช้ Task Scheduler หรือกำหนดค่าเป็นบริการ Windows หากพื้นที่ว่างบนโฮสต์ Windows นี้ไม่เพียงพอ ผู้ดูแลระบบจะได้รับการแจ้งเตือน
รับพื้นที่ดิสก์ว่างจากโฮสต์ Windows ระยะไกลผ่าน PowerShell
สามารถใช้ cmdlet Invoke-Command เพื่อรันสคริปต์ PS เพื่อตรวจสอบพื้นที่ว่างที่เหลือบนคอมพิวเตอร์ระยะไกล
Invoke-Command -ComputerName srv01,srv02,srv03 -FilePath "C:\PS\checkfreespace.ps1"
หากเซิร์ฟเวอร์ที่คุณต้องการตรวจสอบพื้นที่ว่างอยู่ในโดเมนของคุณ คุณสามารถรับรายการของพวกเขาจาก Active Directory โดยใช้ cmdlet Get-ADComputer และรันสคริปต์ต่อแต่ละโฮสต์:
$computers = (Get-ADComputer -Filter 'operatingsystem -like "*Windows Server*" -and enabled -eq "true"').Name
Invoke-Command -ComputerName $computers -FilePath "C:\PS\checkfreespace.ps1" -ErrorAction SilentlyContinue
คุณยังสามารถใช้ RemoteWMI เพื่อรับข้อมูล WMI จากคอมพิวเตอร์ระยะไกล:
Get-WmiObject -Class Win32_logicalDisk -ComputerName srv01,srv02,srv03
คู่มือนี้อธิบายโซลูชันที่ทำเองง่ายที่สุดสำหรับการตรวจสอบพื้นที่ดิสก์ หากคุณมีโฮสต์จำนวนมากที่ต้องติดตาม 最好使用功能齐全的监控系统(如 Zabbix、Icinga、PRTG、Nagios 等)。