Skip to content

Instantly share code, notes, and snippets.

@techthoughts2

techthoughts2/ws_setup.ps1

Last active May 13, 2021
Embed
What would you like to do?
This PowerShell script will setup a fresh workstation with everything needed to sucessfully work and be a DevOps Master day-to-day.
#region installs
# basic choco installs
$script:chocoInstalls = @(
# 'ytmdesktop' #https://github.com/ytmdesktop/ytmdesktop/issues/563
'vscode' # visual studio code
'powershell-core' # powershell 7+
'python' # python
'cacher' # code snippet organizer
'winscp' # Open source free SFTP client, SCP client, FTPS client and FTP client
'telegram' # Cloud-based synchronized messaging app with a focus on speed and security
'grepwin' # powerful and fast search tool using regular expressions.
'notepadplusplus' # source code editor and Notepad replacement
'firefox' # firefox browser
'googlechrome' # chrome browser
'7zip' # file archiver with good compression ratio
'git' # git for windows
'foxitreader' # pdf client
'paint.net' # photo editor
)
# choco azure installs
$script:chocoInstallsAzure = @(
'azure-cli' # cli for azure
'AzureStorageExplorer' # the azure storage explorer
'azure-functions-core-tools' # core tool set for local dev of azure functions
'azcopy10' # azure copy tool
'bicep' # bicep cli
)
# choco aws installs
$script:chocoInstallsAWS = @(
'aws-vault' # A tool to securely store and access AWS credentials in a development environment
'awscli' # aws cli
)
# a list of useful Azure PowerShell modules
$script:azureModules = @(
'Az' # standard Azure modules
'AzureDevOps' # interact with the Azure DevOps REST API.
'AzurePipelinesPS' # makes interfacing with Azure Pipelines a bit easier.
'CosmosDB' # provides cmdlets for working with Azure Cosmos DB.
'PSArm' # experimental DSL for ARM templates (based on bicep)
'Bicep' # enable the features provided by the Bicep CLI in PowerShell.
)
# a list of useful AWS PowerShell modules
$script:awsModules = @(
'AWS.Tools.Common'
'AWS.Tools.CloudWatch'
'AWS.Tools.CostExplorer'
'AWS.Tools.S3'
'AWS.Tools.SecretsManager'
'AWS.Tools.SecurityToken'
'AWS.Tools.SQS'
'AWSLambdaPSCore'
)
# a list of useful Core PowerShell modules
$script:modules = @(
@{
ModuleName = 'Pester'
Version = '4.10.1'
}
@{
ModuleName = 'platyPS'
Version = '0.12.0'
}
@{
ModuleName = 'Catesta'
Version = 'Latest'
}
@{
ModuleName = 'Diag-V'
Version = 'Latest'
}
@{
ModuleName = 'PSWordCloud'
Version = 'Latest'
}
@{
ModuleName = 'posh-git'
Version = 'Latest'
}
@{
ModuleName = 'oh-my-posh'
Version = 'Latest'
}
@{
ModuleName = 'InvokeBuild'
Version = 'Latest'
}
@{
ModuleName = 'PSScriptAnalyzer'
Version = 'Latest'
}
@{
ModuleName = 'Convert'
Version = 'Latest'
}
@{
ModuleName = 'PoshGram'
Version = 'Latest'
}
@{
ModuleName = 'Terminal-Icons'
Version = 'Latest'
}
@{
ModuleName = 'PSReadline'
Version = '2.2.0-beta2'
}
)
# python VSCode extensions
$script:vscodeExtensionsPython = @(
'ms-python.python' #python
'almenon.arepl' #AREPL automatically evaluates python code in real-time as you type.
'formulahendry.code-runner' #Run code snippet or code file for multiple languages:
'ms-toolsai.jupyter' #basic notebook support for language kernels
'ms-python.vscode-pylance' #Fast, feature-rich language support for Python
'njpwerner.autodocstring' #quickly generate docstrings for python functions.
)
# aws VSCode extensions
$script:vscodeExtensionsAWS = @(
'amazonwebservices.aws-toolkit-vscode' #AWS Toolkit is an extension for Visual Studio Code that enables you to interact with Amazon Web Services (AWS).
'DanielThielking.aws-cloudformation-yaml' #This extension adds some snippets to YAML based files for AWS CloudFormation.
'aws-scripting-guy.cform' #CloudFormation support
'kddejong.vscode-cfn-lint' #VS Code CloudFormation Linter uses cfn-lint to lint your CloudFormation templates.
)
# azure VSCode extensions
$script:vscodeExtensionsAzure = @(
'ms-dotnettools.vscode-dotnet-runtime' #.NET Install Tool for Extension Authors - dependency
'ms-vscode.azure-account' #The Azure Account extension provides a single Azure sign-in
'ms-vscode.azurecli' #Scrapbooks for developing and running commands with the Azure CLI.
'ms-azuretools.vscode-azureresourcegroups' #View and manage Azure resources directly from VS Code.
'ms-azuretools.vscode-azurefunctions' #Use the Azure Functions extension to quickly create, debug, manage, and deploy serverless apps directly from VS Code.
'msazurermtools.azurerm-vscode-tools' #The Azure Resource Manager (ARM) Tools for Visual Studio Code
'ms-azuretools.vscode-bicep' #Bicep language support
)
# core VSCode extensions
$script:vscodeExtensions = @(
'redhat.vscode-yaml' #Provides comprehensive YAML Language support - dependency
'aaron-bond.better-comments' #The Better Comments extension will help you create more human-friendly comments in your code.
'CoenraadS.bracket-pair-colorizer-2' #This extension allows matching brackets to be identified with colours.
'ms-dotnettools.csharp' #Welcome to the C# extension for Visual Studio Code!
'streetsidesoftware.code-spell-checker' #A basic spell checker that works well with camelCase code.
'ryanluker.vscode-coverage-gutters' #codecoverage indicator
'vangware.dark-plus-material' #theme
'hediet.vscode-drawio' #This unofficial extension integrates Draw.io
'usernamehw.errorlens' #ErrorLens turbo-charges language diagnostic features by making diagnostics stand out more prominently
'wmontalvo.vsc-jsonsnippets' #Makes writing key-value code (like JSON) fluent, with a simple set of snippets
'eamodio.gitlens' #GitLens supercharges the Git capabilities
'oderwat.indent-rainbow' #make indentation more readable
'SirTori.indenticator' #Visually highlights the current indent depth.
'tuxtina.json2yaml' #Uses js-yaml to do the actual conversion json to yaml and vice-versa.
'ritwickdey.LiveServer' #go live
'emilast.LogFileHighlighter' #Adds color highlighting to log files
'yzhang.markdown-all-in-one' #All you need for Markdown
'shd101wyy.markdown-preview-enhanced' #Markdown Preview Enhanced
'DavidAnson.vscode-markdownlint' #Markdown/CommonMark linting and style checking
'PKief.material-icon-theme' #material icon theme for icons
'ryu1kn.partial-diff' #You can compare (diff) text selections within a file, across different files, or to the clipboard
'ms-vscode.powershell' #PowerShell!
'nobuhito.printcode' #adds print to VSCode
'mechatroner.rainbow-csv' #Highlight columns in comma (.csv), tab (.tsv), semicolon and pipe
'Tyriar.shell-launcher' #Easily launch multiple shell configurations in the terminal.
'vincentkos.snippet-creator' #helps to automate snippet creation
'DotJoshJohnson.xml' #xml tools
'alexey-strakh.stackoverflow-search' #search stackoverflow direct from vscode
)
#endregion
#region paths
$script:tempPath = -join ($env:TEMP, '\ws_setup')
$script:vscodeSettingsPath = -join ($env:APPDATA, '\Code\User')
$script:vscodeSnippetsPath = -join ($env:APPDATA, '\Code\User\snippets')
$script:windowsTerminalSettingsPath = -join ($env:LOCALAPPDATA, '\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\LocalState')
$script:windowsTerminalBackgroundPath = -join ($env:LOCALAPPDATA, '\Packages\Microsoft.WindowsTerminal_8wekyb3d8bbwe\RoamingState')
$script:profilePath = -join ($env:USERPROFILE, '\Documents\PowerShell')
$script:ohmyposhSettings = $env:USERPROFILE
#endregion
#region content locations
$gistUrl = "https://api.github.com/gists/a208d2bd924691bae7ec7904cab0bd8e"
$script:psProfile = 'https://api.github.com/gists/2b4d8e590a7fa41f32a76013df664020'
$script:vsCodeSettingsJSON = 'https://api.github.com/gists/d0997337224510743e2072dc5c343363' #settings.json
$script:vsCodePythonSnippetsJSON = 'https://api.github.com/gists/042b2b47e7a94c1a5a2bc79439a4fb81' #vscode_python_snippets.json
$script:vsCodePowerShellSnippetsJSON = 'https://api.github.com/gists/9ec91ab0ca26f96cf7ca4842053fa8fb' #vscode_ps_snippets.json
$script:windowsTerminalSettingsJSON = 'https://api.github.com/gists/df416a8df55c6c4009c9dcd337d4c8cf' #settings.json
$script:ohmyposhJSON = 'https://api.github.com/gists/da99b8255a8ca720430d188f649a9bd7' #.jake.omp.json
$script:setupFiles = 'https://tt-ws.s3-us-west-2.amazonaws.com/ws.zip' #zip containing background images and fonts
#endregion
#region supporting functions
<#
.SYNOPSIS
Evaluates if chocolatey is installed
#>
function Test-Choco {
[CmdletBinding()]
param (
)
$result = $true #assume the best
$testchoco = powershell -noprofile choco -v
if ($testchoco -like "*.*.*") {
Write-Verbose -Message "Chocolatey Version: $testchoco"
}
else {
Write-Verbose -Message "Chocolatey is not installed."
$result = $false
}
return $result
} #Test-Choco
<#
.SYNOPSIS
Installs chocolatey
#>
function Install-Choco {
[CmdletBinding()]
param (
)
Write-Verbose -Message 'Installing Chocolately...'
Write-Verbose -Message 'Setting execution and security settings...'
Set-ExecutionPolicy Bypass -Scope Process -Force
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072
try {
Write-Verbose -Message 'Downloading and installing...'
Invoke-WebRequest https://chocolatey.org/install.ps1 -UseBasicParsing -ErrorAction Stop | Invoke-Expression -ErrorAction Stop
Write-Verbose -Message 'INSTALL COMPLETE.'
}
catch {
Write-Error $_
}
} #InstallChoco
<#
.SYNOPSIS
Installs Azure related PowerShell modules
#>
function Install-HelpfulAzureModules {
[CmdletBinding()]
param (
)
Write-Verbose -Message 'Evaluating Azure modules...'
foreach ($module in $script:azureModules) {
Write-Verbose -Message (' {0} evaluating...' -f $module)
if (-not (Get-Module $module -ListAvailable)) {
if ($module -eq 'PSArm') {
Write-Verbose -Message (' Installing {0}' -f $module)
Install-Module -Name $module -Scope CurrentUser -Repository PSGallery -AllowPrerelease -Force -AllowClobber
}
else {
Write-Verbose -Message (' Installing {0}' -f $module)
Install-Module -Name $module -Scope CurrentUser -Repository PSGallery -Force
}
}
else {
Write-Verbose -Message (' {0} VERIFIED. NO ACTION TAKEN.' -f $module)
}
}
} #Install-HelpfulAzureModules
<#
.SYNOPSIS
Installs Core PowerShell modules
#>
function Install-BaseModules {
[CmdletBinding()]
param (
)
Write-Verbose -Message 'Evaluating modules...'
foreach ($module in $script:modules) {
Write-Verbose -Message (' {0} evaluating...' -f $module.ModuleName)
if ($module.Version -like "*beta*") {
Write-Verbose -Message (' {0} version check...' -f $module.Version)
$moduleEval = Get-InstalledModule -Name $module.ModuleName -RequiredVersion $module.Version -AllowPrerelease -ErrorAction SilentlyContinue
}
elseif ($module.Version -ne 'Latest') {
Write-Verbose -Message (' {0} version check...' -f $module.Version)
$moduleEval = Get-InstalledModule -Name $module.ModuleName -RequiredVersion $module.Version -ErrorAction SilentlyContinue
}
else {
$moduleEval = Get-Module -Name $module.ModuleName -ListAvailable -ErrorAction SilentlyContinue
}
if (-not $moduleEval) {
if ($module.Version -like "*beta*") {
Write-Verbose -Message (' Installing {0} - {1}' -f $module.ModuleName, $module.Version)
Install-Module -Name $module.ModuleName -Scope CurrentUser -Repository PSGallery -RequiredVersion $module.Version -Force -AllowPrerelease
}
elseif ($module.Version -ne 'Latest') {
Write-Verbose -Message (' Installing {0} - {1}' -f $module.ModuleName, $module.Version)
Install-Module -Name $module.ModuleName -Scope CurrentUser -Repository PSGallery -RequiredVersion $module.Version -Force
}
else {
Write-Verbose -Message (' Installing {0}' -f $module.ModuleName)
Install-Module -Name $module.ModuleName -Scope CurrentUser -Repository PSGallery -Force
}
}
else {
Write-Verbose -Message (' {0} VERIFIED. NO ACTION TAKEN.' -f $module.ModuleName)
}
}
} #Install-BaseModules
<#
.SYNOPSIS
Installs VSCode extension
#>
function Install-VSCodeExtension {
[CmdletBinding()]
param (
[string[]]$ExtensionList
)
foreach ($Extension in $ExtensionList) {
Write-Verbose -Message "Installing $Extension ..."
code --install-extension $Extension
}
}
<#
.SYNOPSIS
Evaluates if a package is installed with choco
#>
function Test-ChocoInstall {
[CmdletBinding()]
param (
# choco package to be checked for
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string]$ChocoPackage
)
$result = $true #assume the best
$eval = $null
Write-Verbose -Message "Checking for $ChocoPackage..."
$eval = powershell -noprofile choco list --localonly $ChocoPackage
if ($eval -match $ChocoPackage) {
Write-Verbose -Message 'Package VERIFIED.'
}
else {
Write-Verbose -Message 'Package NOT FOUND'
$result = $false
}
return $result
} #Test-ChocoInstall
<#
.SYNOPSIS
Install choco package
#>
function Install-ChocoPackage {
[CmdletBinding()]
param (
# choco package to be installed
[Parameter(Mandatory = $true)]
[ValidateNotNullOrEmpty()]
[string]$ChocoPackage
)
Write-Verbose -Message ('Choco installing - {0}' -f $ChocoPackage)
powershell -noprofile choco install $ChocoPackage -y
} #Install-ChocoPackage
<#
.SYNOPSIS
Evaluates if workstation setup files are present. If not downloads and unzips.
#>
function Get-WSSetupFiles {
[CmdletBinding()]
param (
)
$wsFilesPath = -join ($script:tempPath, '\ws_files')
Write-Verbose -Message "Evaluating if $wsFilesPath is present..."
if (-not (Test-Path $wsFilesPath)) {
Write-Verbose -Message ' Downloading workstation setup files...'
try {
$invokeSplat = @{
Uri = $script:setupFiles
OutFile = "$script:tempPath\ws.zip"
ErrorAction = 'Stop'
}
Invoke-WebRequest @invokeSplat
Write-Verbose -Message ' Download complete.'
}
catch {
Write-Error $_
return
}
try {
Write-Verbose -Message ' Expanding zip download...'
$expandSplat = @{
LiteralPath = "$script:tempPath\ws.zip"
DestinationPath = $wsFilesPath
ErrorAction = 'Stop'
}
Expand-Archive @expandSplat
Write-Verbose -Message ' UNZIPPED!'
}
catch {
Write-Error $_
return
}
}
else {
Write-Verbose -Message " VERIFIED. No action taken."
}
} #Get-WSSetupFiles
<#
.SYNOPSIS
Retrieves settings files from github and places in appropriate locations
#>
function Set-SettingsFiles {
[CmdletBinding()]
param (
)
$settings = @(
@{
Name = 'VSCode Settings'
URI = $script:vsCodeSettingsJSON
File = -join ($script:vscodeSettingsPath, '\settings.json')
}
@{
Name = 'VSCode Python Snippets'
URI = $script:vsCodePythonSnippetsJSON
File = -join ($script:vscodeSnippetsPath, '\python.json')
}
@{
Name = 'VSCode PowerShell Snippets'
URI = $script:vsCodePowerShellSnippetsJSON
File = -join ($script:vscodeSnippetsPath, '\powershell.json')
}
@{
Name = 'Windows Terminal Settings'
URI = $script:windowsTerminalSettingsJSON
File = -join ($script:windowsTerminalSettingsPath, '\settings.json')
}
@{
Name = 'oh-my-posh Settings'
URI = $script:ohmyposhJSON
File = -join ($script:ohmyposhSettings, '\.jake.omp.json')
}
@{
Name = 'PowerShell profile'
URI = $script:psProfile
File = -join ($script:profilePath, '\profile.ps1')
}
)
foreach ($setting in $settings) {
Start-Sleep -Milliseconds 500
Write-Verbose -Message ('Downloading {0} to {1}' -f $setting.Name, $setting.File)
$gistUrl = $null
$fileName = $null
$gistContent = $null
$gistUrl = $setting.URI
$fileName = Split-Path $setting.File -leaf
# $path = 'C:\rs-pkgs\settings'
try {
$invokeSplat = @{
Uri = $gistUrl
ErrorAction = 'Stop'
}
$gist = Invoke-RestMethod @invokeSplat
$gistContent = $gist.Files.$fileName.Content
Write-Verbose -Message ' Download COMPLETED.'
}
catch {
Write-Error $_
continue
}
try {
Write-Verbose -Message ' Writing out content...'
$setContentSplat = @{
# Path = "$path\$fileName"
Path = $setting.File
Value = $gistContent
Confirm = $false
Force = $true
ErrorAction = 'Stop'
}
Set-Content @setContentSplat
Write-Verbose -Message ' Setting applied!'
}
catch {
Write-Error $_
continue
}
}
} #Set-SettingsFiles
<#
.SYNOPSIS
Installs all specified fonts in fonts folder
#>
function Install-Fonts {
[CmdletBinding()]
param (
)
Write-Verbose -Message 'Starting fonts installation...'
$wsFilesPath = -join ($script:tempPath, '\ws_files\ws')
$fontPath = -join ($script:tempPath, '\ws_files\ws\Fonts\Fonts')
Write-Verbose -Message ' Getting required fonts to install...'
. $wsFilesPath\Fonts\PS_Font_Scripts\Add-Font.ps1 -Path $fontPath
} #Install-Fonts
<#
.SYNOPSIS
Copies all background images for Windows terminal
#>
function Set-BackImages {
[CmdletBinding()]
param (
)
Write-Verbose -Message 'Starting Windows Terminal background files copy...'
$wsFilesPath = -join ($script:tempPath, '\ws_files\ws\backs')
Write-Verbose -Message ' Getting required backgrounds...'
$allBackgrounds = Get-ChildItem -Path $wsFilesPath
foreach ($background in $allBackgrounds) {
$testPath = -join ($script:windowsTerminalBackgroundPath, '\', $background.Name)
Write-Verbose -Message (' Evaluating - {0}' -f $background.FullName)
if (-not (Test-Path $testPath)) {
Write-Verbose -Message ' NOT found. Copying.'
Copy-Item -Path $background.FullName -Destination $testPath
}
else {
Write-Verbose -Message ' FOUND. No action taken.'
}
}
} #Set-BackImages
function Set-PathVariables {
[CmdletBinding()]
param (
)
$pathsToAdd = @(
'C:\Program Files (x86)\Microsoft SDKs\Azure\Storage Emulator'
'C:\Program Files (x86)\Microsoft SDKs\Azure\Azcopy'
)
Write-Verbose -Message 'Backing up curent paths to file...'
$fileName = -join ('path_', (Get-Date -format yyyy-MM-ddTHH-mm-ss-ff), '.txt')
[System.Environment]::GetEnvironmentVariable('PATH', 'machine') | Out-File "$script:tempPath\$fileName" -Force
Write-Verbose -Message 'Evaluating if current paths present...'
$paths = ($env:PATH).split(";")
foreach ($pathAdd in $pathsToAdd) {
$eval = $false
foreach ($path in $paths) {
if ($path -eq $pathAdd) {
$eval = $true
Write-Verbose -Message ( '{0} Found!' -f $pathAdd)
}
}
if ($eval -eq $false) {
Write-Verbose -Message ( '{0} NOT Found! Adding...' -f $pathAdd)
$oldPath = [System.Environment]::GetEnvironmentVariable('PATH', 'machine')
$newPath = "$OLDPATH;$pathAdd"
[Environment]::SetEnvironmentVariable("PATH", "$NEWPATH", "Machine")
}
else {
Write-Verbose -Message ' No Action taken'
}
}
} #Set-PathVariables
#endregion
#region main
<#
.SYNOPSIS
Sets up a new workstation for desired development configuration
.DESCRIPTION
Downloads files, settings, and configurations to set new workstation to desired development setup and config.
.EXAMPLE
Invoke-WSSetup
Configures workstation to base level dev configuration.
.EXAMPLE
Invoke-WSSetup -Python -AWS -Azure -Fonts
Configures workstation to base level dev configuration. Also adds fonts, python, aws, and azure utilities.
.PARAMETER Python
If specified installs additional Python utilities and settings
.PARAMETER AWS
If specified installs additional AWS utilities and settings
.PARAMETER Azure
If specified installs additional Azure utilities and settings
.PARAMETER Fonts
If specified installs downloaded Nerd font packages
.NOTES
What does this actually do?
It downloads a package config zip that contains:
- Various Nerd fonts
- Background photos for Windows Terminal
Installs choco if required
Installs base level things like VSCode via choco
Downloads configuration from GitHub gists and applies to proper locations:
- Configures VSCode with desired configurations
- Populates VSCode snippets
- Sets oh-my-posh theme configuration
- Configures Windows Terminal with desired configurations
- Sets PowerShell profile.ps1
Installs base level desired PowerShell modules
Install desired VSCode extensions
Installs tech specific utilities/configs/extensions based on specified switches
#>
function Invoke-WSSetup {
[CmdletBinding()]
param (
[switch]$Python,
[switch]$AWS,
[switch]$Azure,
[switch]$Fonts
)
$ProgressPreference = 'SilentlyContinue'
# set-up the temp dir if required
Write-Verbose -Message 'Verifying temp dir...'
if (-not (Test-Path $script:tempPath)) {
Write-Verbose -Message ' CREATING temp dir.'
New-Item -Path $script:tempPath -ItemType Directory -Force
}
else {
Write-Verbose -Message ' VERIFIED Temp.'
}
# make sure we have the workstation setup files
Get-WSSetupFiles
# verify chocolatey is installed
if (-not (Test-Choco)) {
Install-Choco
}
# install our base choco packages
foreach ($package in $script:chocoInstalls) {
if (-not (Test-ChocoInstall -ChocoPackage $package)) {
Install-ChocoPackage -ChocoPackage $package
}
}
# temp add vscode path:
$env:Path += ";C:\Program Files\Microsoft VS Code\bin"
# create snippets path if not created
if (-not (Test-Path $script:vscodeSnippetsPath)) {
New-Item -Path $script:vscodeSnippetsPath -ItemType Directory -Force
}
# install our base PowerShell modules
Install-BaseModules
# install VSCode extensions
Install-VSCodeExtension -ExtensionList $script:vscodeExtensionsPython
# download and place our settings files
Set-SettingsFiles
# copy Windows Terminal background images to proper location
Set-BackImages
# installs fonts if font switch specified
if ($fonts) {
Install-Fonts
}
# installs azure resources if azure switch is specified
if ($azure) {
# install azure choco packages
foreach ($package in $script:chocoInstallsAzure) {
if (-not (Test-ChocoInstall -ChocoPackage $package)) {
Install-ChocoPackage -ChocoPackage $package
}
}
# install azure Modules
Install-HelpfulAzureModules
# install azure extensions
Install-VSCodeExtension -ExtensionList $script:vscodeExtensionsAzure
# set azure path variables
Set-PathVariables
}
# installs aws resources if aws switch is specified
if ($aws) {
# install aws choco packages
foreach ($package in $script:chocoInstallsAWS) {
if (-not (Test-ChocoInstall -ChocoPackage $package)) {
Install-ChocoPackage -ChocoPackage $package
}
}
# install aws modules
foreach ($module in $script:awsModules) {
Write-Verbose -Message (' {0} evaluating...' -f $module)
if (-not (Get-Module $module -ListAvailable)) {
Write-Verbose -Message (' Installing {0}' -f $module)
Install-Module -Name $module -Scope CurrentUser -Repository PSGallery -Force
}
else {
Write-Verbose -Message (' {0} VERIFIED. NO ACTION TAKEN.' -f $module)
}
}
# install aws extensions
Install-VSCodeExtension -ExtensionList $script:vscodeExtensionsAWS
}
# installs python resources if python switch is specified
if ($python) {
# install python extensions
Install-VSCodeExtension -ExtensionList $script:vscodeExtensionsPython
}
} #Invoke-WSSetup
#endregion
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment