Win10-Initial-Setup-Script/Win10.ps1

##########
# Win 10 / Server 2016 / Server 2019 Initial Setup Script - Main execution loop
# Author: Disassembler <disassembler@dasm.cz>
# Version: v3.10, 2020-07-15
# Source: https://github.com/Disassembler0/Win10-Initial-Setup-Script
##########

$ErrorActionPreference = "Inquire"

# 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 $_ }