Skip to content

Instantly share code, notes, and snippets.

@mikepruett3
Last active April 16, 2024 22:19
Show Gist options
  • Save mikepruett3/7ca6518051383ee14f9cf8ae63ba18a7 to your computer and use it in GitHub Desktop.
Save mikepruett3/7ca6518051383ee14f9cf8ae63ba18a7 to your computer and use it in GitHub Desktop.
Packages to install via scoop, winget, choco, and other tools...
<#
.SYNOPSIS
Script to Initialize my custom powershell setup.
.DESCRIPTION
Script uses scoop
.NOTES
**NOTE** Will configure the Execution Policy for the "CurrentUser" to Unrestricted.
Author: Mike Pruett
Date: October 18th, 2018
Last Updated on August 4th, 2023
#>
$VerbosePreference = "Continue"
function Install-ScoopApp {
param (
[string]$Package
)
Write-Verbose -Message "Preparing to install $Package"
if (! (scoop info $Package).Installed ) {
Write-Verbose -Message "Installing $Package"
scoop install $Package
} else {
Write-Verbose -Message "Package $Package already installed! Skipping..."
}
}
function Install-WinGetApp {
param (
[string]$PackageID
)
Write-Verbose -Message "Preparing to install $PackageID"
# Added accept options based on this issue - https://github.com/microsoft/winget-cli/issues/1559
#$listApp = winget list --exact -q $PackageID --accept-source-agreements
#if (winget list --exact --id "$PackageID" --accept-source-agreements) {
# Write-Verbose -Message "Package $PackageID already installed! Skipping..."
#} else {
# Write-Verbose -Message "Installing $Package"
# winget install --silent --id "$PackageID" --accept-source-agreements --accept-package-agreements
#}
Write-Verbose -Message "Installing $Package"
winget install --silent --id "$PackageID" --accept-source-agreements --accept-package-agreements
}
function Install-ChocoApp {
param (
[string]$Package
)
Write-Verbose -Message "Preparing to install $Package"
$listApp = choco list --local $Package
if ($listApp -like "0 packages installed.") {
Write-Verbose -Message "Installing $Package"
Start-Process -FilePath "PowerShell" -ArgumentList "choco","install","$Package","-y" -Verb RunAs -Wait
} else {
Write-Verbose -Message "Package $Package already installed! Skipping..."
}
}
function Extract-Download {
param (
[string]$Folder,
[string]$File
)
if (!(Test-Path -Path "$Folder" -PathType Container)) {
Write-Error "$Folder does not exist!!!"
Break
}
if (Test-Path -Path "$File" -PathType Leaf) {
switch ($File.Split(".") | Select-Object -Last 1) {
"rar" { Start-Process -FilePath "UnRar.exe" -ArgumentList "x","-op'$Folder'","-y","$File" -WorkingDirectory "$Env:ProgramFiles\WinRAR\" -Wait | Out-Null }
"zip" { 7z x -o"$Folder" -y "$File" | Out-Null }
"7z" { 7z x -o"$Folder" -y "$File" | Out-Null }
"exe" { 7z x -o"$Folder" -y "$File" | Out-Null }
Default { Write-Error "No way to Extract $File !!!"; Break }
}
}
}
function Download-CustomApp {
param (
[string]$Link,
[string]$Folder
)
if ((curl -sIL "$Link" | Select-String -Pattern "Content-Disposition") -ne $Null) {
$Package = $(curl -sIL "$Link" | Select-String -Pattern "filename=" | Split-String -Separator "=" | Select-Object -Last 1).Trim('"')
} else {
$Package = $Link.split("/") | Select-Object -Last 1
}
Write-Verbose -Message "Preparing to download $Package"
aria2c --quiet --dir="$Folder" "$Link"
Return $Package
}
function Install-CustomApp {
param (
[string]$URL,
[string]$Folder
)
$Package = Download-CustomApp -Link $URL -Folder "$Env:UserProfile\Downloads\"
if (Test-Path -Path "$Env:UserProfile\Downloads\$Package" -PathType Leaf) {
if (Test-Path Variable:Folder) {
if (!(Test-Path -Path "$Env:UserProfile\bin\$Folder")) {
New-Item -Path "$Env:UserProfile\bin\$Folder" -ItemType Directory | Out-Null
}
Extract-Download -Folder "$Env:UserProfile\bin\$Folder" -File "$Env:UserProfile\Downloads\$Package"
} else {
Extract-Download -Folder "$Env:UserProfile\bin\" -File "$Env:UserProfile\Downloads\$Package"
}
Remove-Item -Path "$Env:UserProfile\Downloads\$Package"
}
}
function Install-CustomPackage {
param (
[string]$URL
)
$Package = Download-CustomApp -Link $URL
if (Test-Path -Path "$Env:UserProfile\Downloads\$Package" -PathType Leaf) {
Start-Process -FilePath ".\$Package" -ArgumentList "/S" -WorkingDirectory "${Env:UserProfile}\Downloads\" -Verb RunAs -Wait #-WindowStyle Hidden
Remove-Item -Path "$Env:UserProfile\Downloads\$Package"
}
}
function Remove-InstalledApp {
param (
[string]$Package
)
Write-Verbose -Message "Uninstalling: $Package"
Start-Process -FilePath "PowerShell" -ArgumentList "Get-AppxPackage","-AllUsers","-Name","'$Package'" -Verb RunAs -WindowStyle Hidden
}
function Enable-Bucket {
param (
[string]$Bucket
)
if (!($(scoop bucket list).Name -eq "$Bucket")) {
Write-Verbose -Message "Adding Bucket $Bucket to scoop..."
scoop bucket add $Bucket
} else {
Write-Verbose -Message "Bucket $Bucket already added! Skipping..."
}
}
# Configure ExecutionPolicy to Unrestricted for CurrentUser Scope
if ((Get-ExecutionPolicy -Scope CurrentUser) -notcontains "Unrestricted") {
Write-Verbose -Message "Setting Execution Policy for Current User..."
Start-Process -FilePath "PowerShell" -ArgumentList "Set-ExecutionPolicy","-Scope","CurrentUser","-ExecutionPolicy","Unrestricted","-Force" -Verb RunAs -Wait
Write-Output "Restart/Re-Run script!!!"
Start-Sleep -Seconds 10
Break
}
# Install Scoop, if not already installed
#$scoopInstalled = Get-Command "scoop"
if ( !(Get-Command -Name "scoop" -CommandType Application -ErrorAction SilentlyContinue | Out-Null) ) {
Write-Verbose -Message "Installing Scoop..."
iex ((New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh'))
}
# Install Chocolatey, if not already installed
#$chocoInstalled = Get-Command -Name "choco" -CommandType Application -ErrorAction SilentlyContinue | Out-Null
if (! (Get-Command -Name "choco" -CommandType Application -ErrorAction SilentlyContinue | Out-Null) ) {
Write-Verbose -Message "Installing Chocolatey..."
@'
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072
iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
'@ > $Env:Temp\choco.ps1
Start-Process -FilePath "PowerShell" -ArgumentList "$Env:Temp\choco.ps1" -Verb RunAs -Wait
Remove-Item -Path $Env:Temp\choco.ps1 -Force
}
# Install WinGet, if not already installed
# From crutkas's gist - https://gist.github.com/crutkas/6c2096eae387e544bd05cde246f23901
#$hasPackageManager = Get-AppPackage -name "Microsoft.DesktopAppInstaller"
if (!(Get-AppPackage -name "Microsoft.DesktopAppInstaller")) {
Write-Verbose -Message "Installing WinGet..."
@'
# Set URL and Enable TLSv12
$releases_url = "https://api.github.com/repos/microsoft/winget-cli/releases/latest"
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
# Dont Think We Need This!!!
#Install-PackageProvider -Name NuGet
# Install Nuget as Package Source Provider
Register-PackageSource -Name Nuget -Location "http://www.nuget.org/api/v2" -ProviderName Nuget -Trusted
# Install Microsoft.UI.Xaml (This is not currently working!!!)
Install-Package Microsoft.UI.Xaml -RequiredVersion 2.7.1
# Grab "Latest" release
$releases = Invoke-RestMethod -uri $releases_url
$latestRelease = $releases.assets | Where { $_.browser_download_url.EndsWith('msixbundle') } | Select -First 1
# Install Microsoft.DesktopAppInstaller Package
Add-AppxPackage -Path $latestRelease.browser_download_url
'@ > $Env:Temp\winget.ps1
Start-Process -FilePath "PowerShell" -ArgumentList "$Env:Temp\winget.ps1" -Verb RunAs -Wait
Remove-Item -Path $Env:Temp\winget.ps1 -Force
}
# Only install OpenSSH Package, if not on Windows 10
if ([Environment]::OSVersion.Version.Major -lt 10) {
Install-ScoopApp -Package "openssh"
}
# Install OpenSSH.Client on Windows 10+
@'
if ((Get-WindowsCapability -Online -Name OpenSSH.Client*).State -ne "Installed") {
Add-WindowsCapability -Online -Name OpenSSH.Client*
}
'@ > "${Env:Temp}\openssh.ps1"
Start-Process -FilePath "PowerShell" -ArgumentList "${Env:Temp}\openssh.ps1" -Verb RunAs -Wait -WindowStyle Hidden
Remove-Item -Path "${Env:Temp}\openssh.ps1" -Force
# Configure git
Install-WinGetApp -PackageID "Git.Git"
Start-Sleep -Seconds 5
refreshenv
Start-Sleep -Seconds 5
if (!$(git config --global credential.helper) -eq "manager-core") {
git config --global credential.helper manager-core
}
if (!($Env:GIT_SSH)) {
Write-Verbose -Message "Setting GIT_SSH User Environment Variable"
[System.Environment]::SetEnvironmentVariable('GIT_SSH', (Resolve-Path (scoop which ssh)), 'USER')
}
if ((Get-Service -Name ssh-agent).Status -ne "Running") {
Start-Process -FilePath "PowerShell" -ArgumentList "Set-Service","ssh-agent","-StartupType","Manual" -Verb RunAs -Wait -WindowStyle Hidden
}
# Configure Aria2 Download Manager
Install-ScoopApp -Package "aria2"
if (!$(scoop config aria2-enabled) -eq $True) {
scoop config aria2-enabled true
}
if (!$(scoop config aria2-warning-enabled) -eq $False) {
scoop config aria2-warning-enabled false
}
if (!(Get-ScheduledTaskInfo -TaskName "Aria2RPC" -ErrorAction Ignore)) {
@'
$Action = New-ScheduledTaskAction -Execute $Env:UserProfile\scoop\apps\aria2\current\aria2c.exe -Argument "--enable-rpc --rpc-listen-all" -WorkingDirectory $Env:UserProfile\Downloads
$Trigger = New-ScheduledTaskTrigger -AtStartup
$Principal = New-ScheduledTaskPrincipal -UserID "$Env:ComputerName\$Env:Username" -LogonType S4U
$Settings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit 0 -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries
Register-ScheduledTask -TaskName "Aria2RPC" -Action $Action -Trigger $Trigger -Principal $Principal -Settings $Settings
'@ > $Env:Temp\aria2.ps1
Start-Process -FilePath "PowerShell" -ArgumentList "$Env:Temp\aria2.ps1" -Verb RunAs -Wait #-WindowStyle Hidden
Remove-Item -Path $Env:Temp\aria2.ps1 -Force
}
## Add Buckets
Enable-Bucket -Bucket "extras"
Enable-Bucket -Bucket "nerd-fonts"
Enable-Bucket -Bucket "java"
Enable-Bucket -Bucket "nirsoft"
scoop bucket add foosel https://github.com/foosel/scoop-bucket
# UNIX Tools
Write-Verbose -Message "Removing curl Alias..."
if (Get-Alias -Name curl -ErrorAction SilentlyContinue) {
Remove-Item alias:curl
}
if (!($Env:TERM)) {
Write-Verbose -Message "Setting TERM User Environment Variable"
[System.Environment]::SetEnvironmentVariable("TERM", "xterm-256color", "USER")
}
# Check if Home Workstation
if ($(Read-Host -Prompt "Is this a workstation for Home use (y/n)?") -eq "y") {
$HomeWorkstation = $True
} else {
$HomeWorkstation = $False
}
# Home Workstation Configurations
if ($HomeWorkstation) {
# Adding games bucket
Enable-Bucket -Bucket "games"
# Create $Env:UserProfile\bin, if not exist
if (!(Test-Path -Path $Env:UserProfile\bin)) {
Write-Verbose -Message "Creating bin directory in $Env:UserProfile"
New-Item -Path $Env:UserProfile\bin -ItemType Directory | Out-Null
#[System.Environment]::SetEnvironmentVariable("PATH", $Env:PATH + ";$Env:UserProfile\bin","USER")
}
}
# Install Scoop Packages
$Scoop = @(
"scoop-tray",
"concfg",
#"curl",
#"busybox",
#"fzf",
#"neovim",
"pshazz",
"cacert",
"colortool",
#"sudo",
#"openjdk",
"icedtea-web",
#"go",
#"python",
#"gpg",
#"imgburn",
#"paint.net",
#"putty",
#"winscp",
#"spacesniffer",
#"filebot",
#"rufus",
#"etcher",
#"cpu-z",
#"gpu-z",
"ssd-z",
#"hwmonitor",
#"crystaldiskmark",
"hotkeyslist",
"open-log-viewer",
"baretail",
#"bleachbit",
#"hosts-file-editor",
"minio-client",
"lessmsi",
#"mqtt-explorer",
"tftpd",
"restic",
"Hack-NF",
"driverstoreexplorer",
"sysinternals")#,"rktools2k3")
foreach ($item in $Scoop) {
Install-ScoopApp -Package "$item"
}
# Install Scoop Packages, if Home Workstation
if ($HomeWorkstation) {
Remove-Variable -Name "Scoop"
$Scoop = @(
"ffmpeg",
"mpv",
#"vlc",
"lame",
#"musicbee",
#"mp3tag",
#"mkvtoolnix",
#"obs-studio",
#"yt-dlp",
#"ocenaudio",
#"mediainfo",
#"mediainfo-gui",
"cdrtools",
"cuetools",
"betterjoy",
"schismtracker")
foreach ($item in $Scoop) {
Install-ScoopApp -Package "$item"
}
}
# Install WinGet Packages
$WinGet = @(
#"Microsoft.dotNetFramework",
"gerardog.gsudo",
"Microsoft.DotNet.DesktopRuntime.3_1",
"Microsoft.DotNet.DesktopRuntime.5",
"Microsoft.DotNet.DesktopRuntime.6",
"Microsoft.DotNet.DesktopRuntime.7",
"Microsoft.WindowsTerminal",
"Microsoft.PowerToys",
"frippery.busybox-w32",
"junegunn.fzf",
"Neovim.Neovim",
"Obsidian.Obsidian",
"Microsoft.OpenJDK.17",
"GoLang.Go.1.19",
"Python.Python.3.11",
"chrisant996.Clink",
"PuTTY.PuTTY",
"WinSCP.WinSCP",
"Balena.Etcher",
"CPUID.HWMonitor",
"CrystalDewWorld.CrystalDiskMark",
"BleachBit.BleachBit",
#"TeamViewer.TeamViewer",
"GnuPG.GnuPG",
"LIGHTNINGUK.ImgBurn",
"dotPDNLLC.paintdotnet",
"UderzoSoftware.SpaceSniffer",
"Rufus.Rufus",
"scottlerch.hosts-file-editor",
#"Minio.Client",
"thomasnordquist.MQTT-Explorer",
"jziolkowski.tdm",
"HDDGURU.HDDRawCopyTool",
"dnSpyEx.dnSpy",
"JLC.EasyEDA",
"Google.Chrome",
"Lexikos.AutoHotkey",
"SumatraPDF.SumatraPDF",
"ScooterSoftware.BeyondCompare4",
"Eassos.DiskGenius",
"RevoUninstaller.RevoUninstaller",
"ElaborateBytes.VirtualCloneDrive",
"RARLab.WinRAR",
"Piriform.Speccy",
"Piriform.Defraggler",
"Starship.Starship",
"OliverBetz.ExifTool"
)
foreach ($item in $WinGet) {
Install-WinGetApp -PackageID "$item"
}
# Add Directories to User Path
#[System.Environment]::SetEnvironmentVariable("PATH", $Env:PATH + ";$Env:ProgramFiles\WinRAR","USER")
# Install WinGet Packages, if Home Workstation
if ($HomeWorkstation) {
Remove-Variable -Name "WinGet"
$WinGet = @(
"Discord.Discord",
"HandBrake.HandBrake",
"AndreWiethoff.ExactAudioCopy",
"clsid2.mpc-hc",
"Plex.Plex",
"Plex.Plexamp",
"PointPlanck.FileBot",
"CPUID.CPU-Z",
"TechPowerUp.GPU-Z",
"VideoLAN.VLC",
"Mp3tag.Mp3tag",
"MusicBee.MusicBee",
"OBSProject.OBSStudio",
"yt-dlp.yt-dlp",
"MediaArea.MediaInfo",
"MediaArea.MediaInfo.GUI",
"MoritzBunkus.MKVToolNix",
"Ocenaudio.Ocenaudio",
"OpenMPT.OpenMPT",
"Romcenter.Romcenter",
"Valve.Steam"
)
foreach ($item in $WinGet) {
Install-WinGetApp -PackageID "$item"
}
}
# Custom WinGet install for VSCode
winget install Microsoft.VisualStudioCode --override '/SILENT /mergetasks="!runcode,addcontextmenufiles,addcontextmenufolders"'
# Install Chocolatey Packages
$Choco = @(
"syspin",
"sd-card-formatter",
"winimage",
"winsetupfromusb",
"fluidsynth"
)
foreach ($item in $Choco) {
Install-ChocoApp -Package "$item"
}
# Install Steam Applications
if ($HomeWorkstation) {
# Get Steam AppID's from https://steamdb.info/
# https://developer.valvesoftware.com/wiki/Command_Line_Options#Steam_.28Windows.29
$SteamDB = @(
"1026460" #Lossless Scaling Demo,
"431960" #Wallpaper Engine,
"388080" #Borderless Gaming,
"367670" #Controller Companion,
"227260" #DisplayFusion,
"274920" #FaceRig
)
# Collect installed Steam AppID's
$InstalledIDs = [System.Collections.ArrayList]::new()
foreach ($item in (Get-ChildItem -Path "${Env:Programfiles(x86)}\Steam\steamapps\common\" -Filter "steam_appid.txt" -Recurse).VersionInfo.FileName) {
[void]$InstalledIDs.Add((Get-Content -Path $item))
}
# Install Steam AppID, if not already installed
foreach ($item in $SteamDB) {
if ($item -ne $InstalledIDs) {
Start-Process -FilePath ".\steam.exe" -ArgumentList "-applaunch","$item" -WorkingDirectory "${Env:Programfiles(x86)}\Steam\" -Wait
}
}
}
# Create Symbolic Links
## busybox.exe
sudo New-Item -ItemType SymbolicLink -Path "$(Split-Path -Path (Get-Command busybox*.exe).Source)\busybox.exe" -Target (Get-Command busybox*.exe).Source
## tdmgr.exe
sudo New-Item -ItemType SymbolicLink -Path "$(Split-Path -Path (Get-Command tdmgr*.exe).Source)\tdmgr.exe" -Target (Get-Command tdmgr*.exe).Source
# Install Custom Packages
# Instal RawWrite for Windows from Chrysocome
Install-CustomApp -URL "http://www.chrysocome.net/downloads/0d23e6a31f1d37850fc2040eec98e9f9/rawwritewin-0.7.zip" -Folder "RawWrite"
# Install Tasmota Device Manager from Github
#New-Item -Path "$Env:UserProfile\bin\TasmotaDM" -ItemType Directory | Out-Null
#Download-CustomApp -Link "https://github.com/jziolkowski/tdm/releases/download/v0.2.11/tdmgr_0.2.11.exe" -Folder "$Env:UserProfile\bin\TasmotaDM" | Out-Null
# Install HDD Raw Copy Tool from HDDGURU
#New-Item -Path "$Env:UserProfile\bin\HDDRawCopy" -ItemType Directory | Out-Null
#Download-CustomApp -Link "https://hddguru.com/software/HDD-Raw-Copy-Tool/HDDRawCopy1.10Portable.exe" -Folder "$Env:UserProfile\bin\HDDRawCopy" | Out-Null
# Install XVI32 from Christian Maas
Install-CustomApp -URL "http://www.handshake.de/user/chmaas/delphi/download/xvi32.zip" -Folder "XVI32"
# Install dnSpy from Github
#Install-CustomApp -URL "https://github.com/dnSpy/dnSpy/releases/download/v6.1.8/dnSpy-net-win64.zip" -Folder "dnSpy"
# Install ei.cfg Removal Utility from code.kliu.org
Install-CustomApp -URL "https://code.kliu.org/misc/winisoutils/eicfg_removal_utility.zip" -Folder "ei.cfg-removal-utility"
# Install HSFExplorer from SourceForge
Install-CustomPackage -URL "https://downloads.sourceforge.net/project/catacombae/HFSExplorer/2021.10.9/hfsexplorer-2021.10.9-setup.exe"
# Install RipMe from Github
New-Item -Path "$Env:UserProfile\bin\RipMe" -ItemType Directory | Out-Null
Download-CustomApp -Link "https://github.com/RipMeApp/ripme/releases/download/1.7.95/ripme.jar" -Folder "$Env:UserProfile\bin\RipMe" | Out-Null
# Install EasyEDA Router from EasyEDA
Install-CustomApp -URL "https://image.easyeda.com/files/easyeda-router-windows-x64-v0.8.11.zip"
# Install Custom Packages for Home Workstations
if ($HomeWorkstation) {
# Install CDMage from Major Geeks
Install-CustomApp -URL "https://files1.majorgeeks.com/10afebdbffcd4742c81a3cb0f6ce4092156b4375/cddvd/CDmage1-01-5.exe" -Folder "CDMage"
# Install ACiD View from SourceForge
Install-CustomApp -URL "https://downloads.sourceforge.net/project/acidview6-win32/acidview6-win32/6.10/avw-610.zip" -Folder "ACiDView"
# Install NohBoard from SourceForge
Install-CustomApp -URL "https://downloads.sourceforge.net/project/nohboard/NohBoard-v0.17b.zip"
# Install PSX2PSP from PSX-Place
Install-CustomApp -URL "https://www.psx-place.com/resources/psx2psp.586/download?version=898"
# Install CLRMamePro from EMULab
Install-CustomPackage -URL "https://mamedev.emulab.it/clrmamepro/binaries/cmp4044c_64.exe"
# Install Soundfont Midi Player from Falcosoft
Install-CustomApp -URL "https://falcosoft.hu/midiplayer_60_x64.zip"
# Install SkraperUI fro Skraper
Install-CustomApp -URL "https://www.skraper.net/download/beta/Skraper-1.1.1.7z" -Folder "SkraperUI"
# Install WinHIIP from PSX-Place
Install-CustomApp -URL "https://www.psx-place.com/resources/obsolete-winhiip-by-gadgetfreak.666/download?version=1066" -Folder "WinHIIP"
# Install WinBin2Iso from Major Geeks
Install-CustomApp -URL "https://www.softwareok.com/Download/WinBin2Iso.zip" -Folder "WinBin2Iso"
# Install ArchiSteamFarm from Github
Install-CustomApp -URL "https://github.com/JustArchiNET/ArchiSteamFarm/releases/download/5.2.4.2/ASF-win-x64.zip" -Folder "ArchiSteamFarm2"
# Install TwilightMenu++ Boxart Downloader from Github
Install-CustomApp -URL "https://github.com/KirovAir/TwilightBoxart/releases/download/0.7/TwilightBoxart-Windows-UX.zip" -Folder "TwilightMenuBoxArt"
# Install ISO Toolkit from Major Geeks
New-Item -Path "$Env:UserProfile\bin\ISOToolkit" -ItemType Directory | Out-Null
Download-CustomApp -Link "https://files1.majorgeeks.com/10afebdbffcd4742c81a3cb0f6ce4092156b4375/cddvd/ISOToolKit.exe" -Folder "$Env:UserProfile\bin\ISOToolkit" | Out-Null
# Install binmerge from Github
Install-CustomApp -URL "https://github.com/putnam/binmerge/releases/download/1.0.1/binmerge-1.0.1-win64.zip"
# Install PPF-o-Matic from PSX-Place
Install-CustomApp -URL "https://www.psx-place.com/resources/ppf-o-matic.507/download?version=717" -Folder "ppf-o-matic"
# Install MBCord from Github
Install-CustomApp -URL "https://github.com/oonqt/MBCord/releases/download/2.3.13/MBCord-win32-x64.zip" -Folder "MBCord"
# Install bchunk from Github
Install-CustomApp -URL "https://github.com/extramaster/bchunk/releases/download/v1.2.1_repub.1/bchunk.v1.2.1_repub.1.zip"
# Install CHDMan from MAMEDEV
$Package = Download-CustomApp -Link "https://github.com/mamedev/mame/releases/download/mame0242/mame0242b_64bit.exe" -Folder "$Env:UserProfile\Downloads\"
7z e -o"$Env:UserProfile\bin\" -y "$Env:UserProfile\Downloads\$Package" chdman.exe | Out-Null
Remove-Item -Path "$Env:UserProfile\Downloads\$Package"
# Install ExifTool from ExifTool.org
#Install-CustomApp -URL "https://www.exiftool.org/exiftool-12.41.zip"
#Move-Item -Path "$Env:UserProfile\bin\exiftool*.exe" -Destination "$Env:UserProfile\bin\exiftool.exe"
# Install OpenMPT123 from OpenMPT
Install-CustomApp -URL "https://lib.openmpt.org/files/libopenmpt/bin/libopenmpt-0.6.3+release.bin.windows.zip" -Folder "OpenMPT123"
# Install WildMIDI from Github
Install-CustomApp -URL "https://github.com/Mindwerks/wildmidi/releases/download/wildmidi-0.4.4/wildmidi-0.4.4-win64.zip"
Move-Item -Path "$Env:UserProfile\bin\wildmidi*\" -Destination "$Env:UserProfile\bin\WildMIDI\"
# Install Aaru from Github
Install-CustomApp -URL "https://github.com/aaru-dps/Aaru/releases/download/v5.3.1/aaru-5.3.1_windows_x64.zip" -Folder "Aaru"
}
# Create scoop-tray shortcut in shell:startup
if (!(Test-Path -Path "$Env:AppData\Microsoft\Windows\Start Menu\Programs\Startup\scoop-tray.lnk" -PathType Leaf)) {
Write-Verbose -Message "Create scoop-tray shortcut in shell:startup..."
$WSHShell = New-Object -ComObject WScript.Shell
$Shortcut = $WSHShell.CreateShortcut("$Env:AppData\Microsoft\Windows\Start Menu\Programs\Startup\scoop-tray.lnk")
$Shortcut.TargetPath = "$Env:UserProfile\scoop\apps\scoop-tray\current\scoop-tray.bat"
$Shortcut.WindowStyle = 7
$Shortcut.IconLocation = "%USERPROFILE%\scoop\apps\scoop-tray\current\updates-available.ico"
$Shortcut.Description = "scoop-tray.bat"
$Shortcut.WorkingDirectory = Split-Path "$Env:UserProfile\scoop\apps\scoop-tray\current\scoop-tray.bat" -Resolve
$Shortcut.Save()
}
# Configure GO Environment
if (!(Test-Path -Path "$Env:UserProfile\go\" -PathType Container)) {
Write-Verbose -Message "Configuring GO Environment..."
New-Item -Path "${Env:UserProfile}\go" -ItemType Directory | Out-Null
[System.Environment]::SetEnvironmentVariable('GOPATH', "${Env:UserProfile}\go", 'USER')
}
# Customize DOS/PowerShell Environment
Write-Verbose -Message "Customize DOS/PowerShell Environment..."
if ((Get-ItemProperty -Path "HKCU:\Software\Microsoft\Command Processor").AutoRun -eq $Null) {
Start-Process -FilePath "cmd" -ArgumentList "/c","clink","autorun","install" -Wait -WindowStyle Hidden
}
Start-Process -FilePath "cmd" -ArgumentList "/c","concfg","import","solarized-dark" -Verb RunAs -Wait
# Install Visual Studio Code Integrations
#if (!(Get-Item -Path "HKCU:\Software\Classes\Directory\shell\Open with &Code" -ErrorAction Ignore)) {
# Write-Verbose -Message "Install Visual Studio Code Integrations..."
# Start-Process -FilePath "cmd" -ArgumentList "/c","reg","import","%UserProfile%\scoop\apps\vscode\current\install-context.reg" -Verb RunAs -Wait -WindowStyle Hidden
# Start-Process -FilePath "cmd" -ArgumentList "/c","reg","import","%UserProfile%\scoop\apps\vscode\current\nstall-associations.reg" -Verb RunAs -Wait -WindowStyle Hidden
#}
# Pin Run to Taskbar
#Start-Process -FilePath "PowerShell" -ArgumentList "syspin","'$Env:AppData\Microsoft\Windows\Start Menu\Programs\System Tools\Run.lnk'","c:5386" -Wait -NoNewWindow
# Pin Google Chrome to Taskbar
Write-Verbose -Message "Pin Google Chrome to Taskbar..."
Start-Process -FilePath "PowerShell" -ArgumentList "syspin","'$Env:ProgramData\Microsoft\Windows\Start Menu\Programs\Google Chrome.lnk'","c:5386" -Wait -NoNewWindow
# Install my PowerShell dot files
if (!(Test-Path -Path "$Env:UserProfile\dotposh" -PathType Container)) {
Write-Verbose -Message "Install my PowerShell dot files..."
Start-Process -FilePath "PowerShell" -ArgumentList "git","clone","https://github.com/mikepruett3/dotposh.git","$Env:UserProfile\dotposh" -Wait -NoNewWindow
@'
New-Item -Path $Env:UserProfile\Documents\WindowsPowerShell -ItemType Directory -ErrorAction Ignore
Remove-Item -Path $Env:UserProfile\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 -Force
New-Item -Path $Env:UserProfile\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1 -ItemType SymbolicLink -Target $Env:UserProfile\dotposh\profile.ps1
'@ > $Env:Temp\dotposh.ps1
Start-Process -FilePath "PowerShell" -ArgumentList "$Env:Temp\dotposh.ps1" -Verb RunAs -Wait -WindowStyle Hidden
Remove-Item -Path $Env:Temp\dotposh.ps1 -Force
@'
cd $Env:UserProfile\dotposh
git submodule init
git submodule update
'@ > $Env:Temp\submodule.ps1
Start-Process -FilePath "PowerShell" -ArgumentList "$Env:Temp\submodule.ps1" -Wait -NoNewWindow
Remove-Item -Path $Env:Temp\submodule.ps1 -Force
}
# Pin PowerShell to Taskbar
Write-Verbose -Message "Pin PowerShell to Taskbar..."
Start-Process -FilePath "PowerShell" -ArgumentList "syspin","'$Env:AppData\Microsoft\Windows\Start Menu\Programs\Windows PowerShell\Windows PowerShell.lnk'","c:5386" -Wait -NoNewWindow
# Install PowerShell 7
$PS7 = winget list --exact -q Microsoft.PowerShell
if (!$PS7) {
Write-Verbose -Message "Installing PowerShell 7..."
@'
iex "& { $(irm https://aka.ms/install-powershell.ps1) } -UseMSI -Quiet"
'@ > $Env:Temp\ps7.ps1
Start-Process -FilePath "PowerShell" -ArgumentList "$Env:Temp\ps7.ps1" -Verb RunAs -Wait -WindowStyle Hidden
Remove-Item -Path $Env:Temp\ps7.ps1 -Force
}
# Pin PowerShell 7 to Taskbar
Write-Verbose -Message "Pin PowerShell 7 to Taskbar..."
Start-Process -FilePath "PowerShell" -ArgumentList "syspin","'$Env:ProgramData\Microsoft\Windows\Start Menu\Programs\PowerShell\PowerShell 7 (x64).lnk'","c:5386" -Wait -NoNewWindow
# Remove unused Packages/Applications
Write-Verbose -Message "Removing Unused Applications..."
$RemoveApps = @(
"*3DPrint*",
"Microsoft.MixedReality.Portal")
foreach ($item in $RemoveApps) {
Remove-InstalledApp -Package $item
}
# Install Windows SubSystems for Linux
$wslInstalled = Get-Command "wsl" -CommandType Application -ErrorAction Ignore
if (!$wslInstalled) {
Write-Verbose -Message "Installing Windows SubSystems for Linux..."
Start-Process -FilePath "PowerShell" -ArgumentList "wsl","--install" -Verb RunAs -Wait -WindowStyle Hidden
}
Install-WinGetApp -PackageID Canonical.Ubuntu.2204
Write-Output "Install complete! Please reboot your machine/worksation!"
Start-Sleep -Seconds 10
@mikepruett3
Copy link
Author

mikepruett3 commented Apr 18, 2022

You can get and run the entire script on a new machine by invoking the following command.

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://gist.githubusercontent.com/mikepruett3/7ca6518051383ee14f9cf8ae63ba18a7/raw/shell-setup.ps1'))"

@Code-Quake
Copy link

Love the script, nice work.

@rscircus
Copy link

rscircus commented Aug 3, 2022

That's the most sophisticated automated setup I've seen so far for win64... Kudos.

@jimbrig
Copy link

jimbrig commented Dec 11, 2022

Very nice. Very nice indeed.

@riazul701
Copy link

Good script for software installation automation.

@leumasme
Copy link

Is there purpose behind which packages are installed from which package manager? I'd have assumed you're taking all from scoop and falling back to the others if scoop doesn't have them, but that doesn't seem to be the case as packages like starship,openjdk,chrome are available in scoop but installed from Winget instead.

@bgolinvaux
Copy link

This is an incredible resource to learn how to automate installations on Windows. Thanks a lot for sharing this, and Kudos!

@mikepruett3
Copy link
Author

Is there purpose behind which packages are installed from which package manager? I'd have assumed you're taking all from scoop and falling back to the others if scoop doesn't have them, but that doesn't seem to be the case as packages like starship,openjdk,chrome are available in scoop but installed from Winget instead.

So, when I originally made this script, most of the packages I used were from scoop or chocolatey. I did this because not everything I needed was in a scoop bucket. Since Microsoft made winget available, I have mostly been migrating any application installs to use that, over scoop and chocolatey.

So no, this script does not try one package installer first, and then go try the next for the same package. I am manually updating this gist with a curated collection of packages that I need/use over time. Hope that makes sense.

@mikepruett3
Copy link
Author

Thanks all. This gist started out as a bastardized tool for me to quickly provision my laptop or desktop after re-installing windows. (Especially my work laptop, as I keep getting a new one every year or so). Please feel free to use this as a start to your own setup script... as I am sure you probably do not need all of the packages that I use. Any improvements or suggestions are more than welcome! Thanks!

@ScarletLovell
Copy link

Hi Mike, I really really like the script you've created here, I've gone ahead and edited your script to have an JSON configurations, tests, and more settings. I was wondering if I could publish it to my own repository with your permission, of-course giving you credit on said repo for your original work.

@mikepruett3
Copy link
Author

Absolutely! Would love to have this be a lot more stable and easy to follow. I don't know what the License is for gists, but I am totally down with this being GPLv3 at least. Free as in beer for sure! Love to see what you come up with!

@ZYinMD
Copy link

ZYinMD commented Jan 27, 2023

Question, did you reinstall/reset your pc over and over just to test this script? If yes, what's the quickest way to reset?

@bgolinvaux
Copy link

@ZYinMD : you might want to test it in a virtual machine that you snapshot before executing the script. You can then restore it easily and tweak your script until you get this right. Here are some info https://learn.microsoft.com/en-us/virtualization/hyper-v-on-windows/user-guide/checkpoints

@mikepruett3
Copy link
Author

Question, did you reinstall/reset your pc over and over just to test this script? If yes, what's the quickest way to reset?

I have a few spare Windows Laptops lying around that I blow away the OS, and run the script on for testing. Honestly, a VM would probably be easier... but that's what I have been using for a while now.

@southisup
Copy link

Since Microsoft made winget available, I have mostly been migrating any application installs to use that

ExifTool is available via winget – although is there a reason you're locked at 12.41?

@mikepruett3
Copy link
Author

Since Microsoft made winget available, I have mostly been migrating any application installs to use that

ExifTool is available via winget – although is there a reason you're locked at 12.41?

Thanks for the heads up! Been a while since I have updated the script, but I have gone thru and switched out all of the scoop and custom install tasks with packages from winget.

@southisup
Copy link

southisup commented Aug 5, 2023

Thanks

Happy my own ultimately unsuccessful search for a way to winget Notepad++ without admin helped someone!

@mikepruett3
Copy link
Author

Thanks

Happy my own ultimately unsuccessful search for a way to winget Notepad++ without admin helped someone!

I replaced the existing sudo command from scoop, with gsudo from gerardog recently. This works in other shells beside powershell. Not sure if that helps or not, but you can always put the gsudo before the winget command.

@kdhndt
Copy link

kdhndt commented Aug 5, 2023

You can get and run the entire script on a new machine by invoking the following command.

PowerShell -NoProfile -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://gist.githubusercontent.com/mikepruett3/7ca6518051383ee14f9cf8ae63ba18a7/raw/shell-setup.ps1'))"

nice script :) do you run this as admin?

@southisup
Copy link

gsudo before the winget command

Many thanks for the idea, but sadly gsudo itself requires admin to install!

@GaussianWonder
Copy link

This looks really awesome. I haven't tried it myself yet, but one thing that could be really cool is a "manager" of package managers. This sounds overbloated, however I'd like my stuff to be maintable from one CLI tool. A script for searching packages over multiple sources and installing (or switching) between sources would be a nice addition in this regard.

Does something like this exist?

@mikepruett3
Copy link
Author

I usually just copy and paste the string into "run" from the start menu. I think on Windows 10 this automatically runs as Admin. I would try to run it that way.

@mikepruett3
Copy link
Author

Not to my knowledge. I use the scoop-tray tool from foosel for Updates to scoop packages and winget upgrade --recurse to keep the packages updated.

Maybe if I have some free time I can try and come up with something that searches all three for a package. Shouldn't be that hard, just need the cycles! 😄

@tinnted
Copy link

tinnted commented Sep 29, 2023

This looks sick, my current setup is to use as many portable apps as possible plus a detailed setup guide in one note but this looks very tempting. I don't think I can ever get rid of all portable apps like browsers because they have like 200 tabs spanned across tens of workspaces etc. If only all these tabs and stuff sync as well.

@Kamek437
Copy link

Kamek437 commented Oct 1, 2023

Your browser doesn't sync workspace tabs? Huh mine does just fine. 150 or so tabs open all the time synced across 6 computers all the time. Edge syncs it just fine what browser do you use?

@AdamsGH
Copy link

AdamsGH commented Dec 26, 2023

Really love your script, mate! Gonna use some functions in my further work, thanks!

@mikepruett3
Copy link
Author

This looks sick, my current setup is to use as many portable apps as possible plus a detailed setup guide in one note but this looks very tempting. I don't think I can ever get rid of all portable apps like browsers because they have like 200 tabs spanned across tens of workspaces etc. If only all these tabs and stuff sync as well.

So this script does install regular versions of applications as well... (mainly the winget tasks). I was a long-time user of scoop, but I found that it broke more often with the apps that I was using. Moving most of the apps I use on the regular to winget.

@mikepruett3
Copy link
Author

Really love your script, mate! Gonna use some functions in my further work, thanks!

Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment