Windowsの「ショートカット」は相対パスを記述出来なくて

Unixではなんてことのない「リンク先として相対パスを指定する」が Windows で出来ないことなんか、きっと今更なことで。

もう5年以上前だったと思うんだけど、どうしてもこれ:

をなんとかしたくて、ちょっとしたアイディアをチームで使ってたことがあって。ちょいと紹介してみたい。

そもそもなんでショートカットに相対パスを書きたいかと言えば。大きな組織、大きな開発になればなるほど、「サブチームごとには階層が維持し続けられても、マイルストーンのたびに比較的フォルダ構成の大改編に振り回されがち」だから。階層一つ二つ深いところに移動させられるなんか日常茶飯事。

きっとこんなじゃない? あなたの所属する「大企業」では:

トップレベルがサブプロジェクトで切られている場合も多いとは思うけれど、構成が深くて迷子になりやすいのは、たいがい一緒と思う。だから普通でも Windows ネイティブのショートカットは多用されてるでしょう? で、根っこの構成変更のとき、ショートカットをチマチマ直す? 諦めて保守やめることも多いよねぇ。

で、5年くらい前、の話。「皆が Python インストールしてる前提なら、ダブルクリックで起動するのだから…」と発想した:

ツリーから手繰るのが好きな人には向かないと思うし、見ての通り「黒いよー」ので、いやな人はいやだろうけど、これね、お手軽なんです:

プログラム設計へのショートカット.py
 1 # -*- coding: utf-8 -*-
 2 # Python 2.7 、かつ、日本語版 Windows 用。
 3 
 4 # 以下を好きに…
 5 target = u"../../03_プログラム設計らしき/02_含蓄生成更新処理"
 6 
 7 import os
 8 import sys
 9 from subprocess import Popen
10 Popen(["explorer", os.path.abspath(target.encode("cp932"))])

「target」部分を書き換えれば良い、ってわけね。本物のショートカットよりは少しだけ簡単ではないかもしれないけど、それでもお手軽でしょ。

それにしてもまぁ…Windows 9x 時代にやってしまった「若気の至り(やっちまったなぁ仕様)」に今でも苦しめられるんだもんなぁ。


2022-02-26追記:
今から7年近く前に書いた「5年ほど前」ネタに今更追記するのもなんだなぁとは思う。ただ、ここ数ヶ月、ちょっと近いことをやってたのもあるし、これを書いた後も関係するネタをちょいちょい書いてたんで、どうもこのネタ、食いついてる人も結構いるみたいなんで、一応。

関連するネタは…結構いっぱい書いてたハズ…:

PC の文脈で「ショートカット」という場合、文字通り「機能や場所への近道」となる機能のこと。そして、同じく PC では、OS によらず概ね大きく二種類の手段でそれを提供しようとしてきた。二種類、とは、「OS に近い層で提供されるもの」と「シェル以上の層で提供されるもの」、もっと具体的に言えば「ファイルシステムのレベル」と「アプリケーションが独自に解釈する特殊ファイルもしくはそういう(ランチャ)アプリケーション」。

かつて Windows がそれほど世界を席巻していなかった頃、Unix 対 Windows の対立軸がこの「ショートカット」の文脈で語られる場合、話は結構単純だった。Unix は「前者はあるが後者(の標準)はない」、Windows は「後者はあるが前者はない」であった。その「Windows における後者」こそが今ここで話題にした「.lnk」で、Windows も Windows NT4、Windows 9x/Me の時代までは本当にこれしかなかった。この「.lnk」は Windows という OS ではなく「エクスプローラ」という一つのアプリケーション(シェル)の機能に過ぎない。「インターネットショートカット」も同じ。ともに特別なフォーマットの普通のただのファイルである。

状況が変わったのは Windows 2000 時に登場した NTFS5 から。ここでようやく Unix の ln で出来ること、つまり「ファイルシステムレベルで提供されるリンク」が使えるようになった。けれどもこの機能は長らく Windows のシェルチームから黙殺され続け、「ちゃんと」実用的になったのは、なんと、Windows 7 よりも後からだ。というのもエクスプローラがこれに一切関与しなかったため、「リンクであるかそうでないか」を誰も区別できなかったのである。つまり「実体を削除するのではなくリンクを切りたいだけ(近道を閉じたいだけ)」が出来なかった。(特殊なソフトウェアをわざわざ入手して使わない限りは。)だからワタシはこの「Windowsの「ショートカット」は相対パスを記述出来なくて」ネタを書いた時点でもこの「ファイルシステムレベルで提供されるリンク」は知っていたけれど、紹介しようとはしなかった。危険過ぎるので。

Windows 10 になって、「危険過ぎる」というほどではなくなった。エクスプローラがちゃんとシンボリックリンク(junction)を視覚的に区別出来るようにしてくれたからだ。そして、最近のモダンな言語の中には、この「Windows (NTFS5)で実現出来るハードリンク、シンボリックリンク」を標準ライブラリのレベルで使えるようにしてくれているものも出てきた。それについて書いたのが「束にしてくりんなGo! (bundle, CLI)」。とにかく「Windowsの「ショートカット」は相対パスを記述出来なくて」を書いた頃よりはずっと「Unix とほぼ同じリンク」を使いやすくなってるので、是非 .lnk だけに拘らず、そちらも考えてみて欲しい。

なお、大事なのでもう一度言うけれど、「NTFS5」だからね? いまでも「フォーマット済」を謳う USB メモリなどの外部ストレージは「FAT32」でのフォーマットが多いので、そうしたデバイスでも「Unix とほぼ同じリンク」を使いたければ、フォーマットし直す必要がある、てことだよ。いまどき「FAT32でないと海に飛び込むから!」なんて機器はほぼ絶滅してるので安心してフォーマットし直せばいいはいいんだけど、人によっては結構勇気のいることに思えるかもしれんので一応。そもそも NTFS フォーマットにしとけば圧縮フォルダや暗号化フォルダも使えるんだから、とっととフォーマットし直せばいいとワタシは思うよ。

あと最後に。「Windows の .lnk はクソだっ」て単純な話ではないんだよ、誤解はしたらいかんよ。どちらかというと Windows の .lnk は、Unix シェルの alias にこそ近い。つまり、「ファイル・フォルダ、という実体を指すリンク」だけを担おうとしたものではなくて、「なにがしかの起動手続きの事前準備」ということなのだ。ゆえに Windows については「ファイルシステムレベルで提供されるリンク」がなかったことだけが罪なのであって、「.lnk があったことが罪」なのとは違う。まぁ機能不足だからこそ文句を言いたくなるわけだけどね、けどそれはそれ。