VS Code doesn't do completely silent updates. This works around that shortcoming and allows the user to just use VS Code.
This is a simple implementation of a more complex installer/updater process that I manage for work. I expect this script to be implemented as a scheduled task; either manually or via GPO.
See the Base64 Example, below.
Parameters let you customize some installer options.
All parameters can also be set with an environment variable as such: UpdateVSCode${Parameter}
.
For example, the SetupSilent
variable as an environment variable would be: UpdateVSCodeSetupSilent
.
Keep in mind that environment variables are always strings.
So, setting a switch parameter to '$false'
via an environment variable would still be $true
.
You can see what I mean with these examples: [bool]'true'
, [bool]'false'
, [bool]'$true'
, [bool]'$false'
, [bool]'0'
, and [bool]''
.
- Type:
[switch]
Set this if you don't want to have VS Code blocked from executing during the installation/upgrade of VS Code.
I'm not sure what the implications of this are, but I do know that VS Code's setup.exe
checks for VS Code to be running and doesn't let the installer proceed if it is.
I also realize the VS Code can install in the background if you initiate the install from withing VS Code.
- Type:
[IO.FileInfo]
- Default:
"${env:SystemRoot}\Logs\Update-VSCode.ps1.log"
This is the full path (directory and name) of the log file.
Additionally, the setup.exe
will use this to generate its log file's full path by appending -Setup
before the extension; such as: "${env:SystemRoot}\Logs\Update-VSCode.ps1-Setup.log"
.
Only the latest iteration of the log file is kept. In other words: the logging will not append to the previous run of this script. This keeps the log file from getting bloated. I tend to believe that only the latest iteration is ever really needed anyway.
- Type:
[string]
- Default:
'VS Code: Installing/Upgrading'
When blocking VS Code from launching during an install/upgrade, there will be a message box that pops up if someone attempts to launch VS Code. This sets the title of that message box.
- Type:
[string]
- Default:
'VS Code is currently being installed or upgraded. It will not be accessible for the duration of the install. This won''t take long ... try again in a minute.'
When blocking VS Code from launching during an install/upgrade, there will be a message box that pops up if someone attempts to launch VS Code. This sets the body text of that message box.
- Type:
[int]
- Default:
30
When blocking VS Code from launching during an install/upgrade, there will be a message box that pops up if someone attempts to launch VS Code. This sets the auto-close timeout in seconds of that message box.
- Type:
[int32]
- Default:
0x30
When blocking VS Code from launching during an install/upgrade, there will be a message box that pops up if someone attempts to launch VS Code. This sets the alert icon of that message box.
- Type:
[string]
- Default:
'addcontextmenufiles,addcontextmenufolders,addtopath,associatewithfiles,!desktopicon,!quicklaunchicon,!runcode'
This setting allows you to customize some of the installer options/tasks.
The tasks listed as default, above, are the current tasks in the code.iss
file, thanks StackOverflow.
Think of each task as a checkbox.
Putting a bang (!
) in front of the taskname is like unchecking the box.
These tasks are subject to change.
Check the latest version of that code.iss
file for details; it will definitely be more updated than this README.
- Type:
[switch]
If set, the setup.exe
will be passed the /SILENT
parameter, instead of using this script's default /VERYSILENT
parameter.
If you specify this switch and the SetupSilentNoCancel switch, the SetupSilentNoCancel switch will take precedence.
- Type:
[switch]
If set, the setup.exe
will be passed the /SILENT
and /NOCANCEL
parameters, instead of using this script's default /VERYSILENT
parameter.
If you specify this switch and the SetupSilent switch, this switch will take precedence.
The script file is not needed on the computer.
I just created a scheduled task to run this as the System
user.
You have at least two options to accomplish this:
- Base64 encode it and run it with the
powershell.exe -EncodedCommand
parameter. (Personal Preference) - Download and Execute it straight from GitHub, I'm sure GitHub won't mind. 😏
There is while loop in this script that could potentially run forever. Use the scheduled task settings to create a timeout.
Both options are below ...
This is my personal preference because there's really no reason to download the code base constantly.
$url = 'https://raw.githubusercontent.com/UNT-CAS/Update-VSCode/master/Update-VSCode.ps1'
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$command = Invoke-WebRequest -Uri $url -UseBasicParsing
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
$encodedCommand = [Convert]::ToBase64String($bytes)
Then use the contents of $encodedCommand
like this:
powershell.exe -W H -Ex B -NoP -NonI -EncodedCommand "WwBEAGkAYQBnAG4AbwBzAHQAaQBjAHMALgBQAHIAbwBjAGUAcwBzAF0AOgA6AFMAdABhAHIAdAAoACcAaAB0AHQAcABzADoALwAvAHUAbgB0AGMAYQBzAC4AcABhAGcAZQAuAGwAaQBuAGsALwBMADgAdABjACcAKQA="
Note: you might want to re-base64 it yourself. It is not the base64 you are looking for.
❗️ Seriously, don't do it this way unless you point it at a commit id, or you fork this repo and point it at your fork.
powershell.exe -W H -Ex B -NoP -NonI "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; Invoke-WebRequest 'https://raw.githubusercontent.com/UNT-CAS/Update-VSCode/e00b0c8c25a66d07361148a6573c47810be8c63a/Update-VSCode.ps1' -UseBasicParsing | Invoke-Expression"
Note: you might want to confirm that the commit id in that URL is the id you want. I likely won't come back and update the commit id every time I make a change to the code.