- Registry (คีย์การถอนการติดตั้ง) เป็นแหล่งที่เชื่อถือได้มากที่สุดสำหรับสิ่งที่ "เพิ่มหรือลบโปรแกรม" แสดง
- Win32_Product ทำงานได้กับ MSI แต่ช้าและอาจทำให้เกิดการซ่อมแซมได้ โปรดใช้ด้วยความระมัดระวัง
- Get-Package แสดงรายการแพ็คเกจ PackageManagement (PowerShellGet/NuGet) ไม่ใช่ซอฟต์แวร์ระบบทั้งหมด
- ส่งออกและเปรียบเทียบกับ TXT/CSV และ Compare-Object; Geek Uninstaller และ UninstallView ปรับปรุงการรายงานให้มีประสิทธิภาพ
หากคุณเคยต้องการค้นหาโปรแกรมที่ติดตั้งอยู่บน คอมพิวเตอร์ Windows อย่างรวดเร็ว ไม่ว่าจะเป็นเพราะคุณจัดการเซิร์ฟเวอร์ที่ไม่มีอินเทอร์เฟซแบบกราฟิก หรือเพราะคุณกำลังจะติดตั้งระบบใหม่ คุณก็คงต้องการรายการโปรแกรมที่ติดตั้งไว้อย่างน่าเชื่อถือ บทความนี้จะอธิบายรายละเอียดและขั้นตอนต่างๆในการแสดงรายการและส่งออกซอฟต์แวร์ที่ติดตั้งไว้โดยใช้PowerShell , WMI, Registry และเครื่องมือของบุคคลที่สาม
เราจะผสานรวมเทคนิคที่ได้รับการพิสูจน์แล้วหลายอย่าง พร้อมทั้งอธิบายข้อดีและข้อเสีย และคุณจะได้เห็นทุกอย่างตั้งแต่คำสั่ง โดยตรง ไปจนถึงตัวเลือกขั้นสูง เช่นGet-Package ด้วย PackageManagement, การสืบค้นรีจิสทรี (ถอนการติดตั้ง), การเรียกใช้งานจากระยะไกล และแม้แต่การเปรียบเทียบรายการก่อนและหลังการจัดรูปแบบนอกจากนี้เรายังจะเพิ่มตัวเลือกการส่งออกไปยัง TXT/CSV/HTML และสำหรับผู้ที่ต้องการใช้ยูทิลิตี้ของบุคคลที่สามที่จัดการเรื่องนี้ได้ในไม่กี่คลิก
เหตุใดจึงคุ้มค่าที่จะแสดงรายการโปรแกรมของคุณ
การจัดทำรายการโปรแกรมที่ชัดเจนจะช่วยป้องกันการลืมติดตั้งโปรแกรมใหม่ และช่วยระบุซอฟต์แวร์ที่คุณไม่ได้ใช้งานอีกต่อไป คอมพิวเตอร์หลายเครื่องมักสะสมแอปพลิเคชันที่ไม่ได้ลองใช้ แล้วก็ถูกลืมไป ส่งผลให้เปลืองพื้นที่ และที่แย่กว่านั้นคือบางแอปพลิเคชันยังคงทำงานอยู่เบื้องหลังโดยที่คุณไม่รู้ตัวด้วยซ้ำ
รายการช่วยให้คุณตรวจสอบทุกอย่างได้ในคราวเดียว ซึ่งดีกว่าการเลื่อนดูในส่วน "แอปและคุณสมบัติ" นอกจากนี้ยังช่วยลดความซับซ้อนของงานด้านการสนับสนุน การตรวจสอบ และการปฏิบัติตามข้อกำหนด และช่วยประหยัดเวลาหากคุณจัดการพีซีหลายเครื่องหรือเซิร์ฟเวอร์ Windows Core ที่ไม่มี GUI และทุกอย่างดำเนินการผ่านทางบรรทัดคำสั่ง
เทคนิคเหล่านี้ใช้ได้กับ Windows หลายเวอร์ชัน รวมถึงWindows Server 2012 R2, 2016, 2019 และ Windows 7/10/11โดยจะมีรายละเอียดปลีกย่อยที่เราจะกล่าวถึงตามความจำเป็น
ต่อมาคุณจะเห็นว่าวิธีการทั้งหมดไม่ได้แสดงผลลัพธ์เหมือนกันทั้งหมด: PowerShell, WMI, Registry และ PackageManagement สอบถามจากแหล่งข้อมูลที่แตกต่างกันดังนั้นจึงเป็นสิ่งสำคัญที่จะต้องรู้ว่าแต่ละเทคนิคครอบคลุมอะไรบ้างและมีข้อจำกัดอะไรบ้างเพื่อที่จะเลือกเทคนิคที่เหมาะสมในแต่ละกรณี

