An interactive terminal UI for bulk-installing software on fresh Windows machines. Select only what you need, run once, walk away.
Software Installer
Select applications to install:
> [ ] Acrobat Reader
[ ] Google Chrome
[ ] Teams
[ ] K-Lite Codec Pack
[ ] 7-Zip
[ ] Microsoft Office 365
[ ] Azure Information Protection Viewer
[ ] .NET Desktop Runtime
[ ] Dell SupportAssist
----------------------------------
[Space] Select/Deselect
[Up/Down] Move up/down
[Enter] Install
[q] Quit
flowchart TD
A([Run-Install.bat\nUAC elevation]) --> B["TUI menu\n↑↓ navigate · Space select · Enter to install"]
B -- "Q" --> QUIT([Quit — no changes])
B -- "Enter" --> C[Install apps one by one]
C --> D{Installer exit code?}
D -- "0 / 3010 / 1641" --> OK["✔ Logged OK"]
D -- "other" --> FAIL["✘ Logged FAIL\n(continue to next app)"]
OK --> E{More apps?}
FAIL --> E
E -- Yes --> C
E -- No --> F["Show restart prompt\n(5 s · default: No)"]
F --> DONE([Session complete])
classDef success fill:#2d6a2d,color:#fff,stroke:#1a3d1a
classDef failure fill:#8b1a1a,color:#fff,stroke:#5a0d0d
classDef warning fill:#7a5500,color:#fff,stroke:#4d3600
class OK,DONE success
class FAIL failure
class QUIT warning
- Windows 10 / 11
- Administrator rights —
Run-Install.bathandles UAC elevation automatically - Installer files placed under
Software\Essentials\next to the script (see Customizing the App List below)
- Copy the script folder (including
Software\Essentials\with your installers) to the target machine — USB, network share, or local disk all work. - Double-click
Run-Install.batand accept the UAC prompt. - Use ↑ / ↓ to navigate, Space to select or deselect apps, Enter to begin installation.
- Answer the restart prompt when done (default: no restart).
If you decline the UAC prompt, the script will display a message and wait — it will not silently close.
The $applications array near the top of Install-EssentialApps.ps1 defines what appears in the menu. Each entry is a hashtable with three keys:
| Key | Description |
|---|---|
Name |
Display name shown in the menu |
Path |
Path to the installer, relative to the script folder |
Args |
Silent install arguments passed to the installer |
Adding an app — copy any existing entry and update all three keys.
Disabling without removing — prefix the entry with # to comment it out. It stays in the file for reference.
All Path values resolve relative to $PSScriptRoot — the folder containing the script — so the same script works from a USB drive, a network share, or a local path without changes.
Silent arguments suppress the installer UI so no clicks are required. How to find them:
| Method | Details |
|---|---|
| Help flag | Run installer.exe /? or installer.exe --help in a terminal |
| MSI-based | /quiet /norestart (fully silent) or /qb! /norestart (minimal UI) |
| NSIS-based | /S |
| Inno Setup | /VERYSILENT /NORESTART /SUPPRESSMSGBOXES |
| WiX / Burn | /quiet or /silent |
| Vendor docs | Search <app name> silent install parameters or unattended install |
| Reference | ss64.com — msiexec flags · silentinstallhq.com |
Exit codes:
0= success.3010= success, reboot required.1641= reboot already initiated. Any other code is treated as a failure and logged.
- The TUI menu loops until at least one app is selected and Enter is pressed.
- Selected apps are passed to
Install-Applicationone by one. - Each installer is launched with
Start-Process -Wait— the script blocks until the process exits. - The installer's exit code is checked; anything outside the known success codes is thrown as an error.
- A progress bar tracks overall completion.
- On finish, a 5-second restart prompt appears (default: no restart).
Every session appends to Install-EssentialApps.log in the same folder as the script:
2026-05-03 14:00:01 --- Install session started ---
2026-05-03 14:00:01 START Google Chrome
2026-05-03 14:00:08 OK Google Chrome
2026-05-03 14:00:08 START 7-Zip
2026-05-03 14:00:09 FAIL 7-Zip — File not found: ...
2026-05-03 14:01:30 --- Session complete: 1/2 installed ---
Log entries older than 90 days are automatically trimmed at the start of each session. The log file is excluded from the repo via .gitignore.
- ASCII art — A placeholder comment in
Display-Menumarks where you can drop in your ownWrite-Host @"..."@art block. - Dell Command Update — The entry and its post-install configuration function (
Configure-DellCommandUpdate) are present but commented out. To activate, uncomment the$applicationsentry and theConfigure-DellCommandUpdatecall insideInstall-Application. - Teams sideload — The Teams entry uses the bootstrapper +
.msixsideload method. Bothteamsbootstrapper.exeandMSTeams-x64.msixmust be present inSoftware\Essentials\.