Windowsのシンボリックリンクとショートカットはなんで別物なの?

当ページのリンクには広告が含まれています。
Windowsのショートカットとシンボリックリンクを比較し、見た目は似ていてもファイルとパスとして扱われる仕組みが異なることを示した図

ショートカットはWindows Shellがリンク先を開くための.lnkファイル、シンボリックリンクはファイルシステムが別のパスへ解決するリンクだから!

目次

見た目はそっくり、でも正体は別物

ショートカットは一般に.lnk拡張子で保存されるShell Linkです。リンク先のパスだけでなく起動時の引数、作業フォルダー、アイコンなどの情報を持てます。エクスプローラーやShell Linkを扱えるアプリが内容を解釈してリンク先を開きますが、ファイルシステムから見れば通常のファイルです。

シンボリックリンクはファイルシステム上の再解析ポイントとして作られるリンクです。通常のファイルアクセスではリンク先へ解決されるため、多くのコマンドやアプリはリンクのパスを通常のファイルやフォルダーと同じように扱えます。

コマンドプロンプトでdirを打つと違いがわかりやすいです。

cmd
dir
実行結果
2026/08/24 (月)  12:53    <SYMLINKD>     MyFolder [\Users\User1\Documents]
2026/04/05 (日)  15:59               753 shortcut.lnk

フォルダーへのシンボリックリンクは<SYMLINKD>という種類で表示されますが、ショートカットはあくまで「shortcut.lnkという名前の通常ファイル」として表示されます。これが両者の立ち位置の違いをそのまま表しています。

使い分けは「人が開くか」「パスとして使うか」

デスクトップからアプリやファイルを開くならショートカットが向いています。アイコンや起動時の引数を設定できるため人が操作する入口として便利です。

コマンドやアプリから別名のパスとしてアクセスさせたいなら、シンボリックリンクが向いています。通常のパスアクセスではリンク先へ解決されますが、作成権限、リンク先が存在しない場合の扱い、バックアップ時の動作には注意が必要です。

違いはtypeコマンドでも確認できます。ファイルへのシンボリックリンクならリンク先の内容が表示されますが、.lnkに対してtypeを実行するとショートカットファイル自体のバイナリデータが対象になります。start shortcut.lnkのようにWindows Shellへ処理を渡せばショートカットを開けます。

mklinkで作れるリンクは3種類

Windowsで mklink コマンドを使うと、シンボリックリンク以外にもハードリンクとジャンクションが作れます。似たような立ち位置なので混同しがちですが、性質はけっこう違います。

cmd
mklink /d MyFolder \Users\User1\Documents
mklink /h MyFile.file \Users\User1\Documents\example.file
mklink /j MyJunction \Users\User1\Documents
種類オプション指定対象別ドライブ・ネットワーク越え管理者権限
シンボリックリンクなし:ファイル
/d:フォルダ
ファイル
フォルダ
別ドライブ・UNCパスを指定可能
環境設定の影響あり
通常は必要
開発者モードなどの例外あり
ジャンクション/jフォルダのみ同じPC内の別ローカルボリュームを指定可能通常は不要
ハードリンク/hファイルのみ同じボリューム内のみ通常は不要

ジャンクションはWindows 2000の頃から存在する仕組みでNTFSの再解析ポイントを使用します。シンボリックリンクだけがVista以降に追加された比較的新しい仕組みとされていて、権限まわりの扱いも独自になっています。

シンボリックリンクの作成には通常、権限が必要

シンボリックリンクの作成には通常SeCreateSymbolicLinkPrivilegeという権限が必要です。既定ではAdministratorsグループに割り当てられていますが、ポリシーで別のユーザーへ割り当てることもできます。

Windows 10のビルド14972以降では開発者モードが有効ならmklinkを管理者として実行しなくてもシンボリックリンクを作成できます。そのため「開発者モードを無効にすると必ず管理者権限が必要」ではなく個別に作成権限が割り当てられている環境も例外です。

アプリ側から見るとこんなに挙動が変わる

代表的な挙動をまとめました。

ツールショートカットシンボリックリンク
コマンドプロンプト.lnkファイルとして扱う
startならリンク先を開ける
通常のパスとしてリンク先へアクセスできる
PowerShell通常のファイルとして扱う
Invoke-Itemならリンク先を開ける
New-Item -ItemType SymbolicLinkで作成できる
Git for Windows通常のファイルとして扱うcore.symlinksの設定に応じてリンクとして復元する
Java(NIO.2)通常のファイルとして扱うFiles.createSymbolicLink()で作成できる
robocopy通常のファイルとしてコピーする既定ではリンク先をたどる
/SLならリンク自体をコピーする

Gitはシンボリックリンクを含むリポジトリをWindowsでcloneしたときcore.symlinksfalseだとリンク先のパスが書かれた通常ファイルとして展開します。既存リポジトリで有効にする場合は、そのリポジトリ内でgit config core.symlinks trueを実行します。変更後は未保存の作業を保護したうえで、再チェックアウトが必要になる場合があります。

Javaではjava.nio.file.Files.createSymbolicLink()でシンボリックリンクを作成できます。Windowsの開発者モードを利用した非昇格での作成にはJDK側の対応も必要で、JDK 13から対応しました。JDK 12以前や古いJava 8環境では、開発者モードが有効でも権限不足になる可能性があります。

robocopyは既定ではシンボリックリンクのリンク先をたどります。リンク先の内容ではなくシンボリックリンク自体をコピーする場合は/SL、ジャンクション自体をコピーする場合は/SJを指定します。ジャンクションをコピー対象から除外するオプションが/XJです。目的によって使い分けてください。

cmd
robocopy C:\source D:\backup /E /SL

自分の環境でも確認しておきたいコマンド

自分の環境でリンクの正体を確かめる方法も置いておきます。管理者権限のコマンドプロンプトで以下を実行すると、対象が本当に再解析ポイント(シンボリックリンクやジャンクション)になっているかどうかを直接確認できます。

cmd
fsutil reparsepoint query C:\path\to\link

ショートカットに対してこれを実行するとエラーになるはずです。ショートカットはあくまでただのファイルであって、ファイルシステムレベルのリンクではないからですね。


身近なIT用語の「なんで?」をゆるく知りたい方はIT雑学・ぷちQAカテゴリもあわせてどうぞ。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次