วิธี PowerShell ด่วนเพื่อดูโปรแกรมที่ติดตั้ง
PowerShell มีวิธีการโดยตรงในการสร้างรายการ มาเริ่มจากวิธีที่ง่ายที่สุดก่อน นั่นคือการตรวจสอบคีย์การถอนการติดตั้งใน Registryซึ่งเป็นสิ่งที่อยู่เบื้องหลังมุมมอง "เพิ่มหรือลบโปรแกรม" แบบคลาสสิก
ชื่อย่อ`gp` (Get-ItemProperty)ช่วยให้คุณอ่านคุณสมบัติได้อย่างรวดเร็ว คุณสามารถรวมเส้นทางสองเส้นทาง (64 และ 32 บิต) และกรองรายการด้วยชื่อที่มองเห็นได้
gp HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*, HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object { -not ::IsNullOrWhiteSpace($_.DisplayName) } | Select-Object DisplayName
หากคุณต้องการรูปแบบที่เป็นระเบียบมากขึ้น (ชื่อ รุ่น ผู้จัดพิมพ์ วันที่) ให้แยกตามสถาปัตยกรรมและจัดรูปแบบเป็นตารางขนาดกะทัดรัดสำหรับการตรวจสอบบนหน้าจอซึ่งใช้งานได้ดีมากสำหรับการอ่านอย่างรวดเร็ว
# 64 bits
Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-Table -AutoSize
# 32 bits
Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate | Format-Table -AutoSize
นอกจากนี้ยังมีวิธีการ WMI/WMIC สำหรับค้นหาซอฟต์แวร์ที่ติดตั้งผ่าน Windows Installer คำสั่งทั่วไปคือสองคำสั่งนี้ แม้ว่าคุณจะเห็นคำเตือนด้านล่าง: คำสั่งเหล่านี้อาจทำงานช้าและทำให้เกิดการซ่อมแซม MSIได้
# Win32_Product (WMI)
Get-WmiObject -Class Win32_Product | Select-Object -Property Name
# Alias rápido
gwmi Win32_Product
# WMIC clásico
wmic product get name,version
สุดท้ายนี้ หลายคนลองใช้คำสั่ง Get-Package หมายเหตุ: Get-Package จะแสดงเฉพาะแพ็กเกจที่ติดตั้งผ่าน PackageManagement (NuGet/PowerShellGet และโปรแกรมที่คล้ายกัน) เท่านั้นไม่ใช่ซอฟต์แวร์ระบบแบบดั้งเดิมทั้งหมด ถึงกระนั้น คำสั่งนี้ก็มีประโยชน์สำหรับโมดูลและสคริปต์ที่ติดตั้งจาก repository
# Paquetes gestionados por PackageManagement
Get-Package
# Todas las versiones de un proveedor concreto
Get-Package -ProviderName PowerShellGet -AllVersions
# Versión concreta de un paquete
Get-Package -Name PackageManagement -ProviderName PowerShellGet -RequiredVersion 1.3.1
หากคุณจัดการเครื่องหลายเครื่อง คุณสามารถใช้ PowerShell Remoting เพื่อสอบถามแพ็กเกจที่จัดการจากระยะไกลได้ ตัวอย่างเช่นคุณเรียกใช้คำสั่ง Get-Package บน Server01ด้วยข้อมูลรับรองที่ถูกต้อง:
Invoke-Command -ComputerName Server01 -Credential CONTOSO\TestUser -ScriptBlock { Get-Package }
ส่งออกรายการเป็น TXT หรือ CSV และเปรียบเทียบก่อน/หลัง
การดูผลลัพธ์บนหน้าจอนั้นดี แต่การบันทึกผลลัพธ์ลงไฟล์นั้นสะดวกกว่า ด้วย PowerShell คุณสามารถส่งผลลัพธ์ไปยังไฟล์ TXT โดยเรียงลำดับตามชื่อโปรแกรมเพื่อตรวจสอบหรือแบ่งปันในภายหลังได้
# 32 bits en TXT
Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* |
Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
Sort-Object DisplayName |
Out-File -FilePath "C:\Users\TuUsuario\Documents\InstalledPrograms.txt"
หากคุณต้องการไฟล์ CSV ที่สามารถอ่านได้ใน Excel/LibreOffice คุณสามารถส่งออกทั้งสองเวอร์ชัน (64 บิตและ 32 บิต) ไปยังไฟล์เดียวได้ ตัวอย่างแบบคลาสสิกใช้คำสั่ง Out-File เพื่อส่งออกไปยังนามสกุล .csv แต่สำหรับไฟล์ CSV ที่แท้จริง ควรใช้คำสั่ง Export-Csv -NoTypeInformationจะ ดีกว่า
# 64 bits a CSV
Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* |
Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
Sort-Object DisplayName |
Export-Csv -NoTypeInformation -Encoding UTF8 -Path "C:\Ruta\De\Tu\Archivo\Programas.csv"
# 32 bits al mismo CSV (añadiendo)
Get-ItemProperty HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* |
Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
Sort-Object DisplayName |
Export-Csv -NoTypeInformation -Encoding UTF8 -Append -Path "C:\Ruta\De\Tu\Archivo\Programas.csv"
เมื่อเป้าหมายคือการติดตั้งระบบใหม่โดยไม่สูญเสียข้อมูลใดๆ เทคนิคที่มีประโยชน์คือการสร้างรายการ "ก่อน" และ "หลัง" แล้วนำมาเปรียบเทียบกัน ด้วยCompare-Object คุณสามารถตรวจสอบได้อย่างรวดเร็วว่ามีอะไรหายไปหรืออะไรที่ไม่จำเป็นคุณยังสามารถใช้ร่วมกับคำแนะนำเพื่อทำให้การติดตั้งซอฟต์แวร์และไดรเวอร์เป็นไปโดยอัตโนมัติหลังจากฟอร์แมตได้ อีกด้วย
Compare-Object -ReferenceObject (Get-Content C:\Users\TuUsuario\Documents\InstalledPrograms.txt) \
-DifferenceObject (Get-Content C:\Users\TuUsuario\Documents\InstalledPrograms2.txt)
ดูที่คอลัมน์ SideIndicator: สัญลักษณ์ => แสดงว่าอยู่ในไฟล์ที่สอง ไม่ใช่ไฟล์แรก ในขณะที่ <= หมายถึงตรงกันข้าม ถ้าปรากฏ = แสดงว่ารายการนั้นมีอยู่ในทั้งสองไฟล์โดยไม่มีความแตกต่างกัน

