I’ve always added a protective layer of third-party software to new Windows installations, comprising Task Manager alternatives, port scanners, network path tracers, and specialized utilities like CrystalDiskInfo. The goal is total system visibility. However, by doing that, I end up with more background services and bloat than I would like to admit.
My breaking point was realizing that Windows PowerShell could do almost everything I had installed third-party system monitors for. These PowerShell diagnostics have become an invaluable toolkit for managing and monitoring my PC, and I will show you exactly how they work.
Before I started using Get-Counter, I used XMeters, a taskbar system monitoring tool. It sits in the system tray and monitors CPU and RAM usage. This tool had its own background service and update schedule. It also had an impact on startup time, especially on less powerful devices.
Using Get-Counter in PowerShell natively replaces this tool. Without installing any extras, Get-Counter polls processor load, available memory, and disk activity. You can set the polling intervals. I typically run a command like this:
Get-Counter 'Processor(_Total)% Processor Time','MemoryAvailable MBytes' -SampleInterval 2 -MaxSamples 30
This command runs 30 readings at intervals of two seconds. That single command provides a 60-second real-time snapshot. I can append the following Export-Csv command to log the output, and instantly, I have my own performance log without the bloat of installing extra software:
| Export-Csv -Path "$env:USERPROFILEDesktopcpu_log.csv" -NoTypeInformation
Running the command Get-Counter -ListSet * allows you to browse all categories that Windows tracks.
If you use Windows, you’re familiar with Task Manager—the problem is that when my computer freezes, I don’t want to have to jump through menus or tabs to hunt down a red number. I would prefer to find and kill it in one move.
Here is the command I would rather run:
Get-Process | Sort-Object WorkingSet64 -Descending | Select-Object -First 10 Name, Id, @{Name='RAM_MB';Expression={[math]::Round($_.WorkingSet64/1MB,1)}}
This command exposes the top 10 memory consumers on my computer, sorted by size. Then I can kill a frozen process in a single pipeline by running this command:
Get-Process -Name "Chrome" | Where-Object {$_.Responding -eq $false} | Stop-Process -Force
You can substitute Chrome in the above command with any other process you want to kill. It removes the need for scrolling or waiting for Task Manager to catch up.
The -Responding property indicates whether the program is interacting with Windows (True) or not (False), which is why it’s useful for detecting hung processes. If the program is not responding, it returns False, and the command automatically forces it to stop. This is a programmatic way of ending a process that typically takes several clicks.
You can see the exact date and time a process was launched by adding StartTime to your Select-Object call. It’s worth investigating if a process is still using 2GB of RAM and has been running for two weeks.
My network checks used to feel fragmented. I used the built-in ping, tracer, and a lightweight port scanner. Test-NetConnection now replaces all three. Running the commands below, respectively, tells me if the host is reachable, if a specific port is open, and where a connection is failing:
Test-NetConnection -ComputerName google.com -InformationLevel Detailed
Test-NetConnection -ComputerName 192.168.1.1 -Port 443
Test-NetConnection -ComputerName 8.8.8.8 -TraceRoute
Test-NetConnection reports very clean and clear output. The final line of the output when you run the port-check command reads TcpTestSucceeded : True (or False). This kind of clean output makes it easy to use in an automated script. I’ve set up loops to silently check a connection, logging a warning anytime that value is False.
Solve your issues while saving dozens of clicks.
I’ve always considered Event Viewer to be a technically useful, yet practically awful tool. It’s slow to load and buries a lot of elements too deep in the menus. It really doesn’t encourage exploration.
Rather than use it, when something crashes or misbehaves, I run the query below:
Get-WinEvent -FilterHashtable @{
LogName = 'System'
Level = 1,2
StartTime = (Get-Date).AddHours(-24)
} | Select-Object TimeCreated, Id, LevelDisplayName, Message | Format-List
Without a loading screen or passing through any of Event Viewer’s frustrations, this command lists every serious system event from the last 24 hours with millisecond precision. Level 1 is Critical, while Level 2 is Error.
By appending | Group-Object Id | Sort-Object Count -Descending, you see which error ID fires most frequently. Seeing one error fire 300 times gives a different context than seeing 300 different errors.
Almost all power users that I know use CrystalDiskInfo. It’s well-built and one of the best ways to tell if your SSD is healthy. However, Windows already tracks this data, and you can view it by running the command below as an administrator on supported drives:
Get-PhysicalDisk | Get-StorageReliabilityCounter | Select-Object DeviceId, Temperature, Wear, ReadErrorsTotal, PowerOnHours
Wear tells you the amount of your drive’s rated endurance that has been used. This is output as a number rather than a color, which allows me to script alerts around it. For instance, if the following command returns any results (i.e., drives with Wear > 80), it’s a sign that I need to start seriously backing up:
Get-PhysicalDisk | Get-StorageReliabilityCounter | Where-Object {$_.Wear -gt 80} | Select-Object DeviceId, Wear
CrystalDiskInfo is an open-source software for Windows. It monitors the health, temperature, and S.M.A.R.T. status of HDDs and SSDs and provides warnings before potential disk failures.
What has been most surprising to me is that a huge part of my monitoring software exists to surface what Windows already surfaces. With these five diagnostics, I cover performance monitoring, process management, network troubleshooting, log analysis, and storage health. I still use third-party tools, but only if they offer something truly unique.
We want to hear from you. Share your perspective in the comments below, and please keep the conversation respectful.
Your comment has not been saved
This space is open for discussion.
Be the first to share your thoughts.

Leave a Reply