本記事ではWindows Subsystem for Linux (WSL) でディストリビューションのコマンドを実行するスタートメニューを作る方法を1つ紹介します。
ディストリビューションはWSL2で管理されるLinuxの種類のことです。実行対象のコマンドは、ここではグラフィカルユーザーインターフェース (graphical user interface; GUI) を持つアプリケーションを起動するものを指すことにします。例えばemacs
やgnucash
などのものです。スタートメニューは窓のアイコンをクリックしたときに表示されるアプリケーションのアイコンのある領域です。
これを設定することで、ディストリビューション内のコマンドの起動がより簡単になります。ターミナルから開く場合、まずwsl
で対象のディストリビューションに入り、コマンドを打つ必要がありました。
ただし、普通は本記事のような手順を踏む必要はありません。例えばUbuntuのディストリビューションでEmacsをインストールした場合、Windowsに自動でスタートメニューにアプリのアイコンが表示されるでしょう。
一方でそうではない状況、例えばディストリビューションに独自にイメージをビルドしてインポートしたものを使ったときや、アプリケーションをそのオペレーティングシステムのパッケージ管理ソフトウェア(APTなど)を使ってインストールせず、独自にコンパイルした場合もあります。そうした場合、Windowsのスタートメニューに表示されないかもしれません。
必要になるのはPowerShellです。バージョンは7としますが、スクリプトを実行するコマンドを除き、それ以前でもおそらく動くでしょう。
スタートメニューに追加するには、以下を実行します。
$distribution = "<ディストリビューション名>"
$command = "<コマンド名>"
$workingDirectory = "<実行するときのパス>"
$name = "<名前>"
$path = Join-Path -Path $env:APPDATA `
-ChildPath "Microsoft\Windows\Start Menu\Programs" `
-AdditionalChildPath "$($name).lnk"
$shortcut = (New-Object -ComObject WScript.Shell).CreateShortcut($path)
$shortcut.TargetPath = (Get-Command powershell.exe).Source
$shortcut.Arguments = "-Command `"Start-Process -File wsl.exe -ArgumentList --distribution, $distribution, --shell-type, login, $command -WindowStyle Hidden`""
$shortcut.WorkingDirectory = $workingDirectory
$shortcut.Save()
$distribution
はディストリビューション名です。例えば「Ubuntu」です。
$command
は実行するコマンド名です。例えばemacs
です。
$workingDirectory
はコマンドを実行する場所のディレクトリ名です。例えば\home\gemmaro
です。こうすると、例えばEmacsを起動したときの作業ディレクトリがそのパスになって便利です。
$name
はショートカットの名前です。例えば「Emacs」です。
なお、上記と同じことはWindowsのGUIでもできます。しかし、マウスを握るのも億劫ですし、同じようなことを繰り返すのであれば、以下のスクリプトファイルに保存して実行する方が楽でしょう。
PowerShellをそのまま打ち込んでいくだけならこれでできると思います。しかし、ファイルに保存して実行する場合は少し手間が掛かります。
上記を何らかのスクリプトファイルに保存したとしましょう。拡張子は.ps1
です。それを実行するには以下とします。ここでは管理者で実行する必要はありません。
pwsh -File <スクリプトへのファイルパス>
しかし、これがエラーになることがあります。内容が実行時のポリシーに由来するものであれば、スクリプトへ署名して実行を許可する方法があります。詳しいところはMicrosoftのドキュメントを参照いただくとして、署名を作成してスクリプトに署名する例は次の通りです。PowerShellに順に打ち込んでいきましょう1。$store
変数が絡む部分のみ、管理者での実行が必要です。
$params = @{
Subject = 'CN=PowerShell Code Signing Cert'
Type = 'CodeSigning'
CertStoreLocation = 'Cert:\CurrentUser\My'
HashAlgorithm = 'sha256'
}
$cert = New-SelfSignedCertificate @params
Set-AuthenticodeSignature <スタートメニューを作るスクリプトへのファイルパス> $cert
$store = New-Object System.Security.Cryptography.X509Certificates.X509Store "Root", "LocalMachine"
$store.Open("ReadWrite")
$store.Add($cert)
$store.Close()
この操作が終わったら、スタートメニューを作るスクリプトファイルの末尾に# SIG # Begin signature block
から# SIG # End signature block
まで長い文字列が加わっていることが確認できます。
そうしたら改めてスクリプトを実行するコマンドを打てば大丈夫です。
この記事は以上です。
Copyright (c) 2025 gemmaro.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3
or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
The license is located at <https://www.gnu.org/licenses/fdl-1.3.html>.
-
これもファイルに保存して実行しようとなると、それ自体にも署名が要りますからね (^^; ↩