前の記事「デスクトップは必要か?」の最後に書いたように、Windowsのショートカットでは絶対パスしか指定できないという制限があるのが残された課題でした。
このことは、普段は困らないのですが、USBメモリやファイルサーバーでマウントしたときにドライブレターが変ると、ショートカットは使えなくなるという問題が発生します。また、上位フォルダの名前を変えたり移動したときにも問題が発生します。
調べてみると、結構この問題で悩んでいる人は多いのですが、色々な解決策が見つかりました。その方法とそれぞれの特徴について説明します。
0.想定するフォルダ構成
まず、分かりやすいように、対象とするフォルダの構成について説明します。
Cドライブの直下に「test」フォルダを作成し、その下に「aaa」と「bbb」というフォルダを作成しました。さらに「bbb」フォルダの下には「gun」というフォルダがあります。(以下の構造)
Cドライブ
testフォルダ
ーー>aaaフォルダ(デスクトップ代替フォルダ)
ーー>bbbフォルダ(ポータブルアプリ用フォルダ)
ーーーー>gunフォルダ(ポータブルアプリ)
ーーーーーー>THEGUN.EXE(実行ファイル)
「gun」フォルダにはテキストエディタ(ポータブル)が入っています。「test」フォルダの「bbb」フォルダ以下にポータブルなアプリが入っていて持ち運びしたいという想定です。
aaaフォルダには、今回のテーマであったデスクトップ代替のフォルダで、プログラムの起動やフォルダの参照をしているという想定です。
では、ショートカットをそのまま使うと不具合が発生することを確認します。普通にaaaフォルダにgunフォルダの下にある「THEGUN.EXE」ファイルのショートカットと「bbb」フォルダのショートカットを作りました。
THEGUN.exeのショートカットのプロパティを確認すると、そのパスは「C:\test\bbb\gun\THETGUN.EXE」と絶対パスになっています。
ここで、根元の「test」フォルダの名前を変更するとどうなるでしょうか?「test」を「testx」と変更した後、THEGUN.E XEのショートカットをダブルクリックしました。
このようにショートカット先が変更か移動したというエラーになりプログラムを起動できなくなりました。これが今回の問題で、特にUSBメモリでポータブルなアプリを持ち運んでいる場合は、PCにUSBメモリーを接続するたびにドライブレターが変る可能性があり、運用が大変になります。
このようなことが起きないようにするにはショートカットのパスの指定が絶対パスではなく相対パスになれば解決します。
それは「Cドライブのテストの下の…」といった、ドライブレターから指定するのではなく「自分の上のフォルダの下にあるbbbフォルダの下にある…」といった自分の位置から相対的に指定することで、ドライブレターや上位のフォルダ名に依存しない指定になるからです。
その具体的な方法がいくつか見つかりましたが、代表的な方法を2つ紹介し、それぞれの長所と短所について説明したいと思います。
1.ショートカットのリンク先を編集する方法
一つ目は、ショートカットはそのまま使い、パスの指定方法を工夫して相対パスにする方法です。この方法にも色々ありますが、最も簡単なのは以下のように相対パスの前に「%windir%\explorer.exe 」を付ける方法です。
%windir%とは、windows OSの本体となるファイルが置いてあるフォルダを示します。NT系では%systemroot%になっていますが、互換性のため%windir%も使えます。つまり、古いOSでも新しいOSでも使えるので、ここでは%windir%を使いました。
この部分を絶対パスで書いてもいいのですが、OSがCドライブにインストールされていないPC(あまりないでしょうが…)では動作しなくなります。
つまりプログラムやファイルを起動するときにエクスプローラーから起動すれば相対パスが使えるという訳です。
では、実際にTHEGUN.EXEのショートカットを以下のように相対パスに書き換えてみます。
THEGUN.EXEのショートカットは、アプリのアイコンからフォルダのアイコンに変ってしまいました。
しかし、このアイコンをダブルクリックすると問題なくTHEGUNを起動することができます。では、先程と同じように、上位の「test」フォルダの名前を変えて、このアイコンをダブルクリックしてみます。すると今回は問題なくTHEGUNを起動することができました。
これで、USBのドライブレターが変っても問題なくアプリを起動するショートカットを作ることができました。
では、ショートカットの先がアプリではなくフォルダーの場合はどうなるでしょうか?実際に「bbb」フォルダのショートカットを作って、ダブルクリックしてみると、フォルダは正常に開きますが、別窓として表示されます。
これは「bbb」フォルダをexplorerから開いているためで、通常のショートカットと動作が変ることに注意が必要です。
2.シンボリックリンクを使う方法
「シンボリックリンク」という言葉は、あまり知られていないと思いますが、UNIXというOSでは古くからよく使われており、非常に便利な機能です。
WindowsでもVistaから使えるようになっており、機能が提供されてから10年以上経ちますが、ほとんど利用されていないようです。
これは、シンボリックリンクを作ったり削除するなどの操作が標準ではコマンドプロンプトからしかできないことからだと思います。MicrosoftがGUIで設定できるようにするなど積極的な対応をしていないのも、この機能を使うにはシンボリックリンクを良く理解する必要があるので、そのようなユーザーだけが使えれば良いと考えているのではと思います。
では、具体的に「TH EGUN.EXE」と「bbb」フォルダのシンボリックリンクを「aaa」フォルダの下に作ってみます。
管理者でコマンドプロンプトを起動し、以下のようにすればシンボリックリンクを作成できます。同様にフォルダ「bbb」のシンボリックリンクも作成します。こちらはフォルダへのリンクですのでオプションの「/D」が必要になります。
作成されたシンボリックリンクは、以下のように表示されます。(ショートカットとついていないものがシンボリックリンク)
このように、シンボリックリンクは、アプリのアイコンを正しく表示します。またフォルダのシンボリックリンクをダブルクリックしても、別窓で表示されません。このとき注意が必要なのは、シンボリック先のパスが元々の「test\bbb」ではなく「test\aaa\bbb」になっていることです。つまりシンボリックリンクのフォルダは、本当にそこにフォルダがあるようにふるまうのです。
相対パスでリンク先を指定しているので、ショートカットの方法と同様に、ドライブレターが変っても上位のフォルダが変っても問題は発生しません。
3.長所と短所
ここで2つの方法を紹介しましたが、それぞれの長所と短所をまとめてみます。
(1)ショートカット方式
①長所
・作成が簡単
・通常のショートカットと同じ扱いで分かりやすい
②短所
・アプリのアイコンが変るので分かりにくくなる
・フォルダが別窓で表示される(短所ではないかもしれません)
(2)シンボリックリンク方式
①長所
・アプリの場合、アプリのアイコンで表示されるので区別しやすい
・フォルダの場合、通常のフォルダのように表示される
②短所
・作成が面倒(管理者権限のコマンドプロンプトで作成)
・フォルダの実態がどうなっているか意識する必要がある
こうして比較すると(1)のショートカット方式のほうが一般的には良いように思います。
アプリのアイコンを使用して分かりやすくしたければ、手間をかけてシンボリックリンクにする選択肢もありそうです。
最後にシンボリックリンクの操作を楽にするためのフリーソフトを紹介します。
窓の杜プレビューで紹介されている「エクスプローラ上で手軽にシンボリックリンクを作成「Link Shell Extension」」です。この記事作成のために、私も使ってみましたが、非常に簡単にシンボリックリンクを作成することができました。
シンボリックリンクは、うまく使うととても便利な機能ですが、充分その機能を理解して使用する必要があります。
今回、久々にシンボリックリンクを使ってみて、改めて効率化に活用できないか考えてみるきっかけになりました。
実際に業務で相対パスを使った運用が必要になりました。
あるアプリを起動するのですが、ショートカットで特定のオプションを指定するようにするのですが、ユーザーがフォルダを移動すると動かなくなる恐れがあるので、相対パスにすることにしました。
が、今回のようにアプリケーションにコマンドライン引数を渡そうとすると、この記事の方法ではうまくいきませんでした。
調べてみると以下で、その方法が紹介されていました。
=======================================================
https://www.projectgroup.info/tips/Windows/comm_0058.html
引数を指定する場合
%windir%\system32\cmd.exe /c start “%cd%” “相対パス” [引数…]
=======================================================
Windows10ですが無事うまく動作しています。
こちらの記事、非常に分かりやすいので参考になりました。