treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

※https化しました。その影響でしばらくリンク切れなどがあるかもしれませんが徐々に修正していきます。 リンク切れなどのお気づきの点がございましたらコメントなどでご指摘いただけますと助かります。

Windows11のエクスプローラ右クリックメニューの設定をOS判定してクラシック表示にする

Windows11を使っていると、まず不便なのが右クリックメニューでした。
これを以前のクラシックなメニューにしたいという要望を受けて対処しました。

要望

やりたいことは、Windows11エクスプローラでフォルダなどを右クリックしたとき、

これが表示されますが、ユーザからは

こっちのメニューを使いたいのでどうにかならないかという要望を受けました。

7-zipとかVLCとかのユーザなら以前の右クリックメニューに機能が表示されるのに、Windows11標準だと「その他のオプションを表示」をクリックしてクラシックメニューを表示させる一手間が必要になります。この右クリックメニューの一手間が不評でした。

Windows11 22H2なら…

まず最初に、今回のバッチファイルを実施しなくてもWindows11のバージョンが22H2なら「Shiftキーを押しながら右クリック」することでメニューはクラシックメニューを表示することができます。
右クリックの際にShiftキーを押下する癖を付けるだけでいいので、本記事のようにレジストリ操作をするはありません。

ただ、今回はユーザ向けに右クリックメニューの設定をWindows10以前と同様になるようレジストリで指定したいという要望を受けたので、バッチファイルを作ってみることにしました。

エクスプローラ右クリックメニューの設定をクラシックなメニュー表示にする

右クリックのメニューをWindows11標準のメニューではなく、Windows10以前と同じクラシックなメニューを表示するように動作を変更するには、レジストリキーを追加します。
regコマンドで追加するときは以下のコマンドを実行します。

reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve

しかし、ここで思ったのが、ユーザ向けにバッチを展開して対象じゃないWindows10以前のOSには追加して欲しくない、が、ユーザはそれを判別してくれるとは限らない、ということで、OSを判定してWindows11だけエクスプローラのクラシックメニュー設定を実行できるような判定を付けたいと考えました。

OS判定したくなる

実施にあたり、Windows11かWindows10以前のOSかを判定して、Windows11の動作が確認できたときだけ実行したい、と考えて判定できる条件を探してみました。

いくつかの候補から、PowerShellでGet-CimInstanceを使うとWindows10とWindows11の判断ができそうということで、判定バッチを作ってみました。

--------------------------------------------------------------
Windows10とWindows11を判定する
--------------------------------------------------------------
@echo off
rem 抽出でfindstrを使うと"Windows "の部分一致で判定ができないので、敢えてfindを使う。
powershell -command "Get-CimInstance Win32_OperatingSystem | select caption" | find "Windows 11"

if %ERRORLEVEL% == 0 goto NewerWin11
if %ERRORLEVEL% == 1 goto OLDwindows

:NewerWin11

    echo Windows11 でした。
    goto end

:OLDwindows

    echo Windows10以前の古いWindowsです。
    goto end
:end

--------------------------------------------------------------

バッチを実行すると、判定したOSによってechoコマンドでメッセージを表示します。このecho部分をregコマンドに置き換えればやりたいことはできそう。

二つを併せてバッチ化する

OSの判定ができたので、regコマンドを入れて見ました。

--------------------------------------------------------------
クラシックメニューに変更するバッチ
--------------------------------------------------------------
@echo off
rem OS判定
rem 抽出でfindstrを使うと"Windows "の部分一致で判定ができないので、敢えてfindを使う。
powershell -command "Get-CimInstance Win32_OperatingSystem | select caption" | find "Windows 11"
if %ERRORLEVEL% == 0 goto NewerWin11
if %ERRORLEVEL% == 1 goto OLDwindows

:NewerWin11

rem このバッチでは、右クリックメニューをクラシックメニューに設定します
reg.exe add "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32" /f /ve

taskkill /f /im explorer.exe
start explorer.exe
goto end

:OLDwindows
rem    echo Windows10以前の古いWindowsです。

goto end
:end
--------------------------------------------------------------

regコマンドでレジストリキーを追加した後に、エクスプローラをtaskkillコマンドで終了させてstartコマンドで起動することでエクスプローラプロセスを再起動し即時反映を差せています。
Windows10以前のOS=Windows11以外のOSでの動作は何もせず終了です。(誤って実行しても何もせずに終了する)

Windows11標準に戻す

OS判定の部分はそのままにして、前述のクラシックメニューに変更した右クリックメニューをWindows11標準メニューに戻すバッチも用意しておきました。

--------------------------------------------------------------
クラシックメニューからWindows11標準に戻すバッチ
--------------------------------------------------------------
@echo off
rem 抽出でfindstrを使うと"Windows "の部分一致で判定ができないので、敢えてfindを使う。
powershell -command "Get-CimInstance Win32_OperatingSystem | select caption" | find "Windows 11"

if %ERRORLEVEL% == 0 goto NewerWin11
if %ERRORLEVEL% == 1 goto OLDwindows

:NewerWin11

rem このバッチでは、右クリックメニューをWindows11標準メニューに戻します。
reg.exe delete "HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}" /f

taskkill /f /im explorer.exe
start explorer.exe
goto end

:OLDwindows
rem echo Windows10以前の古いWindowsです。
goto end

:end
--------------------------------------------------------------

regコマンドで追加していたレジストリキーをreg deleteでレジストリキーを削除して元に戻すという処理に置き換えただけのバッチです。
エクスプローラのプロセス再起動で即時反映するところは同様です。

ユーザには両方のバッチを公開して任意に実行してもらう

こうして用意した二つのバッチを共有フォルダなどで公開して、メニュー変更したい人向けのバッチと、メニューを元のWindows11に戻したい人向けのバッチを情報公開することで展開としました。
また使っている人数が少ないので、問題があるかどうかは不明。