Windows Setup

This post describes how to setup all the needed programms on a new computer:

<#
Script to install Various Programms
#>
#Check if Chocolatey is already installed, when not install it
function Install-Chocolatey {
    <# 
    .SYNOPSIS 
        Insure Chocolatey is installed 
    .DESCRIPTION 
        Check if Chocolatey is installed. If not, then install it. 
    .EXAMPLE 
        Install-Chocolatey 
    #>
        [CmdletBinding(SupportsShouldProcess = $True)]
        param ()
        $testchoco = powershell choco -v
        if(-not($testchoco)){
            Write-Output "Seems Chocolatey is not installed, installing now"
            Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
        }
        else{
            Write-Output "Chocolatey Version $testchoco is already installed"
        }
}
function UnInstall-Chocolatey {
    <# 
    .SYNOPSIS 
        IUnintstal chocolatey
    .DESCRIPTION 
        Check if Chocolatey is installed. If then uninstall it. 
    .EXAMPLE 
        UnInstall-Chocolatey 
    #>
        [CmdletBinding(SupportsShouldProcess = $True)]
        param ()
        $testchoco = powershell choco -v
        if(-not($testchoco)){
            Write-Output "Chocolatey is not installed"
        }
        else{
            $VerbosePreference = 'Continue'
if (-not $env:ChocolateyInstall) {
    $message = @(
        "The ChocolateyInstall environment variable was not found."
        "Chocolatey is not detected as installed. Nothing to do."
    ) -join "`n"

    Write-Warning $message
    return
}

if (-not (Test-Path $env:ChocolateyInstall)) {
    $message = @(
        "No Chocolatey installation detected at '$env:ChocolateyInstall'."
        "Nothing to do."
    ) -join "`n"

    Write-Warning $message
    return
}

<#
    Using the .NET registry calls is necessary here in order to preserve environment variables embedded in PATH values;
    Powershell's registry provider doesn't provide a method of preserving variable references, and we don't want to
    accidentally overwrite them with absolute path values. Where the registry allows us to see 
    entry, PowerShell's registry provider only sees "C:\Windows", for example.
#>
$userKey = [Microsoft.Win32.Registry]::CurrentUser.OpenSubKey('Environment')
$userPath = $userKey.GetValue('PATH', [string]::Empty, 'DoNotExpandEnvironmentNames').ToString()

$machineKey = [Microsoft.Win32.Registry]::LocalMachine.OpenSubKey('SYSTEM\ControlSet001\Control\Session Manager\Environment\')
$machinePath = $machineKey.GetValue('PATH', [string]::Empty, 'DoNotExpandEnvironmentNames').ToString()

$backupPATHs = @(
    "User PATH: $userPath"
    "Machine PATH: $machinePath"
)
$backupFile = "C:\PATH_backups_ChocolateyUninstall.txt"
$backupPATHs | Set-Content -Path $backupFile -Encoding UTF8 -Force

$warningMessage = @"
    This could cause issues after reboot where nothing is found if something goes wrong.
    In that case, look at the backup file for the original PATH values in '$backupFile'.
"@

if ($userPath -like "*$env:ChocolateyInstall*") {
    Write-Verbose "Chocolatey Install location found in User Path. Removing..."
    Write-Warning $warningMessage

    $newUserPATH = @(
        $userPath -split [System.IO.Path]::PathSeparator |
            Where-Object { $_ -and $_ -ne "$env:ChocolateyInstall\bin" }
    ) -join [System.IO.Path]::PathSeparator

    # NEVER use [Environment]::SetEnvironmentVariable() for PATH values; see https://github.com/dotnet/corefx/issues/36449
    # This issue exists in ALL released versions of .NET and .NET Core as of 12/19/2019
    $userKey.SetValue('PATH', $newUserPATH, 'ExpandString')
}

if ($machinePath -like "*$env:ChocolateyInstall*") {
    Write-Verbose "Chocolatey Install location found in Machine Path. Removing..."
    Write-Warning $warningMessage

    $newMachinePATH = @(
        $machinePath -split [System.IO.Path]::PathSeparator |
            Where-Object { $_ -and $_ -ne "$env:ChocolateyInstall\bin" }
    ) -join [System.IO.Path]::PathSeparator

    # NEVER use [Environment]::SetEnvironmentVariable() for PATH values; see https://github.com/dotnet/corefx/issues/36449
    # This issue exists in ALL released versions of .NET and .NET Core as of 12/19/2019
    $machineKey.SetValue('PATH', $newMachinePATH, 'ExpandString')
}

# Adapt for any services running in subfolders of ChocolateyInstall
$agentService = Get-Service -Name chocolatey-agent -ErrorAction SilentlyContinue
if ($agentService -and $agentService.Status -eq 'Running') {
    $agentService.Stop()
}
# TODO: add other services here

Remove-Item -Path $env:ChocolateyInstall -Recurse -Force -WhatIf

'ChocolateyInstall', 'ChocolateyLastPathUpdate' | ForEach-Object {
    foreach ($scope in 'User', 'Machine') {
        [Environment]::SetEnvironmentVariable($_, [string]::Empty, $scope)
    }
}

$machineKey.Close()
$userKey.Close()



            if ($env:ChocolateyToolsLocation -and (Test-Path $env:ChocolateyToolsLocation)) {
                Remove-Item -Path $env:ChocolateyToolsLocation -WhatIf -Recurse -Force
            }
            
            foreach ($scope in 'User', 'Machine') {
                [Environment]::SetEnvironmentVariable('ChocolateyToolsLocation', [string]::Empty, $scope)
            }
        }
}

Install-Chocolatey
#Install the different apps
Write-Output "Installing apps"
#The following command this makes sure that we do not always have to type in yes (https://stackoverflow.com/questions/29873439/how-do-i-update-all-chocolatey-applications-without-confirmation)
choco feature enable -n=allowGlobalConfirmation
choco install adobereader
choco install anki
choco install beyondcompare
choco install drawio
choco install dropbox
choco install Firefox --params "/NoTaskbarShortcut /NoDesktopShortcut"
choco install foxitreader
choco install git
choco install gnucash
choco install littlebigmouse
choco install logitech-options
choco install logitechgaming
choco install miktex
choco install miniconda3
choco install mobaxterm #Used to make a remote connection to OST server
choco install nextcloud-client
choco install obs-studio.install
choco install obs-virtualcam
choco install putty.install
choco install texstudio
choco install vscode --params "/NoDesktopIcon /NoQuicklaunchIcon"
choco install vscode-codespellchecker
choco install vscode-powershell
choco install vscode-python
choco install whatsapp
choco install winrar
choco install winscp

Leave a Reply