A PowerShell module that allows you to easily create a terse re-pave script for a Windows Machine making heavy use of Chocolatey.
It focusses on speed and idempotency allowing you to add to the script as you go about the business of adding software to your machine. That way when it comes time to do the next repave it's good to go rather than having to spend half a day figuring out the missing software. If something is already installed then it will immediately skip it rather than invoking cinst to find out meaning the script should fly through to the end if you are simply adding a new installation at the bottom.
Furthermore, if something goes wrong at any point then it will fail fast and it will store an installation log for you so you can review what it did.
Look at robdmoore.ps1 or MattDavies.ps1 for examples of how to use the scripts. These are the scripts that we actually use for our machines.
Feel free to fork this and add your own script. Also feel free to send pull requests or raise issues if you have ideas / questions.
Get us via Twitter at: @robdmoore / @mdaviesnet.
To get started all you need is this in a .ps1 file:
Import-Module "$(Split-Path $MyInvocation.MyCommand.Path)\repave.psm1" -Force
Invoke-Repave {
# Stuff to install
}When you run it you must be in admin mode and after running there will be an repave.log file with the output and a todo.txt file with items for further action (unless you ran the script from PowerShell ISE, in which case there is no repave.log).
Invokes $script as a code block after setting up and shutting down the repave environment before and after it respectively.
Setting up the environment involves:
- Writing an error and exiting with non-zero exit code if the script is not executed with admin privileges
- Invoking
Start-Script(see below) - Creating a try block
- Creating an
Installersdirectory if it doesn't already exist (used as a cache for installers that are downloaded) - If the user is running in PowerShell ISE then outputting a warning that there will be no transcript
- If the user is not running in PowerShell ISE then starting a transcript for
repave.login append mode (i.e. subsequent runs will append to the log) - Invoking
Install-Chocolatey(see below) - Invoking
Install-WebPI(see below)
- Creating an
Shutting down the environment involves:
- Write a warning to remind the user to clear the temp path
- If a transcript is running then stop it
- Catch any exceptions and:
- Write an error
- If a transcript is running then stop it
- Exit with non-zero exit code
- Gets the path of the
.ps1script being executed and saves it to a global variable called$scriptpath; you can use this variable from your scripts - Changes directory to
$scriptpathso any local file references will be local to the script no matter what the working directory was when the script was first executed - Sets
$ErrorActionPreferencetostopso any errors will cause an exception to throw and the repave script to early exit- There is currently a bug where problems in programs that are executed (e.g.
cinst) don't propagate out
- There is currently a bug where problems in programs that are executed (e.g.
Install Chocolatey if not already installed (and record which Chocolatey packages were installed when the script was first run so it can detect if it should invoke cinst when installing packages - this is a huge speed boost on subsequent script runs).
Install web platform installer commandline. Note: Won't work unless .NET 3.5 is installed on the machine.
Returns the value of the global $scriptpath variable setup by Start-Script / Invoke-Repave.
Returns $true if running with admin priviliges.
Returns $true if running in a Virtual Machine.
Sets "Show Hidden Files", "Show File Extensions" and "Show System Files" in Windows Explorer.
Securely prompts for a password and installs the given $pfx file to CurrentUser\My and the given $rootPfx file to CurrentUser\TrustedPeople using the given password for both certs.
Downloads Intel Rapid Storage Technology (RST) to Installers\SetupRST.exe unless it's already there and then runs it and outputs a warning to download trimcheck.exe to check if TRIM is enabled for the HDD.
Note: This install isn't unattended - you have to click through the setup. If you know a way of making it unattended that let us know.
Install of:
- msysgit
- TortoiseGit
- poshgit
C:\Program Files (x86)\Git\binin%PATH%- Copying the
.sshfolder (if present relative to the script) to~if not already there- If it is present then TortoiseGit is configured to use
ssh.exerather thanPLink.exe
- If it is present then TortoiseGit is configured to use
- Copying the
.gitconfigfile (if present relative to the script) to~if not already there
Installs IIS using Windows Features.
Installs Web Deploy 3.5 using WebPI.
Installs Visual Studio 2013 using Chocolatey.
$product can be one of "ExpressWeb", "Professional" (default), "Premium" or "Ultimate".
$features is a space delimited string of features to install, default is "WebTools SQL Win8SDK Win81SDK WindowsPhone80 WindowsPhone81 OfficeDeveloperTools Blend LightSwitch".
$onInstall is an optional code block to execute if Visual Studio is being installed.
Installs Visual Studio 2013 using the given .iso file.
$onInstall is an optional code block to execute if Visual Studio is being installed.
Copies the given packages.config file to %APPDATA%\JetBrains\ReSharper\vAny if not already there so that next time you bring up the ReSharper Extension Manager you can click Restore to restore the packages. It will output a warning to remind you to do that.
Installs Windows Azure SDK 2.3, Windows Azure 2.3 Tools for Visual Studio 2013 and the Windows Azure PowerShell commandlets all using WebPI.
Currently, this doesn't work because the latest version of webpicmd is needed, but it fails due to path issues. If you manually install webpicmd as the latest version and fix the path issues then you can run this successfully.
Installs Office 2013 using the given .iso and .msp files. Generate a .msp by mounting the iso and invoking setup.exe /admin.
Copies the given Signatures folder to "%APPDATA%\Microsoft\Signatures" if not already there.
Reloads the %PATH% and appends the given path to the end of it if it's not already in there.
Sets the appropriate registry entry for TortoiseGit to use C:\Program Files (x86)\Git\bin\ssh.exe as the SSH client.
Pins the given $exe inside of the given $path to the taskbar.
Pins Chrome to the taskbar.
Pins Outlook 2013 to the taskbar.
Pins Visual Studio 2013 to the taskbar.
Pins Linqpad4 to the taskbar.
Pins Lync 2013 to the taskbar.
Pins OneNote 2013 to the taskbar.
Pins MSTSC (RDP client) to the taskbar.
Pins SQL Server 2014 Management Studio to the taskbar.
Pins SQL Server 2014 Profiler to the taskbar.
Pins Paint.NET to the taskbar.
Downloads and installs the given VSIX to Visual Studio. Note: this is not idempotent since there is no way to tell if an extension is installed (if you know how let us know!). Recommendation is that this is done using the $onInstall parameter to the commands to install Visual Studio (see above).
Installs the given Chocolatey package if it's not already installed. Optionally pass -InstallArgs to add extra Chocolatey installation arguments or -RunIfInstalled to run some code if the given package is being installed.
Copies the given iTunes folder to "~\Music" if not already there.
Downloads Azure Management Studio installer to Installers\AzureManagementStudio.exe unless it's already there and then runs it.
Note: the download doesn't seem to currently work and the installer requires you to click on it - it's not quiet. If anyone knows how to fix this let us know.
Installs Hyper-V from Windows Features.
If you have downloaded SQLEXPRWT_x64_ENU.exe and extracted it to Installers\SQLEXPRWT_x64_ENU\ then it will install SQL Server Express 2014 and SQL Server Management Studio from that location.
Writes a warning of $message and appends that message to todo.txt.
Adds a favourite link in Windows Explorer with the given name pointing to the given folder location.