Programming Field

Mklink - DOS/コマンドプロンプト コマンド一覧

[Windows Vista以降] リンクファイルを作成します。シンボリックリンク/ハードリンク/ジャンクションポイント(ジャンクション)を作成できます。

※ NTFS/ReFSのファイルシステムでフォーマットされたディスクで使用できます。FAT/FAT32/exFATでは使用できません。
※ シンボリックリンクの作成には管理者権限(シンボリックリンク作成権限; SeCreateSymbolicLinkPrivilege)が必要です。ハードリンクやジャンクションの作成はその限りではありません。

構文

mklink [/D | /H | /J] <link-name> <target>

オプション一覧

/D | /H | /J /D または /H または /J のいずれかを指定するか、何も指定せずに実行します。それぞれ以下の意味を持ちます。
(未指定)
<target> にかかわらず、<link-name> という名前でファイルのシンボリックリンクを作成します。<target> が有効なファイルでない場合も成功しますがアクセスできないファイルとなります。
/D
<target> にかかわらず、<link-name> という名前でディレクトリのシンボリックリンクを作成します。<target> が有効なディレクトリでない場合も成功しますがアクセスできないディレクトリとなります。
/H
<link-name> という名前でファイルのハードリンクを作成します。<target> が有効なファイルでない場合は失敗します。
/J
<link-name> という名前でジャンクションを作成します。<target> が有効なディレクトリでない場合も成功しますがアクセスできないディレクトリとなります。
<link-name> 作成するリンクの名前(ファイル名/ディレクトリ名)を相対パスまたは絶対パスで指定します。既に存在するファイル/ディレクトリを指す名前である場合は失敗します。
<target>

リンクが指す先の名前を相対パスまたは絶対パスで指定します。ハードリンクの作成ではない場合は存在しないファイル名/ディレクトリ名も指定できますが、存在しないファイルやディレクトリを指すリンクにアクセスした場合に無効な名前エラーが発生します。

なお、シンボリックリンクを作成する場合、相対パスと絶対パスの指定には違いがあります。詳しくは解説をご覧ください。

※ Mklinkはコマンドプロンプト上で実行できるコマンドの1つであり、実行可能ファイル(アプリケーション)ではありません。
※ コマンドの実行に成功した場合は終了コードが 0、失敗した場合は 1 となります。

解説

Mklink使用例

MklinkコマンドはNTFS/ReFSファイルシステムでフォーマットされたドライブ上で利用できる「シンボリックリンク」「ハードリンク」「ジャンクション」の作成を行います。「ショートカット」を含め、それぞれの主な特徴は以下の通りです。

シンボリックリンク (symbolic link)
シンボリックリンクはその内部にファイル名を持ち、そのファイル名が指すファイルであるかのように振る舞います。シンボリックリンク自身がファイルとして、あるいはディレクトリとして作成され、それぞれ(リンク先の名前が何であるか・存在するかどうかにかかわらず)通常のファイルやディレクトリとして取り扱うことができます。
シンボリックリンクが指すリンク先のファイル/ディレクトリはシンボリックリンクと無関係に操作でき、それらのファイル/ディレクトリが移動または削除されたとしてもシンボリックリンクが内部に持つリンク先の名前は変化しません。なお、リンク先が存在しない場合は無効なファイル名(ディレクトリ名)として扱われます。
なお、ネットワーク越しに(ネットワーク上の共有フォルダー内にある)シンボリックリンクにアクセスすると、そのシンボリックリンクの参照先情報がアクセス元のコンピューターに対して適用され、アクセス元コンピューター上のファイル/ディレクトリにアクセスすることとなります。共有フォルダー内にシンボリックリンクが存在する場合はご注意ください。
※ 上記の問題を回避したい(共有フォルダーの元データがあるコンピューター上のデータを参照させたい)場合は、ファイルについてはハードリンクを、ディレクトリについてはジャンクションを利用することも検討ください。
ハードリンク (hard link)
ハードリンクはあるファイルの中身(ファイルデータや拡張データ、属性、ファイル日時などファイルに関係するものすべて)を共有します。実際にはリンク元/リンク先といった関係ではなく、同じファイルコンテンツに対して複数のファイル名が割り当てられているといった形になります。そのため、ハードリンクとして作成されたファイルは元のファイルと全く同じ扱いになります。また、ハードリンクが1つ作成された場合、一方のファイルが削除されてももう一方が削除されない限りコンテンツは残り続けます(もう一方も削除されると無くなります)。ただしファイルが複製されているわけではないため、一方のファイル名を利用して内容を編集すると、もう一方のファイル名でアクセスした際にはその内容が反映された状態となります。
シンボリックリンクはリンク先ファイルを削除して同名のファイルを新たに作成した場合、リンクはそのファイルを参照するようになりますが、ハードリンクで同様の操作を行っても新たなファイルを参照することはありません。
ジャンクション (junction point)
ジャンクションはその内部にディレクトリ名を持ち、そのディレクトリ名が指すディレクトリであるかのように振る舞います。基本的にはシンボリックリンクと同一ですが、シンボリックリンクより先に生まれた概念であり、いくつかシンボリックリンクと異なる仕様があります。例として、作成時は「ディレクトリに対してのみ有効」「(参照先に)ネットワーク上のパスなどを利用できない」「リンク内部で持つ名前は必ず絶対パスとなる」といった制約があり、エクスプローラー上などでジャンクションを別ディレクトリに移動すると、移動先に同名のディレクトリが作成されてジャンクションのリンク先ディレクトリの中身がすべて作成されたディレクトリに移動されます(この際ジャンクションとリンク先ディレクトリがそのまま残ります)。ただしMoveコマンドで移動した場合はジャンクションポイント自身が移動します。
シンボリックリンクと同様、リンク先のディレクトリは存在する必要はありません(逆にリンク先が存在しない場合はそのジャンクションは無効なディレクトリとして扱われます)。
なおシンボリックリンクと異なり、ネットワーク越しに(ネットワーク上の共有フォルダー内にある)ジャンクションにアクセスすると、その中身は実際にジャンクションが作成されたコンピューターにおけるリンク先のデータとなります。
※ NTFSではシンボリックリンクもジャンクションも「リパースポイント(再解析ポイント; reparse point)」という機能を利用して提供されています。リパースポイントにはシンボリックリンクやジャンクションの他にも種類があり、それらはいずれも「%」の拡張機能で取得できる属性に「l」文字が含まれます。
ショートカット
ショートカットはリンク先のファイル/ディレクトリ名をデータとして持つファイルです。拡張子は「.lnk」(ショートカットファイル)、「.pif」(MS-DOSプログラムショートカット)、または「.url」(インターネットショートカット)であり、ショートカットファイルを直接開くとリンク先情報などを含むバイナリデータにアクセスすることとなります。ショートカットファイルが指すリンク先を開く機能はOSのファイルAPIの機能ではなくシェルの機能(エクスプローラーなどが利用)として提供されています。そのため、シェルを介さずにショートカットファイルからリンク先を開くことは基本的にはできず、ショートカットファイル自体をリンク先ファイルとして扱うことはできません。
※ pifファイルはシステムレベルでサポートされているMS-DOSプログラムショートカットファイルであり、実行可能ファイルの一種として扱われます。pifファイルはMS-DOSのアプリケーションを特定の条件/設定で実行する際に利用されます。PIFエディター(Windows 3.1)やファイルのプロパティー(Windows 95以降)で編集できますが、MS-DOSプログラムを実行できない64ビット版Windowsではpifファイルを利用することができません。

