Windowsのシンボリックリンクは、あるパスに置いた小さな参照を通じて、別の場所にあるファイルやフォルダを開けるようにするNTFSの機能です。この記事では、コマンドプロンプトのmklinkとPowerShellのNew-Itemでの作成・確認・削除を、コピーして動かせるコマンド付きで解説します。作成時に出る「十分な特権がありません」というエラーを、開発者モードとユーザー権利の設定で解消する方法、GitやNode.js・Pythonで扱うときの設定も扱います。仕様と版番号は2026年10月5日時点のMicrosoft公式ドキュメントと各プロジェクトの公式文書で確認した値です。
まとめ:Windowsのシンボリックリンクはmklinkと開発者モードで作る
作り方は、管理者として開いたコマンドプロンプトでmklink リンク名 リンク先を実行するだけです。フォルダなら/Dを付けます。毎回の管理者起動が手間なら、Windowsの開発者モードをオンにすると、一般ユーザーの権限のまま作れるようになります。
種類の選び方は単純です。ローカルのフォルダを別ドライブへ逃がすだけならジャンクション(/J)で足り、権限の設定も要りません。ファイル単位で張りたい場合、相対パスでリポジトリに含めたい場合、ネットワーク共有を指したい場合にだけシンボリックリンクを選びます。削除はリンクだけをrmdirかdelで消し、リンク先の実体には触れない手順を守ってください。
Windowsのリンク4種類の違いとシンボリックリンクを選ぶ基準
Windowsには「別の場所を指す」仕組みが4つあり、検索で見つかる手順が混ざりやすい原因になっています。最初に違いを押さえます。
シンボリックリンク・ジャンクション・ハードリンク・ショートカット比較
シンボリックリンク・ジャンクション・ハードリンクの3つはファイルシステムが解決する仕組みで、どのアプリから開いても同じように動きます。ショートカット(.lnk)だけはエクスプローラーが解釈する普通のファイルで、コマンドやプログラムからは.lnkファイルそのものに見えます。
| 種類 | 作成コマンド | 対象 | 別ドライブ・共有 | 作成に要る権限 |
|---|---|---|---|---|
| シンボリックリンク | mklink、mklink /D | ファイル・フォルダ | どちらも可 | 管理者か開発者モード |
| ジャンクション | mklink /J | フォルダのみ | ローカルの別ドライブのみ | 不要 |
| ハードリンク | mklink /H | ファイルのみ | 同じドライブ内のみ | 不要 |
| ショートカット | エクスプローラー | ファイル・フォルダ | どちらも可 | 不要 |
実務で迷うのは、シンボリックリンクとジャンクションの二択です。ジャンクションは作成時にリンク先を絶対パスへ変換して記録するため、リンク先ごとフォルダを移動すると切れます。シンボリックリンクは相対パスをそのまま記録できるので、リポジトリの中で完結するリンクに向く仕組みです。ハードリンクは同じファイルに名前を2つ付ける仕組みで、片方を消しても中身は残ります。
ファイル用とディレクトリ用で種類が作成時に固定されるWindowsの仕様
LinuxやmacOSのシンボリックリンクは、リンク先がファイルかフォルダかを区別しません。Windowsでは作成時に「ファイル用」か「ディレクトリ用」かを決めて記録し、あとから変わりません。CreateSymbolicLinkW関数のリファレンスでも、フラグSYMBOLIC_LINK_FLAG_DIRECTORY(0x1)の有無で種類を指定する仕様になっています。
フォルダを指すのに/Dを付け忘れると、リンクはできても開けません。リンク先がまだ存在しない状態で作るときに起きやすい失敗です。種類を間違えたら、削除して作り直すほかに直す方法はありません。
mklinkコマンドでシンボリックリンクを作成・確認・削除する手順
mklinkはコマンドプロンプトの内部コマンドです。PowerShellから直接は呼べないため、PowerShellで使うときはcmd /c mklink ...の形にします。コマンド操作そのものに慣れていない場合は、CLIの仕組みとGUIとの使い分けの解説を先に読むと手順を追いやすくなります。
管理者のコマンドプロンプトでmklinkの/D・/J・/Hを使い分ける例
Microsoft Learnのmklinkリファレンスの構文はmklink [[/d] | [/h] | [/j]] <link> <target>です。引数は「作るリンク名」が先、「リンク先」が後で、Linuxのln -sとは順番が逆になります。
rem ファイルのシンボリックリンク(オプションなし)
mklink C:\work\app\.env C:\secrets\app\.env
rem フォルダのシンボリックリンク(/D)。相対パスはリンクを置く場所が起点
cd C:\work\app
mklink /D shared ..\shared-config
rem フォルダのジャンクション(/J)。管理者権限は不要
mklink /J C:\Users\%USERNAME%\cache D:\cache
rem ハードリンク(/H)。同じドライブ内のファイルのみ
mklink /H C:\work\backup\report.xlsx C:\work\report.xlsx
成功すると「…のシンボリック リンクが作成されました」のように、作った種類が表示されます。リンク名と同じ名前のファイルやフォルダが既にあると失敗するので、移動してから実行してください。パスに空白を含む場合は、リンク名とリンク先の両方を"で囲みます。
dir /ALとfsutil reparsepoint queryで種類・参照先の確認
作ったリンクは、dirに属性/AL(再解析ポイント)を付けると一覧できます。種類が<SYMLINK>(ファイル)、<SYMLINKD>(フォルダ)、<JUNCTION>で表示され、角かっこの中がリンク先です。
rem カレントフォルダのリンクだけを表示する
dir /AL
rem 表示例
rem 2026/10/05 10:12 <SYMLINKD> shared [..\shared-config]
rem 2026/10/05 10:13 <JUNCTION> cache [D:\cache]
rem 再解析ポイントの中身を確認する
fsutil reparsepoint query C:\work\app\shared
fsutil reparsepoint queryの出力では、タグ値0xa000000cがシンボリックリンク、0xa0000003がジャンクションです。エクスプローラーではリンクのアイコンに矢印が付きますが、シンボリックリンクとジャンクションの区別は付かないため、種類の確認はコマンドで行います。
rmdirとdelでリンクだけを消し、リンク先の実体を残す削除手順
削除で消えるのはリンクだけで、リンク先の実体は残ります。ただし、削除に使うコマンドは、ファイル用とディレクトリ用のリンクの種類に合わせた選択が必要です。CreateSymbolicLinkWのリファレンスにも、ファイル用のリンクはファイルとして、ディレクトリ用のリンクはディレクトリとして削除すると書かれています。
rem フォルダのシンボリックリンク・ジャンクションを消す
rmdir C:\work\app\shared
rem ファイルのシンボリックリンク・ハードリンクを消す
del C:\work\app\.env
フォルダのリンクを消すときに/Sを付けたり、リンクを開いた中でファイルを選んで消したりすると、リンク先の実体を消してしまいます。削除前にdir /ALでリンクであることを確かめ、オプションなしのrmdirで消す手順を徹底してください。
PowerShellのNew-Itemでシンボリックリンクを作る方法と版ごとの差
PowerShellではNew-Itemコマンドレットで同じことができ、作成後の一覧や検査もスクリプトにしやすくなります。Windows PowerShell 5.1とPowerShell 7系では挙動に差があるので、7系を使う前提で説明します。導入がまだならPowerShell 7.6 LTSのインストール手順を参照してください。
New-Item -ItemType SymbolicLinkの構文と相対パス対応版
New-Itemの公式リファレンスでは、ファイルシステム上で-ItemTypeにSymbolicLink・Junction・HardLinkを指定できます。-Targetは-Valueの別名です。
# ファイルへのシンボリックリンク
New-Item -ItemType SymbolicLink -Path .\link.txt -Target .\Notice.txt
# フォルダへのシンボリックリンク(相対パス。7.1以降)
New-Item -ItemType SymbolicLink -Path .\shared -Target ..\shared-config
# ジャンクション(管理者権限は不要)
New-Item -ItemType Junction -Path "$env:USERPROFILE\cache" -Target D:\cache
# 作成結果の確認
Get-Item .\shared | Select-Object Name, LinkType, Target
相対パスでの指定はPowerShell 6.2より前では使えず、フォルダへの相対パスは7.1から対応しています。5.1で相対パスを渡す手順書は動かないことがあるので、社内手順は7系にそろえるか、絶対パスで書きます。7.4からは-Forceで既存のジャンクションを上書きできるようになりました。
LinkTypeとTargetを使って壊れたリンクを一括で探すスクリプト
リンク先のフォルダを移動・削除すると、リンクは残ったまま開けなくなります。次のスクリプトは指定フォルダ配下のシンボリックリンクとジャンクションを集め、リンク先が存在しないものだけを表示します。
$root = "C:\work"
Get-ChildItem -Path $root -Recurse -Force -Attributes ReparsePoint -ErrorAction SilentlyContinue |
Where-Object { $_.LinkType -in 'SymbolicLink', 'Junction' } |
ForEach-Object {
$target = @($_.Target)[0]
# 相対パスのリンクは、リンクを置いたフォルダを起点に解決する
if (-not [System.IO.Path]::IsPathRooted($target)) {
$target = Join-Path (Split-Path $_.FullName -Parent) $target
}
[pscustomobject]@{
Link = $_.FullName
Type = $_.LinkType
Target = $target
Exists = Test-Path -LiteralPath $target
}
} |
Where-Object { -not $_.Exists } |
Format-Table -AutoSize
PowerShell 7系のGet-ChildItem -Recurseは、既定ではリンクの先へ潜りません。リンクが自分の親フォルダを指して無限に辿る事故を避けられるので、この既定のまま使います。
「十分な特権がありません」エラーの原因と権限設定で解消する3つの方法
管理者でないコマンドプロンプトでmklinkを実行すると、「この操作を実行するための十分な特権がありません。」(英語版では「You do not have sufficient privilege to perform this operation.」)と表示されて失敗します。原因は、シンボリックリンクの作成が既定で管理者にしか許可されていないことです。
開発者モードをオンにして管理者昇格なしでフォルダやファイルのリンクを作る手順
Windowsブログの「Symlinks in Windows 10!」(2016年12月2日)によると、Insider Preview build 14972から、開発者モードが有効なら管理者として起動しなくてもシンボリックリンクを作れるようになりました。Git for Windowsの解説では、正式版での対応をWindows 10 バージョン1703(Creators Update)以降としています。
有効化は設定アプリで行います。Microsoftの開発者向け設定の解説によると、スイッチの場所はWindows 11 25H2で変わり、25H2以降は[システム]配下のAdvancedページにある「For developers」セクション、それより前の版は独立した「開発者向け」ページです。オンにする操作自体には管理者権限が必要で、組織が管理するPCでは無効化されている場合があります。
rem 管理者のコマンドプロンプトで開発者モードを有効にする(同じ解説にある方法)
reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock" /t REG_DWORD /f /v "AllowDevelopmentWithoutDevLicense" /d "1"
注意点は、開発者モードは「許可」にすぎないことです。アプリ側がAPI呼び出しでフラグSYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE(0x2)を渡さないと、昇格なしの作成は成功しません。古いツールが開発者モードでも失敗するのはこのためです。
ローカルセキュリティポリシーでシンボリックリンクの作成権限を付与
開発者モードを社内規定で使えない場合は、ユーザー権利を個別に付与します。「Create symbolic links」ポリシーの解説によると、権利の定数名はSeCreateSymbolicLinkPrivilegeで、クライアントPCの既定の付与先はAdministratorsグループだけです。
secpol.mscを開く(Home エディションには無いため開発者モードを使う)- [ローカル ポリシー]→[ユーザー権利の割り当て]→[シンボリック リンクの作成]を開く
- 対象のユーザーかグループを追加する
- いったんサインアウトして、サインインし直す
変更は再起動なしで有効になり、対象アカウントが次にサインインしたときから効きます。ドメイン環境では、グループポリシーでまとめて配布するほうが管理しやすくなります。
ネットワーク共有のリンクが開けないときのsymlinkevaluation設定
作成はできても、ファイルサーバー上のリンクを開けないことがあります。原因は、どの経路のシンボリックリンクを辿ってよいかを決めるシステム設定です。fsutil behaviorのリファレンスでは、ローカルからローカル(L2L)、ローカルからリモート(L2R)、リモートからローカル(R2L)、リモートからリモート(R2R)の4経路を個別に許可・禁止できます。
rem 現在の設定を確認する(管理者のコマンドプロンプト)
fsutil behavior query symlinkevaluation
rem リモート上のリンクがリモートを指す経路(R2R)を許可する
fsutil behavior set symlinkevaluation R2R:1
リモートからローカルを指す経路(R2L)は、共有フォルダに置かれたリンクが、開いた人のPCのファイルを指すことを意味します。悪用されると利用者のローカルファイルを読ませる経路になるため、業務上の必要が説明できない限り許可しない方針を勧めます。
GitやNode.js・Pythonでシンボリックリンクを扱うときの設定とコード
Windowsで困る場面の多くは、手作業ではなく開発ツールがリンクを作るときに起きます。代表的な3つの扱いを示します。
Git for Windowsのcore.symlinks=true設定とリンク復元
LinuxやmacOSで作られたリポジトリにシンボリックリンクが含まれていると、Windowsでクローンしたときにリンク先のパスが書かれた小さなテキストファイルになることがあります。git-configの公式文書では、core.symlinksの既定はtrueですが、git cloneやgit initが環境を調べて、必要ならfalseに設定すると説明されています。
# 開発者モードを有効にしたうえで、リンクを有効にしてクローンする
git clone -c core.symlinks=true https://github.com/example/repo.git
# 既存のクローンを直す場合(未コミットの変更が無いことを確認してから)
git config core.symlinks true
git checkout -- .
# リンクとして記録されているファイルを確認する(モード120000がリンク)
git ls-files -s | findstr "^120000"
Git for Windowsの解説によると、Windowsのリンクはファイル用とディレクトリ用の区別が必要なため、Gitが種類を判定して作り分けます。Git for Windows本体の版の確認と更新はGit for Windows最新版の確認・更新方法にまとめています。
Node.jsのfs.symlinkとPythonのos.symlinkの種類指定
言語のランタイムからリンクを作る場合も、Windowsで問題になるのはリンクの種類の指定です。Node.js v26.10.0のfsモジュール文書では、fs.symlinkの第3引数typeはWindowsでのみ有効で、'dir'・'file'・'junction'を指定できます。省略するとリンク先の実体を見て自動判定し、リンク先が無いときは'file'になります。
// Node.js(ESM)
import { symlink } from 'node:fs/promises';
// フォルダへのシンボリックリンク(開発者モードか管理者が必要)
await symlink('../shared-config', './shared', 'dir');
// ジャンクション(権限不要。target は絶対パスへ自動変換される)
await symlink('D:\\cache', 'C:\\work\\cache', 'junction');
# Python 3.8以降
import os
# リンク先がまだ無いフォルダを指すときは target_is_directory=True を明示する
os.symlink(r"..\shared-config", r".\shared", target_is_directory=True)
Pythonのosモジュール文書では、開発者モードによる昇格なしの作成への対応は3.8からで、権限が無い場合はOSErrorになります。pnpmのように依存パッケージをリンクで配置するツールがWindowsで動く理由も、このリンクの種類の使い分けにあるのです。仕組みはpnpmの共有ストアの仕組みの解説で扱っています。
開発環境でシンボリックリンクを使う場面と使わない場面の判断基準
シンボリックリンクは便利な反面、リンクの存在を知らないツールや人に対しては、見えない依存関係になります。採用と見送りの線引きを示します。
採用する場面:設定ファイルの集約と大容量フォルダの別ドライブ退避
採用してよいのは、リンクの存在を自分か自分のチームが把握できる範囲です。効果が大きい順に挙げます。
- 大容量のキャッシュやデータのフォルダを、Cドライブから別ドライブへ移す(ジャンクションで足りる)
- 複数のプロジェクトで共有する設定ファイルを、1か所の実体にまとめる
- LinuxやmacOSと共有するリポジトリで、既にリンクとして記録されているファイルを正しく復元する
1つ目はアプリが固定のパスを使う場合の定番の対処で、管理者権限も開発者モードも要らないジャンクションを先に検討します。シンボリックリンクにするのは、ファイル単位のリンクや相対パスが必要になったときだけで十分です。
見送る場面:一般利用者のPCへの権限付与と共有サーバー上のリンク
次の場合は、シンボリックリンクを使わない判断をします。1つ目は、業務アプリの導入手順として一般利用者のPCに作成権限を配ることです。Microsoftのポリシー解説は、この権利を信頼できる利用者だけに与えるよう警告しており、リンクを想定していないアプリの権限変更やデータ破壊に悪用されうると説明しています。
2つ目は、ファイルサーバーの共有フォルダにリンクを置いて利用者に見せる構成です。前述のsymlinkevaluationの設定が各PCで揃っていないと、開ける人と開けない人が分かれ、問い合わせの原因になります。共有フォルダの付け替えが目的なら、DFS名前空間やドライブの割り当てで解決するほうが運用は安定します。
Windows・Mac・Linux混在チームでリポジトリを設計するときの確認項目
OSが混在する開発チームでは、リポジトリにシンボリックリンクを含めるかどうかを最初に決めておきます。含めるなら、Windowsの開発者全員の開発者モードとcore.symlinksの設定、CIのWindowsランナーでの同じ設定、リンク先を相対パスにする規約の3点がそろって初めて動きます。どれか1つでも欠けると、特定の人の環境だけでビルドが失敗する原因になるのです。
モノレポで共有ライブラリをリンクでつなぐ設計は特に影響範囲が広く、モノレポの構成と導入手順で扱う論点と合わせて検討が必要です。一創では、OS混在チームのリポジトリ設計からCIのランナー構成までをDevOps・CI/CD導入支援として請け負っています。
よくある質問
Windowsのシンボリックリンクについて、検索で多い質問に答えます。
シンボリックリンクとショートカットは何が違いますか?
シンボリックリンクはファイルシステムが解決するため、コマンドプロンプトやプログラムから開いてもリンク先の実体として扱われます。ショートカットは.lnkという普通のファイルで、リンク先を開くのはエクスプローラーだけです。プログラムの設定ファイルの場所を付け替えたい場合、ショートカットでは効果がありません。
シンボリックリンクを削除するとリンク先のファイルも消えますか?
リンクだけを削除すれば、リンク先の実体は残ります。フォルダのリンクはオプションなしのrmdir、ファイルのリンクはdelで消してください。リンクを開いた中のファイルを選んで消すと、それはリンク先の実体を消す操作になります。
エクスプローラーの操作だけでシンボリックリンクを作れますか?
Windows標準のエクスプローラーには、シンボリックリンクを作るメニューがありません。作成はコマンドプロンプトのmklinkか、PowerShellのNew-Itemで行います。ショートカットの作成メニューはありますが、前の質問のとおり別の仕組みです。
作ったシンボリックリンクのリンク先を後から変更できますか?
mklinkにはリンク先を書き換えるオプションがないため、いったん削除して作り直します。PowerShell 7.4以降では、ジャンクションに限りNew-Item -Forceで上書きできます。いずれの方法でも、リンクの種類(ファイル用かディレクトリ用か)を作り直しの際に正しく指定してください。
WSLのLinuxからWindows側のフォルダへリンクを張れますか?
WSLのLinux側ではln -sでリンクを作れますが、その扱いはLinuxのファイルシステム上か/mnt/c配下かで変わります。Windowsのアプリからも開けるリンクが必要なら、Windows側でmklinkを使って作るほうが確実です。WSLの開発環境づくりはWSLで開発環境を構築する手順で解説しています。
関連記事
- Git for Windows 最新版の確認・ダウンロード・更新方法【2026年最新】:core.symlinksを使う前提となるGit本体の更新手順
- pnpmとは?共有ストアの仕組みとv12のRust実装・モノレポ運用を解説:リンクで依存パッケージを配置するツールの仕組み
- PowerShellのインストール手順|7.6 LTSをwinget・MSI・Linux・macOSで入れる:New-Itemの相対パス指定に必要な7系の導入
- WSL2とは|WSL1との違い・仕組み・インストール方法とメリット/デメリットを解説:WindowsとLinuxのファイルシステムの関係
- モノレポ(Monorepo)とは?マルチレポとの違い・メリット・デメリットと導入手順:リンクを含むリポジトリ設計の判断材料