A modular, automated PowerShell script to update developer tools, runtimes, and package managers across fragmented ecosystems from a single terminal interface.
- Docker Desktop
- MSYS2 System and Packages
- Node.js LTS Runtime
- NPM Global Packages
- Python PIP
- Winget Applications
- WSL2 (Windows Subsystem for Linux)
This script runs best on PowerShell 7+. To verify your installed version, run:
$PSVersionTable.PSVersionIf the Major version is 5, you are using the legacy Windows PowerShell. Upgrading to PowerShell 7 is strongly recommended.
Run the following command via Windows Package Manager (Winget):
winget install --id Microsoft.PowerShell --source wingetOnce installed, restart your terminal or launch PowerShell 7 by typing:
pwshThis updater uses winget to update Docker Desktop, Node.js, and Windows applications. Check whether it is available:
winget --versionIf PowerShell reports that winget is not recognized, install or update App Installer from the Microsoft Store. App Installer includes Windows Package Manager and is available on supported versions of Windows 10 and Windows 11.
After installing App Installer, close and reopen PowerShell, then verify the installation:
Get-Command winget
winget --version
winget source updateIf winget is still unavailable, install pending Windows updates and confirm that your Windows user profile has access to App Installer. The updater cannot run its winget-based tools until this command is available.
If script execution is disabled on your system, enable execution for your user profile:
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUserCertain tools (such as WSL2 kernel updates, Docker Desktop, and system-wide Node.js MSI installations) require elevated privileges. If you plan to update these tools, launch your terminal with "Run as Administrator".
Clone the repository and navigate into the project directory:
git clone https://github.com/razban96/DevToolsUpdater.git
cd DevToolsUpdaterRun the entry-point script:
.\update.ps1The terminal prints a numbered list of all supported tools. From the prompt, you can:
- Select specific tools using space ' ' or comma-separated numbers (e.g., 1 3 5 or 1,2,4).
- Type A or all to run updates for all listed tools.
- Type Q or exit to terminate the script.
If a tool is not installed on your machine, the runner detects its absence in your PATH or target directory and skips it automatically without failing.
To trigger updates for all tools immediately without loading the interactive menu, pass the -All switch:
.\update.ps1 -Alldev-tool-updater/
├── update.ps1 # Main script entry point and orchestration loop
├── README.md # Project documentation
├── .gitignore # Ignores logs, test files, and local session artifacts
└── src/
├── Core/
│ ├── Menu.ps1 # CLI menu rendering and input token parsing
│ ├── Runner.ps1 # Command execution, tool validation, and error handling
│ └── Security.ps1 # Administrator privilege detection
└── Tools/
├── Docker.ps1 # Docker Desktop update definition
├── MSYS2.ps1 # MSYS2 Pacman update definition
├── Node.ps1 # Node.js runtime and NPM update definitions
├── Python.ps1 # Python PIP update definition
├── Windows.ps1 # Winget system applications definition
└── WSL.ps1 # WSL2 kernel update definition
The updater uses a dynamic plugin model. To add a new tool:
- Create a new .ps1 file inside the src/Tools/ directory.
- Define a function returning an array of PSCustomObject definitions with the following attributes:
function Get-CustomTools {
return @(
[PSCustomObject]@{
Id = "tool-id"
Name = "Display Name"
CheckCmd = "executable-name"
RequiresAdmin = $false
Action = { run-update-command-here }
}
)
}- Import the function call inside update.ps1 to register it with the execution pipeline.