概要
Windows11のコンテキストメニューをWindows10までの従来仕様に戻すスクリプトをまとめた話です。
ググれば同じ話はいくつも出てくるのでn番煎じ感が強いですが、PowerShellだけで行ってる例は少なかったので、そこは新規性があるかも?
コンテキストメニューって?
エクスプローラやデスクトップ上などでファイルとか何もない場所を右クリックしたときに表示されるメニューのことです。
このコンテキストメニュー、Windows10までとWindows11で仕様が大きく異なります。
Windows11では表示をすっきりさせるためなのか、従来のほとんどの操作は非表示になっています。
なので、例えば7zipでの解凍・VSCodeで開く・送るなどの操作をしたい場合は「その他のオプションを確認」をクリックして従来のコンテキストメニューを表示してから対象操作を選択する必要があります。とてもつらい。
ということで、レジストリをいじって仕様を戻しちゃいます。
※ちなみにWindows11でもバージョン22H2以上であればShiftキーを押しながら右クリックすれば旧仕様のコンテキストメニューを表示できます。
方法0 : レジストリエディタを操作する
レジストリエディタを起動してポチポチ操作していく方法です。
ただ、手作業は面倒なのでこの記事では説明は省きます。詳しくは「Windows11 右クリック 戻す」で検索すれば参考になるサイトがたくさん見つかると思います。(以下、参考になりそうなサイト例)
方法1 : レジストリエディタをコマンドラインから呼び出す
方法0をコマンド操作で実行する方法です。多分これが一番はやいと思います。
コマンドプロンプト / Windows PowerShell / Windows Terminal のどれでもいいでの開いて reg.exe
にオプションをつけて実行すればOKです。
reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve
reg.exe delete "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}" /f
レジストリ値を変更した後はPCを再起動するか、タスクマネージャからエクスプローラのプロセスを再起動する必要があります。
ちなみに、{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}
がコンテキストメニューに関するレジストリキーなのですが、このキーやその配下が他の制御にも使われうるのかどうかよくわからないので、何も確認せずに削除するのは危険かもしれません。まぁ杞憂かもしれませんが。
方法2 : PowerShellでレジストリを操作する
PowerShellの標準コマンドレットを使ってレジストリを操作します。
(PowerShellでレジストリを変更しますと言ってreg.exeを呼んでるだけの記事とは違うことを強調したい!)
方法1との違いとして、レジストリキーに他のキーや値が設定されてないことの事前確認も念のため行っています。仮に存在する場合は自分で追加した値だけを消すようにしています。
# レジストリキーの定義
$key = "HKCU:\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32"
# レジストリキーが存在しなければ再帰的に作成
if (! (Test-Path ${key}) ) {
New-Item ${key} -Force
}
# 既定プロパティにブランクを設定
Set-ItemProperty ${key} -Name "(default)" -Value ""
# Explorerの再起動
Stop-Process -Name explorer -Force
# レジストリキーとサブキーの定義
$keyparent = "HKCU:\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}"
$key = "${keyparent}\InprocServer32"
# 事前確認
# 1. 親キーのサブキーは InprocServer32 が1つだけのはず
$chk1 = (Get-Item ${keyparent}).SubKeyCount -eq 1
# 2. 親キーに値は存在しないはず
$chk2 = (Get-Item ${keyparent}).ValueCount -eq 0
# 3. キーにサブキーは存在しないはず
$chk3 = (Get-Item ${key}).SubKeyCount -eq 0
# 4. キーの値は (default) のみのはず
$chk4 = (Get-Item ${key}).ValueCount -eq 1
# 事前確認の結果表示
Write-Output "${chk1}, ${chk2}, ${chk3}, ${chk4}"
# 事前確認の結果に応じたレジストリ操作を実行
if ($chk1 -and $chk2 -and $chk3 -and $chk4) {
# すべて True の場合、親キーごと削除する
Remove-Item ${keyparent} -Force
} else {
# 1つでも False が存在する場合、キーの既定プロパティのみを削除する
Remove-ItemProperty ${key} -Name "(default)"
}
# Explorerの再起動
Stop-Process -Name explorer -Force
さいごに
本記事を作成するにあたって以下のサイトを参考にさせてもらいました。ありがとうございます。
レジストリエディタ(コマンド)でのコンテキストメニューの変更
https://www.suzu6.net/posts/336-windows11-right-click-menue/コマンドレットでのレジストリ操作
https://qiita.com/mima_ita/items/1e6c74c7fb641852edff既定プロパティの設定
https://www.vwnet.jp/windows/PowerShell/SetValue2RegDefault.htm
コンテキストメニューはサードパーティアプリによってごちゃごちゃになりがちなので整理したくなる気持ちもわかりますが、何を隠して何を表示するかは自分で選びたいですね。
本記事は以上です。さいごまで読んでいただきありがとうございました。