ตรวจสอบรีจิสทรี: ถอนการติดตั้งคีย์ จำนวน และคุณสมบัติ
โปรแกรมติดตั้งมาตรฐานส่วนใหญ่จะบันทึกข้อมูลการถอนการติดตั้งลงในรีจิสทรี ดังนั้น หากคุณต้องการรายการที่คล้ายกับใน "เพิ่มหรือลบโปรแกรม" แหล่งข้อมูลที่น่าเชื่อถือที่สุดคือ คีย์ถอนการติดตั้งของคอมพิวเตอร์
เส้นทางหลักคือ: HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall และสำหรับแอปพลิเคชัน 32 บิตบนระบบ 64 บิต คุณยังมีเส้นทางย่อยอีกเส้นทางหนึ่งคือ: HKLM:\Software\Wow6432Node\Microsoft\Windows \ CurrentVersion\Uninstall
หากต้องการนับจำนวนแอปพลิเคชันที่ลงทะเบียนในสาขาเฉพาะ คุณสามารถใช้คำสั่งGet-ChildItemและรับจำนวนคีย์ย่อยได้:
$UninstallPath = 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall'
(Get-ChildItem -Path $UninstallPath).Count
หากคุณต้องการดึงคุณสมบัติเฉพาะ (เช่น ชื่อที่แสดง) คุณสามารถดึงค่ารีจิสทรีด้วยGetValue('DisplayName')และจัดเรียงเพื่อให้ง่ายต่อการอ่านได้:
Get-ChildItem -Path $UninstallPath |
ForEach-Object { $_.GetValue('DisplayName') } |
Sort-Object
ในการสร้างอ็อบเจ็กต์ที่มีคุณสมบัติหลายอย่าง (คล้ายกับที่คุณเห็นใน Win32Reg_AddRemovePrograms ของ SCCM) คุณสามารถสร้างไปป์ไลน์ขนาดเล็กที่เพิ่มตัวระบุ ผู้เผยแพร่ เวอร์ชัน และวันที่ติดตั้งซึ่งจะทำให้คุณได้รายการโปรแกรมที่สมบูรณ์ยิ่งขึ้น :
Get-ChildItem $UninstallPath |
ForEach-Object {
$ProdID = ($_.Name -split '\\')
Get-ItemProperty -Path "$UninstallPath\$ProdID" -ErrorAction SilentlyContinue |
Select-Object DisplayName, InstallDate, @{n='ProdID'; e={$ProdID}}, Publisher, DisplayVersion
} | Select-Object -First 10
แนวทางนี้หลีกเลี่ยงข้อเสียของ Win32_Product (ช้าและมีผลข้างเคียงจาก MSI) และไม่ขึ้นอยู่กับ SCCM เหมือนกับ คลาส Win32Reg_AddRemoveProgramsทำให้มีประโยชน์อย่างมากสำหรับการตรวจสอบภายในองค์กรโดยไม่ต้องมีโครงสร้างพื้นฐานเพิ่มเติม
WMI/WMIC: เมื่อใดควรใช้ และมีความเสี่ยงอะไรบ้าง?
คลาส WMI ที่เกี่ยวข้องกับ Windows Installer (เช่น Win32_Product) จะแสดงเฉพาะซอฟต์แวร์ที่ติดตั้งด้วย MSI เท่านั้น ไม่รวมโปรแกรมติดตั้งที่ใช้เอนจิ้นอื่น นอกจากนี้การสอบถาม Win32_Product อาจทำให้เกิดการซ่อมแซมผลิตภัณฑ์ MSIและใช้เวลานานมาก ซึ่งไม่เหมาะสมอย่างยิ่งสำหรับเซิร์ฟเวอร์ที่ใช้งานจริง
ถึงกระนั้นก็ยังมีบางสถานการณ์ที่คุณอาจต้องการดึงข้อมูลเฉพาะที่ Windows Installer "รู้" ออกมา ซึ่งนั่นคือเหตุผลที่ต้องมีสิ่งต่อไปนี้:
Get-WmiObject -Class Win32_Product | Select-Object -Property Name
gwmi Win32_Product
wmic product get name,version
หากคุณใช้คำสั่งเหล่านี้ โปรดใช้ด้วยความระมัดระวังและในช่วงเวลาการบำรุงรักษา สำหรับการตรวจสอบสินค้าคงคลังโดยทั่วไปวิธีการใช้ Registry มักจะปลอดภัยและเร็วกว่าและยังครอบคลุมแอปพลิเคชันที่หลากหลายกว่าด้วย
Get-Package แบบเจาะลึก: รายการจริงและพารามิเตอร์ที่เป็นประโยชน์
คำสั่ง Get-Package เป็นส่วนหนึ่งของ PackageManagement (OneGet) และจะส่งคืนแพ็กเกจที่ติดตั้งโดยผู้ให้บริการ (PowerShellGet, NuGet เป็นต้น) ซึ่งเกี่ยวข้องกับโปรแกรมติดตั้งซอฟต์แวร์ที่ได้รับความนิยมมากที่สุด
ไวยากรณ์พื้นฐานรองรับการกรองตามชื่อและเวอร์ชัน คุณสามารถบังคับให้ผู้ให้บริการเริ่มต้นใช้งานได้หากจำเป็น (Bootstrap) แสดงรายการเวอร์ชันทั้งหมด และกรองตามผู้ให้บริการ (PowerShellGet, NuGet)หรือประเภท (โมดูล, สคริปต์) ได้
Get-Package <String[]>]
>]
พารามิเตอร์สำคัญที่ควรรู้ (บางส่วนเป็นแบบไดนามิกและขึ้นอยู่กับผู้ให้บริการ): นี่คือภาพรวมที่สำคัญ :
- -ชื่อ: ชื่อหนึ่งชื่อหรือมากกว่า (รองรับไวด์การ์ด) มีประโยชน์สำหรับการค้นหาแพ็คเกจเฉพาะ
- -ชื่อผู้ให้บริการ: กรองตามผู้ขาย ค่าทั่วไป: Bootstrap, NuGet, PowerShellGet ใช้ร่วมกับ -AllVersions ได้ดีที่สุด
- -เวอร์ชันทั้งหมด:ส่งคืนเวอร์ชันที่ติดตั้งทั้งหมด ไม่ใช่แค่เวอร์ชันล่าสุดเท่านั้น
- -เวอร์ชันที่จำเป็น, -MinimumVersion, -MaximumVersion: จำกัดเวอร์ชันที่แน่นอนหรือช่วงของเวอร์ชันที่จะส่งคืน
- -ขอบเขต: CurrentUser หรือ AllUsers ขึ้นอยู่กับว่าติดตั้งแพ็คเกจไว้ที่ใด
- -บังคับ: หลีกเลี่ยงการยืนยันและบังคับคำสั่งเมื่อเหมาะสม
- -ForceBootstrap:ติดตั้งผู้ให้บริการที่จำเป็นโดยอัตโนมัติหากไม่มีอยู่
- -อนุญาตรุ่นก่อนวางจำหน่าย: รวมเวอร์ชันเบื้องต้นในผลลัพธ์
- -ติดตั้งอัพเดต:สำหรับสถานการณ์ที่ Get-Package สามารถติดตั้งการอัปเดตด้วยผู้ให้บริการที่รองรับได้
- ประเภท (PowerShellGet): โมดูล, ต้นฉบับ หรือทั้งหมด
- -เวอร์ชันที่ไม่รวม และปลายทาง (NuGet): ส่งผลต่อชื่อโฟลเดอร์และไดเร็กทอรีการแยกไฟล์เมื่อใช้ได้
- -ข้ามการพึ่งพา (NuGet): ข้ามการค้นหาการอ้างอิง
- -ข้ามการตรวจสอบผู้เผยแพร่ (PowerShellGet): ละเว้นการตรวจสอบของผู้เผยแพร่ในบางกรณี
- -ผู้ให้บริการจัดการแพ็กเกจ: ระบุผู้ให้บริการการจัดการแพ็กเกจ
- -ไม่มีการอัปเดตเส้นทาง: พารามิเตอร์ไดนามิก Install-Script ไม่ได้ใช้กับ Get-Package จริงๆ
- พารามิเตอร์ทั่วไป: Verbose, Debug, ErrorAction, WarningAction, OutVariable ฯลฯ
ตัวอย่างการใช้งานจริงทั่วไป ได้แก่ การแสดงรายการทุกอย่างที่ติดตั้งด้วย PowerShellGet การค้นหารุ่นเฉพาะ และแม้แต่การถอนการติดตั้งโดยการเชื่อมโยงกับUninstall-Packageผ่านไปป์ไลน์:
# Todo lo de PowerShellGet, con todas las versiones
Get-Package -ProviderName PowerShellGet -AllVersions
# Versión exacta de PackageManagement
Get-Package -Name PackageManagement -ProviderName PowerShellGet -RequiredVersion 1.3.1
# Desinstalar una versión concreta de un paquete
Get-Package -Name posh-git -RequiredVersion 0.7.3 | Uninstall-Package
โปรดทราบว่าคำสั่ง Get-Package รองรับการเข้าถึงระยะไกล (Invoke-Command หรือ Enter-PSSession) และผู้ให้บริการสามารถเพิ่มพารามิเตอร์แบบไดนามิกได้ ผลลัพธ์ที่ได้คืออ็อบเจ็กต์Microsoft.PackageManagement.Packaging.SoftwareIdentityซึ่งประกอบด้วยเมตาเดตาของแพ็กเกจ
แล้วซอฟต์แวร์ที่ "ติดตั้งด้วยตนเอง" ล่ะ? ข้อจำกัดที่ต้องคำนึงถึง
แอปพลิเคชันบางตัวติดตั้งโดยการคัดลอกโฟลเดอร์และไม่ได้ลงทะเบียนโปรแกรมถอนการติดตั้ง แอปพลิเคชันเหล่านี้จะไม่ปรากฏใน Uninstall, Win32_Product หรือ PackageManagement ในกรณีเหล่านี้ ให้จัดการแอปพลิเคชันเหล่านั้นในฐานะไฟล์และโฟลเดอร์ โดยใช้ วิธี การติดตั้งโปรแกรมด้วยตนเองโดยใช้สคริปต์ที่ค้นหาเส้นทาง ไฟล์ปฏิบัติการ หรือลายเซ็นที่เฉพาะเจาะจง
ด้วยเหตุผลเดียวกัน คอมพิวเตอร์สองเครื่องที่มีซอฟต์แวร์เดียวกันอาจแสดงผลลัพธ์ที่แตกต่างกัน หากเครื่องหนึ่งติดตั้งโดยใช้ MSI และอีกเครื่องหนึ่งติดตั้งโดยใช้ตัวติดตั้งอื่นโดยไม่ได้ลงทะเบียนการถอนการติดตั้ง การตรวจสอบระบบที่เหมาะสมที่สุดจึงผสมผสานเทคนิคหลายอย่างเข้าด้วยกัน ขึ้นอยู่กับสภาพแวดล้อม
การดำเนินการระยะไกลและความเข้ากันได้ของเวอร์ชัน Windows
สำหรับเซิร์ฟเวอร์และกลุ่มพีซี การใช้ PowerShell Remoting คือทางเลือกที่ดีที่สุด ด้วยการเชื่อมต่อระยะไกล (Enter-PSSession) หรือการเรียกใช้คำสั่ง (Invoke-Command) คุณสามารถรวบรวมข้อมูลโดยใช้คำสั่งเดียวกันกับที่คุณเคยเห็นมาก่อน ทำให้สามารถจัดการข้อมูลสินค้าคงคลังจากส่วนกลางได้จากเครื่องของคุณ
ตัวอย่างพื้นฐานในการค้นหา Get-Package บนเซิร์ฟเวอร์ระยะไกลด้วยข้อมูลประจำตัวโดเมนที่ถูกต้อง เหมาะอย่างยิ่งหากคุณได้กำหนดค่า WinRM ไว้แล้ว:
Invoke-Command -ComputerName Server01 -Credential CONTOSO\TestUser -ScriptBlock { Get-Package }
เทคนิคการแก้ไขรีจิสทรี (ถอนการติดตั้ง) ใช้ได้กับ Windows 7/10/11 และ Windows Server 2012 R2/2016/2019 ในขณะที่คำสั่ง Get-Package จำเป็นต้องมีPackageManagement และผู้ให้บริการที่เหมาะสมหรือติดตั้งด้วยตนเอง (ForceBootstrap ช่วยได้)
นักเขียนผู้หลงใหลเกี่ยวกับโลกแห่งไบต์และเทคโนโลยีโดยทั่วไป ฉันชอบแบ่งปันความรู้ผ่านการเขียน และนั่นคือสิ่งที่ฉันจะทำในบล็อกนี้ เพื่อแสดงให้คุณเห็นสิ่งที่น่าสนใจที่สุดเกี่ยวกับอุปกรณ์ ซอฟต์แวร์ ฮาร์ดแวร์ แนวโน้มทางเทคโนโลยี และอื่นๆ เป้าหมายของฉันคือการช่วยคุณนำทางโลกดิจิทัลด้วยวิธีที่เรียบง่ายและสนุกสนาน
