คำตอบสั้น ๆ: เริ่มใช้ PowerShell จากศูนย์ ตั้งแต่โครงสร้างคำสั่ง การหาคำสั่งที่ต้องการเอง การจัดการบริการและไฟล์ ไปจนถึงการสั่งงานเครื่องอื่นจากระยะไกล
คู่มือนี้อธิบาย Windows Server ทีละขั้นตอน พร้อมคำสั่งที่ใช้ได้จริงและปัญหาที่พบบ่อย
การคลิกผ่านหน้าจอทำงานได้ดีกับเครื่องเดียว แต่เมื่อต้องทำสิ่งเดียวกันกับยี่สิบเครื่อง หรือต้องทำซ้ำทุกเดือน PowerShell คือความต่างระหว่างงานสิบนาทีกับงานสองวัน
คู่มือนี้ไม่ใช่รายการคำสั่งเรียงตามตัวอักษร แต่เป็นชุดที่ผู้ดูแลเซิร์ฟเวอร์ใช้จริงในงานประจำวัน พร้อมหลักการที่ทำให้คุณหาคำสั่งที่ต้องการเองได้โดยไม่ต้องค้นอินเทอร์เน็ตทุกครั้ง
สิ่งที่ต้องเตรียม (Windows Server)
- Windows Server 2016 ขึ้นไป ซึ่งมี PowerShell 5.1 ติดตั้งมาให้แล้ว
- สิทธิ์ Administrator สำหรับคำสั่งที่แก้ไขระบบ
$PSVersionTable
Get-ExecutionPolicy -List
ขั้นตอนที่ 1: เข้าใจโครงสร้างคำสั่ง (Windows Server)
ทุกคำสั่งใน PowerShell ใช้รูปแบบ กริยา-นาม เสมอ เช่น Get-Service, Stop-Process, New-Item เมื่อรู้กริยาที่ใช้บ่อยก็เดาคำสั่งได้เอง
Get-ดูข้อมูล ไม่เปลี่ยนแปลงอะไร ปลอดภัยเสมอSet-แก้ไขสิ่งที่มีอยู่New-สร้างใหม่Remove-ลบStart-/Stop-/Restart-ควบคุมการทำงานTest-ตรวจสอบและคืนค่าจริงหรือเท็จ
สามคำสั่งนี้ทำให้คุณหาคำตอบเองได้ทุกเรื่อง
Get-Command *service*
Get-Help Get-Service -Examples
Get-Service | Get-Member
Get-Member คือคำสั่งที่มีค่าที่สุด มันบอกว่าผลลัพธ์ที่ได้มีคุณสมบัติอะไรให้เรียกใช้บ้าง ซึ่งนำไปกรองและเรียงต่อได้
ขั้นตอนที่ 2: จัดการบริการ
Get-Service | Where-Object Status -eq 'Running'
Get-Service -Name W3SVC, MSSQLSERVER
Restart-Service -Name W3SVC -Force
Set-Service -Name Spooler -StartupType Disabled
# บริการที่ตั้งให้เริ่มอัตโนมัติแต่ไม่ได้ทำงาน คือสิ่งที่ต้องตรวจก่อนเสมอ
Get-Service | Where-Object { $_.StartType -eq 'Automatic' -and $_.Status -ne 'Running' }
ขั้นตอนที่ 3: ตรวจทรัพยากรเครื่อง
# สิบโปรเซสที่กินหน่วยความจำมากที่สุด
Get-Process | Sort-Object WS -Descending | Select-Object -First 10 Name, Id,
@{n='RAM(MB)';e={[math]::Round($_.WS/1MB,1)}}, CPU
# พื้นที่ดิสก์
Get-Volume | Where-Object DriveLetter | Select-Object DriveLetter,
@{n='Free(GB)';e={[math]::Round($_.SizeRemaining/1GB,1)}},
@{n='Total(GB)';e={[math]::Round($_.Size/1GB,1)}},
@{n='Free%';e={[math]::Round($_.SizeRemaining/$_.Size*100,0)}}
# หน่วยความจำและเวลาที่เครื่องทำงานต่อเนื่อง
Get-CimInstance Win32_OperatingSystem | Select-Object `
@{n='RAM(GB)';e={[math]::Round($_.TotalVisibleMemorySize/1MB,1)}},
@{n='Free(GB)';e={[math]::Round($_.FreePhysicalMemory/1MB,1)}},
@{n='Uptime';e={(Get-Date) - $_.LastBootUpTime}}
ขั้นตอนที่ 4: อ่าน Event Log
# ข้อผิดพลาดของระบบใน 24 ชั่วโมงที่ผ่านมา
Get-WinEvent -FilterHashtable @{LogName='System'; Level=1,2; StartTime=(Get-Date).AddDays(-1)} |
Select-Object TimeCreated, Id, ProviderName, Message -First 20
# การล็อกอินที่ล้มเหลว
Get-WinEvent -FilterHashtable @{LogName='Security'; Id=4625; StartTime=(Get-Date).AddDays(-1)} |
Select-Object TimeCreated, @{n='User';e={$_.Properties[5].Value}},
@{n='From';e={$_.Properties[19].Value}}
# เวลาที่เครื่องรีสตาร์ต
Get-WinEvent -FilterHashtable @{LogName='System'; Id=6005,6006,1074} -MaxEvents 20 |
Select-Object TimeCreated, Id, Message
ใช้ -FilterHashtable เสมอแทนการดึงทั้งหมดมาแล้วค่อยกรองด้วย Where-Object เพราะการกรองที่ต้นทางเร็วกว่ามากบนเครื่องที่มี Log สะสมเป็นล้านรายการ
ขั้นตอนที่ 5: จัดการไฟล์
# หาไฟล์ใหญ่กว่า 500 MB
Get-ChildItem D:\ -Recurse -File -ErrorAction SilentlyContinue |
Where-Object Length -gt 500MB |
Sort-Object Length -Descending |
Select-Object FullName, @{n='GB';e={[math]::Round($_.Length/1GB,2)}}
# ลบไฟล์เก่ากว่า 30 วัน
Get-ChildItem D:\Logs -File |
Where-Object LastWriteTime -lt (Get-Date).AddDays(-30) |
Remove-Item -WhatIf
# คัดลอกพร้อมสิทธิ์
robocopy D:\Source E:\Dest /E /COPYALL /R:1 /W:1 /LOG:C:\copy.log
-WhatIf คือสิ่งที่ควรใส่ทุกครั้งก่อนสั่งลบจริง มันแสดงว่าจะทำอะไรบ้างโดยไม่ทำจริง เมื่อมั่นใจแล้วค่อยถอดออก