System Report tool icon

System Report

Check your PC specs: CPU, RAM, disk space and network — one free script, no install.

Platforms
Windows, Linux, macOS
Needs
Nothing to install. PowerShell 5.1 is built into every modern Windows. The bash version runs in any Linux or macOS terminal.
Files
Get-SystemReport.ps1 (PowerShell) · system-info.sh (bash)
Licence
MIT — read, modify, redistribute
Verified
Ran on our test machine on 2026-10-17
Last reviewed
2026-10-17
Download Get-SystemReport.ps1Download system-info.shRead the sourceSee the full workflow

The problem it solves

Before you change anything, you need a baseline: how much RAM is actually free, which disk is nearly full, which OS build you are on. System Report prints all of that in one screen.

Example output

Here is what the script printed when we ran it on a test computer:

Real terminal output · hostname and IPs redacted
=== System Report ===
Computer    : LAPTOP-XXXXXXX
OS          : Microsoft Windows 11 Pro for Workstations (build 26200, 64-bit)
Uptime      : 244.7 h

--- CPU ---
Model       : AMD Ryzen 7 7735HS with Radeon Graphics
Cores       : 8

--- Memory ---
Total       : 13.31 GB
In use      : 11.69 GB
Usage       : 87.9%

--- Fixed disks ---
C:      474.72 GB total     330.44 GB free   30% used

--- Network (IPv4, excluding loopback) ---
vEthernet (Default Switch)     x.x.x.x
Local Area Connection 3        x.x.x.x
Local Area Connection* 10      x.x.x.x
OpenVPN Data Channel Offload for NordVPN x.x.x.x
Local Area Connection* 8       x.x.x.x
x-ovpn-tap                     x.x.x.x
Wi-Fi                          x.x.x.x
NordLynx                       x.x.x.x
Bluetooth Network Connection   x.x.x.x

Read-only report - nothing was changed on this machine.

Usage

Download the file, then run it from a terminal. On Windows (PowerShell):

powershell -NoProfile -ExecutionPolicy Bypass -File .\Get-SystemReport.ps1

On Linux or macOS (bash):

bash system-info.sh

What it does

Limitations

Know these before you rely on it:

Security notes — is this safe to run?

Compare the checksum of the file you downloaded against this value to be sure it was not tampered with en route:

FileSHA-256
Get-SystemReport.ps1affa38df20ba7d87ef402c5451d71f9e40749366ae8fb51563a508648fa2c308
system-info.sh23cbd72dd04c72448a6538229169f598312b6ae4d58778098f81c1bacfa93d1a

Verify with Get-FileHash .\Get-SystemReport.ps1 -Algorithm SHA256 on Windows, sha256sum Get-SystemReport.ps1 on Linux or macOS.

Alternatives

In context

This tool is one of the steps in the why is my pc so slow? diagnose and speed it up workflow — the guide explains what order to run things in and how to interpret the results.

Source

The complete PowerShell source, so you can audit it before running:

Get-SystemReport.ps1
<#
.SYNOPSIS
  Get-SystemReport - prints a one-screen system report for Windows.

.DESCRIPTION
  READ-ONLY. Reports OS build, CPU, memory, fixed disks and IPv4 addresses.
  Writes to the console only. Nothing is modified, nothing is uploaded.
  Needs no administrator rights.

.EXAMPLE
  powershell -ExecutionPolicy Bypass -File .\Get-SystemReport.ps1
#>
[CmdletBinding()]
param()

$os   = Get-CimInstance Win32_OperatingSystem
$cpu  = Get-CimInstance Win32_Processor | Select-Object -First 1
$cs   = Get-CimInstance Win32_ComputerSystem

function GB([double]$bytes) { '{0:N2} GB' -f ($bytes / 1GB) }

Write-Host '=== System Report ==='
Write-Host ('Computer    : {0}' -f $cs.Name)
Write-Host ('OS          : {0} (build {1}, {2})' -f $os.Caption, $os.BuildNumber, $os.OSArchitecture)
Write-Host ('Uptime      : {0:N1} h' -f ((Get-Date) - $os.LastBootUpTime).TotalHours)
Write-Host ''
Write-Host '--- CPU ---'
Write-Host ('Model       : {0}' -f $cpu.Name.Trim())
Write-Host ('Cores       : {0}' -f $cpu.NumberOfCores)
Write-Host ''
Write-Host '--- Memory ---'
$total = [double]$os.TotalVisibleMemorySize * 1KB
$free  = [double]$os.FreePhysicalMemory * 1KB
Write-Host ('Total       : {0}' -f (GB $total))
Write-Host ('In use      : {0}' -f (GB ($total - $free)))
Write-Host ('Usage       : {0:N1}%' -f ((($total - $free) / $total) * 100))
Write-Host ''
Write-Host '--- Fixed disks ---'
$disks = Get-CimInstance Win32_LogicalDisk -Filter 'DriveType=3'
if (-not $disks) {
  Write-Host '(none reported)'
} else {
  foreach ($d in $disks) {
    $usedPct = if ($d.Size -gt 0) { [Math]::Round(($d.Size - $d.FreeSpace) / $d.Size * 100) } else { 0 }
    Write-Host ('{0,-4} {1,9:N2} GB total  {2,9:N2} GB free  {3,3}% used' -f $d.DeviceID, ($d.Size/1GB), ($d.FreeSpace/1GB), $usedPct)
  }
}
Write-Host ''
Write-Host '--- Network (IPv4, excluding loopback) ---'
$ips = Get-NetIPAddress -AddressFamily IPv4 -ErrorAction SilentlyContinue |
  Where-Object { $_.IPAddress -ne '127.0.0.1' }
