Windowsのシンボリックリンクをmklinkで作る、ジャンクションとの違いとrmdirで消す理由

複数のプロジェクトで同じ設定ファイルを使い回したい、容量の大きいキャッシュを別の場所へ逃がしたい。開発をしていると、こういう場面でシンボリックリンクが欲しくなる。LinuxやmacOSならln -sの1行で済む話だが、Windowsではリンクの種類が3つあり、作れるかどうかが権限や設定で変わり、消し方を間違えると元のファイルまで消える。毎回なんとなく調べ直しているので、ここで一度まとめておく。 確かめた環境は、手元のWindows 11(ビルド26300)、標準のWindows PowerShell 5.1(5.1.26100)、Git for Windows 2.55、Node.js 24.19だ。一時フォルダの中に作業用のフォルダを作り、リンクを作る、フォルダごと動かす、消す、Gitで取り出す、という操作を順に試した。結果は最後に表にしている。 Windowsのリンクは3種類、まず何が違うのか ハードリンクは同じボリュームの中でしか作れない。ディスクをまたぐならジャンクションかシンボリックリンクを使うPhoto: Mk2010 / CC BY 4.0 WindowsのNTFSで使えるリンクは、シンボリックリンク、ジャンクション、ハードリンクの3つだ。コマンドプロンプトのmklinkで、オプションを変えるとそれぞれを作り分けられる。何も付けなければファイルのシンボリックリンク、/Dでフォルダのシンボリックリンク、/Jでジャンクション、/Hでハードリンクになる。 シンボリックリンクは、いちばんln -sに近いものだ。ファイルにもフォルダにも使え、行き先を相対パスで書ける。ネットワーク上の共有フォルダを指すこともできる。Windows Vistaから使えるようになった。 ジャンクションは、それより前のWindows 2000の時代からある、フォルダ専用のリンクだ。行き先は同じパソコンの中のドライブに限られ、パスは絶対パスで保存される。権限の面ではいちばん気軽で、一般ユーザーのまま作れる。 ハードリンクは性質がまったく違う。1つのファイルの実体に、名前を2つ付けるしくみで、どちらが本物という区別がない。ファイル専用で、同じボリュームの中でしか作れない。手元でハードリンクの側に1行書き足すと、元のファイルの中身も同じように増えていた。片方の名前を消しても、もう片方の名前が残っていればファイルの中身は消えない。 dirで一覧を出すと、この違いがそのまま見える。シンボリックリンクは<SYMLINK>か<SYMLINKD>、ジャンクションは<JUNCTION>と表示され、角かっこの中に行き先が出る。ハードリンクは普通のファイルと見分けがつかない。 管理者権限が要るのはシンボリックリンクだけ、開発者モードで外せる Windows 10 Mobileの「開発者向け」設定。パソコン版のWindowsにも同じ名前の画面があり、そこで開発者モードをオンにするPhoto: The Microsoft Corporation / Public domain シンボリックリンクを作るには、本来は「シンボリックリンクの作成」という特権が必要で、既定では管理者にしか与えられていない。ジャンクションとハードリンクにはこの制限が無い。開発ツールがフォルダのリンクにジャンクションを好んで使うのは、権限で失敗しないからだと思う。 この制限は、Windows 10のCreators Update(バージョン1703)から緩くなった。設定の「開発者向け」で開発者モードをオンにしておくと、一般ユーザーでもシンボリックリンクを作れる。ただし作る側のプログラムが、API(CreateSymbolicLink)に「特権なしでの作成を許可する」という専用の値(SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE)を渡している場合に限られる。開発者モードをオンにしただけで、どのツールでも作れるようになるわけではない。 手元のパソコンは開発者モードがオンで、作業したユーザーは管理者ではない。この状態で4種類を作り比べた結果が次の表だ。 作り方 種類 結果 mklink / mklink /D シンボリックリンク 作成できた mklink /J / mklink /H ジャンクション・ハードリンク 作成できた PowerShell 5.1のNew-Item -ItemType SymbolicLink シンボリックリンク 「この操作には管理者特権が必要です」で失敗 PowerShell 5.1のNew-Item -ItemType Junction / HardLink ジャンクション・ハードリンク 作成できた Node.jsのfs.symlinkSync(dir・junction・ファイル) 3種とも 作成できた 意外だったのはPowerShell 5.1だ。同じウィンドウのmklinkは通るのに、New-Itemでシンボリックリンクを作ろうとすると、開発者モードがオンでも管理者権限を求められて止まった。5.1しか無い環境でスクリプトからシンボリックリンクを作るなら、cmd /c mklinkを呼ぶのがいちばん確実だった。PowerShell 7は手元に入っていないので、こちらは確かめていない。 ...

2026年10月20日 · 1 分 · 180 文字 · kingsworksub-jpg