0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

WSL2でディストリビューション内のコマンドを実行するWindowsのスタートメニューを作る

Posted at

本記事ではWindows Subsystem for Linux (WSL) でディストリビューションのコマンドを実行するスタートメニューを作る方法を1つ紹介します。

ディストリビューションはWSL2で管理されるLinuxの種類のことです。実行対象のコマンドは、ここではグラフィカルユーザーインターフェース (graphical user interface; GUI) を持つアプリケーションを起動するものを指すことにします。例えばemacsgnucashなどのものです。スタートメニューは窓のアイコンをクリックしたときに表示されるアプリケーションのアイコンのある領域です。

これを設定することで、ディストリビューション内のコマンドの起動がより簡単になります。ターミナルから開く場合、まず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>.
  1. これもファイルに保存して実行しようとなると、それ自体にも署名が要りますからね (^^;

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?