2017-05-08

Windowsユーザ向けワンラインインストール

Windowsでワンラインインストールするためには、コマンドプロンプトやPowershellを使う必要があります。今回はPowershellを使ったワンラインインストールの方法を紹介します。

方針

スクリプト

全容はこんな感じです。

Set-PSDebug -strict
$name = "oauth"
$bin_name = "oauth"
$version = "0.1.0"
$github_user = "tzmfreedom"
If ($Env:PROCESSOR_ARCHITECTURE -match "64") {
  $arch = "amd64"
} Else {
  $arch = "386"
}
$archive_file = "${name}-${version}-windows-${arch}.zip"
$url = "https://github.com/${github_user}/${name}/releases/download/v${version}/${archive_file}"
$dest_dir = "$Env:APPDATA\${name}"

wget $url -OutFile "${dest_dir}\tmp.zip"
Expand-Archive -Path "${dest_dir}\tmp.zip" -DestinationPath "${dest_dir}\tmp" -Force
if (!(Test-Path -path "${dest_dir}\bin")) {  New-Item "${dest_dir}\bin" -Type Directory }
mv "${dest_dir}\tmp\${bin_name}" "${dest_dir}\bin\${bin_name}.exe" -Force
rm "${dest_dir}\tmp.zip" -Force
rm "${dest_dir}\tmp" -Force -Recurse

# ensure added to path in registry
$reg_path = [Environment]::GetEnvironmentVariable("PATH", "User")
If ($reg_path -notcontains $dest_dir) {
  [Environment]::SetEnvironmentVariable("PATH", $reg_path + ";" + $dest_dir, "User")
}
# ensure added to path for current session
If ($Env:Path -notcontains $dest_dir) {
  $Env:Path += ";" + $dest_dir
}
Write-Host "${bin_name} installed. Run '${bin_name} help' to try it out."

流れとしては以下の通り。

  1. $Env:PROCESSOR_ARCHITECTUREでOSのアーキテクチャを判別
  2. wgetでアーキテクチャに応じたバイナリを取得しAPP_DATA配下のディレクトリに設置
  3. Expand-Archiveで解凍
  4. 実行ファイルを適切な場所(APPDATA/${name}/bin)に移動
  5. 不要なファイル、ディレクトリを削除
  6. PATHに追加
このスクリプトをWeb上に設置し、以下のワンラインスクリプトでインストールが可能です。

(New-Object Net.WebClient).DownloadString('{url}') | iex

Set-PSDebug -strictの記述をするとbashでいうところのset -uを定義したように、未定義変数を参照したときにエラーになります。環境変数APPDATAはユーザ毎のアプリのデータ、設定ファイルを置く場所です。WindowsにはLinuxの/usr/local/binにあたるディレクトリが特に無いので、APPDATA配下を各ユーザのバイナリ置き場として使っています。

今回はzip形式のスクリプトとなっていますが、CLIの場合、zip形式ではなくバイナリを直接アップロード/ダウンロードした方がインストールスクリプトの記述は簡単になります(ただし、ファイルサイズは大きくなります)

参考URL

このエントリーをはてなブックマークに追加