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

PowerShell:ตรวจสอบพื้นที่ว่างในดิสก์และการใช้งานดิสก์

ในบทความนี้ เราจะแสดงวิธีตรวจสอบพื้นที่ว่างในดิสก์และการใช้ดิสก์บนโฮสต์ Windows ในเครื่องหรือระยะไกลโดยใช้ PowerShell นอกจากนี้ ให้พิจารณาวิธีแจ้งผู้ดูแลระบบด้วยการแจ้งเตือนแบบป๊อปอัปหรืออีเมลหากเกินเกณฑ์พื้นที่ว่าง

จะตรวจสอบพื้นที่ว่างของไดรฟ์บน Windows ด้วย WMI และ PowerShell ได้อย่างไร

คุณสามารถรับข้อมูลเกี่ยวกับไดรฟ์ลอจิคัลใน Windows ได้โดยใช้ Win32_logicalDisk คลาส WMI

คำสั่งด้านล่างจะแสดงข้อมูลทั้งหมดเกี่ยวกับไดรฟ์ลอจิคัลในคอมพิวเตอร์ของคุณ:

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

PowerShell:ตรวจสอบพื้นที่ว่างในดิสก์และการใช้งานดิสก์

คุณสมบัติ 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:ตรวจสอบพื้นที่ว่างในดิสก์และการใช้งานดิสก์

สคริปต์แสดงรายการไดรฟ์แบบลอจิคัล ขนาด และเปอร์เซ็นต์พื้นที่ว่าง

หากต้องการใช้สคริปต์นี้ใน 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)
}
}
}

PowerShell:ตรวจสอบพื้นที่ว่างในดิสก์และการใช้งานดิสก์

สคริปต์นี้ตั้งค่าขีดจำกัดของพื้นที่ว่างที่เหลืออยู่บนดิสก์ — 5% และ 20% หากจำนวนเนื้อที่ว่างบนดิสก์ใดๆ ต่ำกว่าค่าที่ระบุ หน้าต่างข้อมูลโมดอลจะปรากฏขึ้น คุณสามารถแสดงเป็นการแจ้งเตือนแบบป๊อปอัปหรือเรียกใช้เครื่องมือ Disk Cleanup ทันที (cleanmgr.exe )

หากคุณต้องการส่งอีเมลถึงผู้ดูแลระบบของปัญหา คุณสามารถส่งอีเมลผ่านเซิร์ฟเวอร์ SMTP (อาจเป็นโฮสต์ Exchange หรือบริการ SMTP อื่น ๆ แม้แต่บทบาท Windows Server SMTP ในตัวก็สามารถทำได้) ด้วย Send-MailMessage cmdlet:

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 โดยใช้ข้อมูลประจำตัวที่บันทึกไว้ในไฟล์ (ไม่สามารถใช้บัญชีบริการที่มีการจัดการเพื่อส่งอีเมลได้)

คุณสามารถเรียกใช้สคริปต์ PowerShell เป็นประจำโดยใช้ Task Scheduler หรือสามารถกำหนดค่าเป็นบริการ Windows หากมีพื้นที่ว่างไม่เพียงพอบนโฮสต์ Windows นี้ ผู้ดูแลระบบจะได้รับการแจ้งเตือน

รับพื้นที่ดิสก์ฟรีจากโฮสต์ Windows ระยะไกลผ่าน PowerShell

Invoke-Command cmdlet สามารถใช้เพื่อเรียกใช้สคริปต์ PS เพื่อตรวจสอบพื้นที่ว่างที่เหลืออยู่บนคอมพิวเตอร์ระยะไกล

Invoke-Command -ComputerName srv01,srv02,srv03 -FilePath "C:\PS\checkfreespace.ps1"

หากเซิร์ฟเวอร์ที่คุณต้องการตรวจสอบจำนวนพื้นที่ว่างอยู่ในโดเมนของคุณ คุณสามารถรับรายการจาก Active Directory โดยใช้ Get-ADComputer cmdlet และเรียกใช้สคริปต์กับแต่ละโฮสต์:

$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 เป็นต้น) จะดีกว่า