if (-not $ips) {
  Write-Host '(none reported)'
} else {
  foreach ($i in $ips) {
    Write-Host ('{0,-30} {1}' -f $i.InterfaceAlias, $i.IPAddress)
  }
}
Write-Host ''
Write-Host 'Read-only report - nothing was changed on this machine.'

The bash version:

system-info.sh
#!/usr/bin/env bash
# system-info.sh - one-screen system report for Linux and macOS.
# READ-ONLY: prints to the terminal, changes nothing.
# Run: bash system-info.sh

set -u

echo "=== System Report ==="
echo "Host        : $(hostname 2>/dev/null || echo unknown)"
echo "OS          : $(uname -s) $(uname -r) ($(uname -m))"
if [ "$(uname -s)" = "Linux" ] && [ -r /proc/uptime ]; then
  up=$(awk '{printf "%.1f", $1/3600}' /proc/uptime)
  echo "Uptime      : ${up} h"
elif command -v uptime >/dev/null 2>&1; then
  echo "Uptime      :$(uptime | sed 's/.*up //; s/,.*load.*//')"
fi

echo ""
echo "--- CPU ---"
if [ "$(uname -s)" = "Linux" ] && [ -r /proc/cpuinfo ]; then
  model=$(awk -F': ' '/model name/ {print $2; exit}' /proc/cpuinfo)
  cores=$(grep -c '^processor' /proc/cpuinfo 2>/dev/null || echo 0)
  echo "Model       : ${model:-unknown}"
  echo "Cores       : ${cores:-unknown}"
elif command -v sysctl >/dev/null 2>&1; then
  echo "Model       : $(sysctl -n machdep.cpu.brand_string 2>/dev/null || echo unknown)"
  echo "Cores       : $(sysctl -n hw.ncpu 2>/dev/null || echo unknown)"
else
  echo "Model       : (not reported on this system)"
fi

echo ""
echo "--- Memory ---"
if [ "$(uname -s)" = "Linux" ] && [ -r /proc/meminfo ]; then
  total_kb=$(awk '/MemTotal/ {print $2; exit}' /proc/meminfo)
  avail_kb=$(awk '/MemAvailable/ {print $2; exit}' /proc/meminfo)
  [ -z "$avail_kb" ] && avail_kb=$(awk '/MemFree/ {print $2; exit}' /proc/meminfo)
  if [ -n "$total_kb" ] && [ -n "$avail_kb" ]; then
    total=$(awk -v k="$total_kb" 'BEGIN {printf "%.2f", k/1048576}')
    used=$(awk -v t="$total_kb" -v a="$avail_kb" 'BEGIN {printf "%.2f", (t-a)/1048576}')
    pct=$(awk -v t="$total_kb" -v a="$avail_kb" 'BEGIN {if (t>0) printf "%.1f", (t-a)*100/t; else print "0.0"}')
    echo "Total       : ${total} GB"
    echo "In use      : ${used} GB"
    echo "Usage       : ${pct}%"
  else
    echo "(not reported on this system)"
  fi
elif command -v sysctl >/dev/null 2>&1; then
  total=$(sysctl -n hw.memsize 2>/dev/null | awk '{printf "%.2f", $1/1073741824}')
  echo "Total       : ${total:-unknown} GB"
else
  echo "(not reported on this system)"
fi

echo ""
echo "--- Disks ---"
df -kP 2>/dev/null | awk 'NR>1 && $1 !~ /^(tmpfs|devfs|map|shm|overlay)/ && $2 ~ /^[0-9]+$/ && !seen[$NF]++ {
  cap=$5; gsub(/%/,"",cap);
  printf "%-20s %8.1f GB total %8.1f GB free %3.0f%% used\n", $NF, $2/1048576, $4/1048576, cap+0
}' || echo "(df unavailable here)"

echo ""
echo "--- Network (IPv4) ---"
if command -v ip >/dev/null 2>&1; then
  ip -4 -o addr show 2>/dev/null | awk '{printf "%-30s %s\n", $2, $4}' | sed 's|/.*||'
elif command -v ifconfig >/dev/null 2>&1; then
  ifconfig 2>/dev/null | awk '/inet / && $2 != "127.0.0.1" {printf "%-30s %s\n", $1, $2}' | sed 's|addr:||'
else
  echo "(install iproute2 or net-tools for interface details)"
fi

echo ""
echo "Read-only report - nothing was changed on this machine."

← All tools