[小ネタ] Windows Server 2022 EC2にWindows Terminalをインストールする (ついでにwingetも)

2021.09.26

小ネタです。

先月リリースされたWindows Server 2022はOSのビルドバージョンとしては10.0.20348でありWindows Terminalがインストール可能なビルドとなります。

というわけで誰もがWindows Server 2022にWindows Terminalをインストールしようと考えるに決まっており既に先駆者もいるわけです。
たとえば以下は元MVPで現Microsoft社員のThomas MaurerさんのブログでWindows Server 2022プレビュー時点から既に試されています。

まあ、OSのビルドバージョンさえクリアできていればインストール方法自体は非常にシンプルで、GitHubのリリースページからmsixbundleファイルをダウンロードしてやるだけです。

簡単なPowerShell関数を作りましたので以下のスクリプトを実行すれば最新のWindows Terminalをサクッとインストールできます。

function Install-LatestWindowsTerminal () {
    # Find the latest MSIX installer url
    $latest = Invoke-RestMethod -Uri 'https://api.github.com/repos/microsoft/terminal/releases/latest'
    $msixUrl = $latest.assets | Where-Object { $_.browser_download_url -like '*.msixbundle' } | Select-Object -ExpandProperty browser_download_url

    # Download MSIX
    Write-Host -ForegroundColor Green "Download $msixUrl"
    $msixPath = Join-Path -Path ([IO.Path]::GetTempPath()) ($msixUrl -split '/')[-1]
    Invoke-WebRequest -Uri $msixUrl -OutFile $msixPath

    # Install MSIX
    Write-Host -ForegroundColor Green "Install $msixPath"
    Add-AppxPackage -Path $msixPath

    # Remove MSIX
    if (Test-Path -LiteralPath $msixPath) {
        Write-Host -ForegroundColor Green "Remove $msixPath"
        Remove-Item -LiteralPath $msixPath
    }
    Write-Host -ForegroundColor Green "Installation complete!"
}
Install-LatestWindowsTerminal

これでよしなにWindows TerminalがインストールされWindows Server 2022で利用可能になります。

補足 : 既知の問題

現時点で最新のWindows Terminal Ver.1.10およびVer.1.11 PreviewではWindow Server 2022環境だとタブを表示しようとしてハングする不具合があります。

既に不具合の原因も特定され近いうちに対応版がリリースされるとのことですので今すぐWindows Terminalを試そうとする場合はご注意ください。

回避策としてタッチキーボードを制御するtabtip.exeをKillしてからWindows Terminalを起動する方法がありますが、こちらは自己判断で実施してください。

# ハングの直接原因となっている tabtip.exe をKillしてしまうことで一応回避可能ではある
Get-Process -Name TabTip | Stop-Process

おまけ : Windows Package Manager Client (winget)をインストールする

Windows Terminalと同様の理屈でWindows Package Manager Client (winget)もインストール可能です。

wingetの場合はアプリケーションのmsixbunldeファイル以外にVCライブラリのインストールが必要となる点、ライセンスファイルも同時にインストールする必要があるためAdd-AppxProvisionedPackageを使う必要がある点が異なります。

function Install-LatestWinGet ([bool]$installVCLibs = $true) {
    # Install prerequisites
    if ($installVCLibs) {
        $vcLibsUrl = 'https://aka.ms/Microsoft.VCLibs.x64.14.00.Desktop.appx'
        $vcLibsPath = Join-Path -Path ([IO.Path]::GetTempPath()) ($vcLibsUrl -split '/')[-1]
        Write-Host -ForegroundColor Green "Download $vcLibsUrl"
        Invoke-WebRequest -Uri $vcLibsUrl -OutFile $vcLibsPath
        Write-Host -ForegroundColor Green "Install $vcLibsPath"
        Add-AppxPackage -Path $vcLibsPath
        if (Test-Path -LiteralPath $vcLibsPath) {
            Write-Host -ForegroundColor Green "Remove $vcLibsPath"
            Remove-Item -LiteralPath $vcLibsPath
        }
    }

    # Find the latest assets url
    $latest = Invoke-RestMethod -Uri 'https://api.github.com/repos/microsoft/winget-cli/releases/latest'
    $msixUrl = $latest.assets | Where-Object { $_.browser_download_url -like '*.msixbundle' } | Select-Object -ExpandProperty browser_download_url
    $msixPath = Join-Path -Path ([IO.Path]::GetTempPath()) ($msixUrl -split '/')[-1]
    $licenseUrl = $latest.assets | Where-Object { $_.browser_download_url -like '*License1.xml' } | Select-Object -ExpandProperty browser_download_url
    $licensePath = Join-Path -Path ([IO.Path]::GetTempPath()) ($licenseUrl -split '/')[-1]

    # Download assets
    ( @{Url = $msixUrl ; LocalPath = $msixPath}, @{Url = $licenseUrl ; LocalPath = $licensePath} ) | ForEach-Object {
        Write-Host -ForegroundColor Green "Download $($_.Url)"
        Invoke-WebRequest -Uri $_.Url -OutFile $_.LocalPath 
    }

    # Install MSIX
    Write-Host -ForegroundColor Green "Install $msixPath"
    Write-Host -ForegroundColor Green "  : License $licensePath"
    Add-AppxProvisionedPackage -Online -PackagePath $msixPath -LicensePath $licensePath

    # Remove assets
    ($msixPath, $licensePath) | ForEach-Object {
        if (Test-Path -LiteralPath $_) {
            Write-Host -ForegroundColor Green "Remove $_"
            Remove-Item -LiteralPath $_
        }
    }
    Write-Host -ForegroundColor Green "Installation complete!"
}
Install-LatestWinGet

これでwingetを使っていろいろなソフトウェアをインストールできます。
なお、wingetインストール後はログインし直してください。

(上図はVS Codeをインストールしてみた図)

Gist

一応私のGistにもコードを載せておきます。