シンボリックリンクについてはファイルとディレクトリの2種類があります。シンボリックリンクを作成する際にリンク先がファイルであるかディレクトリであるかにかかわらずリンクをファイルとディレクトリのどちらで作成するかオプションで指定します(/D を指定していればディレクトリ、指定しなければファイルとして作成します)。リンク先が存在しない場合、またはリンク先とリンク自身のファイル/ディレクトリが相違している場合(リンク先がファイルでリンク自身がディレクトリ、など)は、そのリンクをファイルまたはディレクトリとして利用することができません。

なお、ジャンクションはリンク先を絶対パスで保持するため <target> を相対パスで指定してもカレントディレクトリを元にした絶対パスにしますが、シンボリックリンクは <target> を相対パスで指定した場合その指定がそのままシンボリックリンクに含まれることになります。そして、その相対パスはカレントディレクトリではなくリンクが作成されたディレクトリを基準として取り扱われます。

  • <link-name> が「symlink1」、<target> が「..\target1」の場合、シンボリックリンク「symlink1」がカレントディレクトリに作成され、そのリンクはカレントディレクトリの親ディレクトリにある「target1」を指します。
    • その後、symlink1 が C:\Data ディレクトリに移動された場合、リンク先情報は「..\target1」が維持され、結果的に「C:\target1」を指すようになります。
  • <link-name> が「D:\MyFolder\symlink2」、<target> が「..\target2」の場合、シンボリックリンク「symlink2」が D:\MyFolder に作成され、そのリンクは「D:\target2」を指します。
    • その後、symlink2 が D:\Backup\20150924 ディレクトリに移動された場合、リンク先情報は「..\target2」が維持され、結果的に「D:\Backup\target2」を指すようになります。
  • <link-name> が「..\symlink3」、<target> が「X:\Hello\target3」の場合、シンボリックリンク「symlink3」はカレントディレクトリの親ディレクトリに作成され、そのリンクは「X:\Hello\target3」を指します。
    • その後、symlink3 が E:\Notes\Quarter ディレクトリに移動された場合でも、リンク先情報は「X:\Hello\target3」であるため、symlink3 は変わらず「X:\Hello\target3」を指します。

サンプル1

mklink P:\Options\MyApp.ini %CD%\myopts.ini

[拡張構文] カレントディレクトリにある「myopts.ini」を指すファイルシンボリックリンク「MyApp.ini」を「P:\Options」以下に作成します。シンボリックリンクのパスを絶対パスにするため拡張機能が有効になっているときに使用できる「CD」環境変数を用いています。

サンプル2

mklink /J E:\Dev\Include\ALib ..\ALib

カレントディレクトリの親にある「ALib」ディレクトリを指すジャンクションポイント「ALib」をディレクトリ「E:\Dev\Include」の中に作成します。ジャンクションは絶対パスで格納されるため、ジャンクション「E:\Dev\Include\ALib」を別の場所に移動してもリンクの参照先は変わりません。