Visual studio code自動アップデートスクリプト(Windows版)

Visual studio code(Windows版)はインストーラーでインストールする方法が一般的です。

しかし、自分仕様にカスタマイズしたVisual studio codeを別PCでも使用する場合を考えたとき、zipファイルを展開したもポータブル版を使ったほうが、SSD上で実行もできるようになり、バックアップも容易などいいことずくめです。

ただし、zip展開でインストールした場合はアップデートの度にzipをダウンロードして展開し、Visual studio codeのインストールフォルダに手動でコピーしなくてはいけません。Visual studio codeは頻繁にアップデートがあるので、手動アップデートは結構面倒です。

そこで、ダブルクリックのみでアップデートバッチとPowershellスクリプトを作成し、スケジューラーで定期的にアップデートできるようにしました。そのバッチとPowershellスクリプトが以下になります。

バッチファイルはダブルクリックでアップデートできるようにするためのWrapperになります。Visual studio codeが起動中の場合やアップデートファイルのダウンロードに失敗した場合はアップデート処理を行わないようにしています。

このバッチを定時で起動したり、startupにショートカットを置いて起動時にアップデートをかけたりすることで、手間なく最新版のVisual studio codeが使用できるようになります。

参考になれば幸いです。

@echo off
SET CURRENT_DIR_VSCODE_UPDATE_BAT=%~dp0
cd /d "%CURRENT_DIR_VSCODE_UPDATE_BAT%"
SET BATCH_NAME_VSCODE_UPDATE_BAT=%~n0%~x0
echo [%BATCH_NAME_VSCODE_UPDATE_BAT%] powershell -NoProfile -ExecutionPolicy Bypass ".\VsCodeUpdate.ps1"
CALL powershell -NoProfile -ExecutionPolicy Bypass ".\VsCodeUpdate.ps1"
[string]$script:script_path = Split-Path -Parent $MyInvocation.MyCommand.Path
[string]$script:script_name = Split-Path -Leaf $PSCommandPath
[string]$script:zip_name_body = "updater"
[string]$script:zip_name = $script:zip_name_body +".zip"
[string]$script:zip_path = $script:script_path + "\" + $script:zip_name
try {
    Get-Process -Name Code -ErrorAction Stop > $null
    Write-Host "[$script:script_name] Error : Close VSCode before updating"
    Start-Sleep -m 5000
    exit
}
catch {
    # do nothing
}
# Remove temp file from portable user data
Remove-Item -Recurse -Force -Path "data/user-data" -Include @("Backups", "Cache", "CachedData", "GPUCache", "logs")
# Download latest stable build
curl.exe -L "https://code.visualstudio.com/sha/download?build=stable&os=win32-x64-archive" -o $script:zip_path
if( Test-Path($script:zip_path) ){
    try{
        # Unzip it
        [string]$extract_folder = $script:zip_path.Substring(0, $script:zip_path.LastIndexOf('.'))
        if( Test-Path($extract_folder) ){
            Remove-Item -Recurse -Force -Path $extract_folder
        }
        Expand-Archive -Path $script:zip_path -DestinationPath $extract_folder
        try {
            Get-Process -Name Code -ErrorAction Stop > $null
            Write-Host "[$script:script_name] Error : Close VSCode before updating"
            # Delete downloaded package
            Remove-Item -Path $script:zip_path
            if( Test-Path($extract_folder) ){
                Remove-Item -Recurse -Force -Path $extract_folder
            }
            Start-Sleep -m 5000
            exit
        }
        catch {
            # do nothing
        }
        # Delete anything except user data, update script and downloaded zip file
        Get-ChildItem -Exclude @("data", "VSCodeUpdate.*", "ContextMenu_Setting.reg", $script:zip_name, $script:zip_name_body ) | Remove-Item -Recurse -Force
        Copy-Item -Path ( $extract_folder + "\*" ) -Destination $script:script_path -Recurse -Force
    } catch {
        Write-Host "[$script:script_name] Forbidden route : Fail to extract"
        Start-Sleep -m 5000
    }
    # Delete downloaded package
    Remove-Item -Path $script:zip_path
    if( Test-Path($extract_folder) ){
        Remove-Item -Recurse -Force -Path $extract_folder
    }
}

※zipでインストールする場合、右クリックメニューに”VSCodeで開く”が表示されません。これを表示させるための.regファイルが以下になります。”D:¥Tools¥VSCode”にインストールされていることが前提になります。参考までに。

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\*\shell\VSCode]
@=hex(2):4f,00,70,00,65,00,6e,00,20,00,77,00,26,00,69,00,74,00,68,00,20,00,43,\
  00,6f,00,64,00,65,00,00,00
"Icon"=hex(2):44,00,3a,00,5c,00,54,00,6f,00,6f,00,6c,00,73,00,5c,00,56,00,53,\
  00,43,00,6f,00,64,00,65,00,5c,00,43,00,6f,00,64,00,65,00,2e,00,65,00,78,00,\
  65,00,00,00
[HKEY_CLASSES_ROOT\*\shell\VSCode\command]
@=hex(2):22,00,44,00,3a,00,5c,00,54,00,6f,00,6f,00,6c,00,73,00,5c,00,56,00,53,\
  00,43,00,6f,00,64,00,65,00,5c,00,43,00,6f,00,64,00,65,00,2e,00,65,00,78,00,\
  65,00,22,00,20,00,22,00,25,00,31,00,22,00,00,00
[HKEY_CLASSES_ROOT\Directory\Background\shell\VSCode]
@=hex(2):4f,00,70,00,65,00,6e,00,20,00,77,00,26,00,69,00,74,00,68,00,20,00,43,\
  00,6f,00,64,00,65,00,00,00
"Icon"=hex(2):44,00,3a,00,5c,00,54,00,6f,00,6f,00,6c,00,73,00,5c,00,56,00,53,\
  00,43,00,6f,00,64,00,65,00,5c,00,43,00,6f,00,64,00,65,00,2e,00,65,00,78,00,\
  65,00,00,00
[HKEY_CLASSES_ROOT\Directory\Background\shell\VSCode\command]
@=hex(2):22,00,44,00,3a,00,5c,00,54,00,6f,00,6f,00,6c,00,73,00,5c,00,56,00,53,\
  00,43,00,6f,00,64,00,65,00,5c,00,43,00,6f,00,64,00,65,00,2e,00,65,00,78,00,\
  65,00,22,00,20,00,22,00,25,00,56,00,22,00,00,00
[HKEY_CLASSES_ROOT\Directory\Background\shell\VSCode]
@=hex(2):4f,00,70,00,65,00,6e,00,20,00,77,00,26,00,69,00,74,00,68,00,20,00,43,\
  00,6f,00,64,00,65,00,00,00
"Icon"=hex(2):44,00,3a,00,5c,00,54,00,6f,00,6f,00,6c,00,73,00,5c,00,56,00,53,\
  00,43,00,6f,00,64,00,65,00,5c,00,43,00,6f,00,64,00,65,00,2e,00,65,00,78,00,\
  65,00,00,00
[HKEY_CLASSES_ROOT\Directory\Background\shell\VSCode\command]
@=hex(2):22,00,44,00,3a,00,5c,00,54,00,6f,00,6f,00,6c,00,73,00,5c,00,56,00,53,\
  00,43,00,6f,00,64,00,65,00,5c,00,43,00,6f,00,64,00,65,00,2e,00,65,00,78,00,\
  65,00,22,00,20,00,22,00,25,00,56,00,22,00,00,00