🧩

Webブラウザからエクスプローラーを起動する

2023/12/10に公開

自社のOA環境(Windows)では、社内のやり取りはWebブラウザ上のグループウェアにより一元化されており、ファイルについてはファイルサーバにより共有されている。当然ながら、グループウェアの書き込みで下記のようにファイルサーバのファイルパスを書くわけだ。

プロジェクトの進捗報告を更新しました。
所定のフォルダに格納済みです。
¥¥ファイルサーバ¥開発第5グループ¥開発プロジェクト¥進捗報告

過去にさかのぼればOA環境のWebブラウザはInternet Explorer縛りという悪夢の時代があり、当時は上記のような書き込みにfile://のハイパーリンクを設定することで、IEからリンクをクリックしてエクスプローラー起動したり、ファイルサーバのファイルを直接開いたりすることができた。時代は変わり、社内の標準ブラウザがEdgeに移行し、直接起動ができなくなってしまったというわけだ。いまだEdgeでIEモードを粘り強く使い続ける猛者もいるが。

そこで、Edge/ChromeのTampermonkey拡張機能(FirefoxのGreasemonkey拡張機能)のスクリプトを駆使して、Webブラウザから直接エクスプローラーを起動できないか?と考えた。

ちなみにEdge/Chromeの「Enable local file links」(ローカルファイルリンク有効化)という拡張機能を使うか、あるいはhttpsのサイトであればグループポリシーで「IntranetFileLinksEnabled」を設定することで、file://のリンクからエクスプローラーを起動する、という手段もある。
https://jpdsi.github.io/blog/internet-explorer-microsoft-edge/FileProtocol/

とはいえ、これから示す方法はリンクが設定されていないベタ書きされたファイルパスをそのままエクスプローラーで開けるので、より便利である。

手順

  1. Edge/ChromeならTampermonkey、FirefoxならGreasemonkeyをインストール
  2. 拡張機能の管理画面よりユーザースクリプト(後述★1)をインストール
  3. 「file-explorer:」プロトコルからエクスプローラーを起動するレジストリ設定(後述★2)
  4. エクスプローラー起動用Windows Script(後述★3)をローカルフォルダに配置

拡張機能のユーザースクリプト(★1)

このGreasemonkey / Tampermonkeyユーザースクリプトは以下2つの機能を持つ。

  • Webページ上で「¥¥ファイルサーバ¥…」の文字列をマウスで範囲選択すると「file-explorer:¥¥ファイルサーバ¥…」のURLを開く。
  • Webページ上の「file://ファイルサーバ/…」のリンク先URLを「file-explorer:¥¥ファイルサーバ¥…」に置き換える。
グループウェアからエクスプローラー起動.user.js
// ==UserScript==
// @name           社内グループウェアからエクスプローラーを起動
// @author         Gomita
// @version        1.0
// @description    ファイルサーバのファイルパスを選択時にエクスプローラーを起動します。
// @namespace      http://www.xuldev.org/
// @match          http://グループウェアのホスト名/*
// ==/UserScript==

(function() {
  document.addEventListener("selectstart", event => {
    document.addEventListener("mouseup", event => {
      var sel = window.getSelection().toString().replace(/^\s+|\s+$/g, "").replace(/^"|"$/g, "");
      if (/^\\\\(?:ファイルサーバ)/i.test(sel) && sel.indexOf("\n") < 0) {
        window.location.href = "file-explorer:" + sel;
      }
    }, { once: true });
  }, false);
  [...document.links].forEach(link => {
    if (link.href.match(/\/ファイルサーバ\/|^file:\/\/\//i)) {
      var href = decodeURI(link.href);
      href = href.replace(/http:\/\/ファイルサーバ\//i, "\\\\ファイルサーバ\\");
      if (href.startsWith("file://ファイルサーバ")) {
        href = href.replace("file://ファイルサーバ", "\\\\ファイルサーバ");
      }
      href = href.replace("file://ファイルサーバ/", "\\\\ファイルサーバ\\");
      href = href.replaceAll("/", "\\");
      link.removeAttribute("target");
      link.setAttribute("href", "file-explorer:" + href);
    }
  });
})();

レジストリ設定(★2)

下記のレジストリを登録することで、「file-explorer:」プロトコルのURLからwscript.exeでローカルファイル「C:¥file-explorer.js」が実行される。
レジストリ登録は管理者として実行する必要があるので、regファイル直接実行でエラーとなる場合は管理者として実行したコマンドプロンプト経由で。

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\file-explorer]
@="URL:FileExplorer Protocol"
"URL Protocol"=""

[HKEY_CLASSES_ROOT\file-explorer\shell\open\command]
@="\"wscript.exe\" \"C:\\file-explorer.js\" \"%1\""

エクスプローラー起動用Windows Script(★3)

ローカルファイル「C:¥file-explorer.js」は引数で渡されたファイルパスをエクスプローラーで開くWindows Scriptである。あえてファイル自体を直接開かず、そのファイルのフォルダを開いてファイルを選択した状態にする。

file-explorer.js
if (WScript.Arguments.Length < 1)
  WScript.Quit(-1);

var WShell = new ActiveXObject("WScript.Shell");
var FileSystem = new ActiveXObject("Scripting.FileSystemObject");

// 先頭の「file-explorer:」を除いてファイルパスを生成
var path = decodeURI(WScript.Arguments.Item(0)).replace(/^[^:]+:/, "");

// パスがファイルの場合、エクスプローラーで親フォルダを開いてファイルを選択する
if (FileSystem.FileExists(path)) {
  WShell.Run("explorer.exe /select," + path);
  WScript.Quit(0);
}

// パスがフォルダの場合、エクスプローラーでフォルダを開く
if (FileSystem.FolderExists(path)) {
  WShell.Run("explorer.exe " + path);
  WScript.Quit(0);
}

WScript.Echo("フォルダが見つかりません。\n\n[" + path + "]");
WScript.Quit(-1);

念のための確認で、コマンドプロンプトを新しく開いてから「start file-explorer:c:」でエクスプローラーが起動されたらOK。

補足

Firefox (Greasemonkey)だと初回のエクスプローラーを起動する際に下記の警告が表示される。チェックを入れれば2回目以降は表示されない。

Edge (Tampermonkey)だと毎回下記の警告が表示される。

レジストリ設定(★2)は、Windowsのバージョンアップにより登録内容が一旦消滅してしまう。Windowsのバージョンアップをした後は再度★2のレジストリ登録が必要となる。

Discussion