########## # Win 10 / Server 2016 / Server 2019 Initial Setup Script - Main execution loop # Author: Disassembler # Version: v3.10, 2020-07-15 # Modded by: Michael Reber # Source: https://github.com/Disassembler0/Win10-Initial-Setup-Script ########## # Relaunch the script with administrator privileges Function RequireAdmin { If (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]"Administrator")) { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`" $PSCommandArgs" -Verb RunAs Exit } } $tweaks = @() $PSCommandArgs = @() Function AddOrRemoveTweak($tweak) { If ($tweak[0] -eq "!") { # If the name starts with exclamation mark (!), exclude the tweak from selection $script:tweaks = $script:tweaks | Where-Object { $_ -ne $tweak.Substring(1) } } ElseIf ($tweak -ne "") { # Otherwise add the tweak $script:tweaks += $tweak } } # Parse and resolve paths in passed arguments $i = 0 While ($i -lt $args.Length) { If ($args[$i].ToLower() -eq "-include") { # Resolve full path to the included file $include = Resolve-Path $args[++$i] -ErrorAction Stop $PSCommandArgs += "-include `"$include`"" # Import the included file as a module Import-Module -Name $include -ErrorAction Stop } ElseIf ($args[$i].ToLower() -eq "-preset") { # Resolve full path to the preset file $preset = Resolve-Path $args[++$i] -ErrorAction Stop $PSCommandArgs += "-preset `"$preset`"" # Load tweak names from the preset file Get-Content $preset -ErrorAction Stop | ForEach-Object { AddOrRemoveTweak($_.Split("#")[0].Trim()) } } ElseIf ($args[$i].ToLower() -eq "-log") { # Resolve full path to the output file $log = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($args[++$i]) $PSCommandArgs += "-log `"$log`"" # Record session to the output file Start-Transcript $log } Else { $PSCommandArgs += $args[$i] # Load tweak names from command line AddOrRemoveTweak($args[$i]) } $i++ } # Call the desired tweak functions $tweaks | ForEach-Object { Invoke-Expression $_ }