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
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:
=== 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.ps1On Linux or macOS (bash):
bash system-info.shWhat it does
- Operating system, version, build number and architecture
- CPU model and core count
- Total, in-use and percentage of memory
- Every fixed disk with total, free and used space (percentage included)
- IPv4 network interfaces, excluding loopback
Limitations
Know these before you rely on it:
- It is a single snapshot: no history, no trend line, no graphs
- No GPU, battery or per-process detail - use Task Manager, htop or Activity Monitor for that
- Memory "in use" is what the OS reports, not what a single app is holding
- On unusual systems some sections print "not reported" rather than guessing
Security notes — is this safe to run?
- Read-only: it never writes, deletes or uploads anything
- It needs no administrator rights
- Uses only built-in Windows commands (Get-CimInstance, Get-NetIPAddress) - nothing is downloaded
- The output includes your computer name and local IP addresses; redact those before posting the full report on a public forum
Compare the checksum of the file you downloaded against this value to be sure it was not tampered with en route:
| File | SHA-256 |
|---|---|
Get-SystemReport.ps1 | affa38df20ba7d87ef402c5451d71f9e40749366ae8fb51563a508648fa2c308 |
system-info.sh | 23cbd72dd04c72448a6538229169f598312b6ae4d58778098f81c1bacfa93d1a |
Verify with Get-FileHash .\Get-SystemReport.ps1 -Algorithm SHA256 on Windows, sha256sum Get-SystemReport.ps1 on Linux or macOS.
Alternatives
- fastfetch / neofetch — prettier terminal summaries, very popular on Linux
- msinfo32.exe — built into Windows, GUI, deeper hardware detail
- inxi — the detailed standard on Linux, often preinstalled
- System Information.app — built into macOS under Utilities
Other tools on this site
- Disk Usage — C drive full? Find which folder is using the most disk space on Windows, Mac or Linux.
- Large Files — Find the largest files on your PC — forgotten downloads, old backups, duplicate videos.
- Open Ports — Check open ports on your PC — see what is listening and spot anything unexpected.
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:
<#
.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:
#!/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."