syghの新フラグメント置き場

プログラミングTipsやコード断片の保管場所です。お絵描きもときどき載せます。

Windows 10の右クリックメニューにコマンドプロンプトを復活させる

Windows 7エクスプローラーで、Shiftキーを押しながらコンテキストメニュー(右クリックメニュー)を表示すると、「コマンド ウィンドウをここで開く」という隠しコマンドが表示され、コマンドプロンプトのカレントディレクトリをそのディレクトリに設定した状態で起動することができます。通例、コマンドプロンプトを起動するとカレントディレクトリは%UserProfile%に設定されるので、特定のディレクトリ(フォルダー)でバッチ処理をしたくなったときにディレクトリの移動が煩雑なのですが、そういうときにこの隠しコマンドが威力を発揮します。
Windows 8.xおよびWindows 10 Anniversary Update (1607) までは同様の機能を備えていました。

しかし、Windows 10 Creators Update (1703) では、「PowerShell ウィンドウをここに開く」というメニューコマンドが追加され、逆に「コマンド ウィンドウをここで開く」は削除されてしまいました。
Windows PowerShellは確かにコマンドプロンプトと比べて遥かに強力ですが、オプション書式に互換性がなく、従来のコマンドに複雑なオプションを指定した場合はそのままでは実行できなくなっているため、依然としてコマンドプロンプトの需要は残っています。

コマンドプロンプトを起動するためのメニューコマンドを復活させるには、レジストリをいじる必要があります。

毎回手作業で実行するのは面倒ですので、今回は「コマンド ウィンドウをここで開く」コマンド復帰の手順を一発で実行するためのレジストリファイルの内容を記載しておきます。UTF-16LE形式のテキストファイルで.reg拡張子を付けて保存してください。ただしご利用は自己責任でどうぞ。

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Classes\Directory\Background\shell\cmd]
"HideBasedOnVelocityId"=dword:00000000
"ShowBasedOnVelocityId"=dword:00639bc8

なお、上記のエントリを追加しただけでは、エクスプローラー右ペインのリストビューのディレクトリアイテムに対してコンテキストメニューを表示したときにメニューコマンドが表示されませんが、それほど困ることはないと思います。カレントディレクトリに設定したいフォルダーを開いて、リストビューの余白内でメニューを表示するか、あるいはエクスプローラー左ペインのツリービューのディレクトリアイテムに対してメニューを表示することでコマンドが出現するので、必要十分ではないでしょうか。
また、上記エントリは現在のWindowsログオンユーザーのレジストリのみに追加され、ほかのユーザーには影響しません。

ネットワークディレクト

ネットワークディレクトリ(\\で始まるUNCパス)は、コマンドプロンプトのカレントディレクトリとして使えないという制約があります。そのため、ネットワーク上の共有フォルダーにて「コマンド ウィンドウをここで開く」を実行すると、まずWindowsによって自動的にネットワークドライブレターが割り当てられてから、そのドライブ上で改めてコマンドプロンプトが起動するという動作をします。

コマンドプロンプトの将来

隠しコマンドにPowerShellを追加するにしても、コマンドプロンプトを残して両方使えるようにしておけばいいのに、なぜわざわざ削除したんでしょうか?
MSは将来的にレガシーなコマンドプロンプトを抹殺する気なのかもしれませんが、肝心のPowerShellが完全な上位互換でないのに移行できるわけがありません。
そんなにPowerShell推しなんだったら、まずVisual StudioのコマンドベースユーティリティをPowerShellに置き換えてみせろよと言いたいです。PowerShellのバージョンがフラグメンテーションを起こしていることもあるせいか、いまだにVisual StudioのツールはPowerShellでなくコマンドプロンプトに依存している部分が多々あります。

余談

実は、Shiftコンテキストメニューには、ほかにも「パスとしてコピー」(Windows 7)あるいは「パスのコピー」(Windows 8.x/10)という便利な隠しコマンドが用意されています。このコマンドはディレクトリおよびファイル両方に対して使用でき、実行することでクリップボードにアイテムの絶対パス文字列をコピーします。
ディレクトリのパスは通例エクスプローラー上部のアドレスバーをクリックすることでも簡単に取得できますが、Windows Vistaまではファイルのパスを1アクションで取得する機能がなく不便でした。こういった細かいユーティリティは、OSの標準機能として提供されていることが一番重要です。標準機能であればどの端末でも必ず使えることが保証されているので、サードパーティ製のプラグイン/ツール/サービスをインストールできない環境を使うときや、エンドユーザーあるいは同僚に操作の指示を出したりマニュアルを作成したりするときに重宝します。OSの設定を変更することなく、最初から既定でどのユーザーでも使えるようになっていることも必須条件ですね。