Windowsでシンボリックリンク(Symlink)を作成する方法

シンボリックリンク(またはシンボリックリンク)はちょっと変わっていますが、使い方を覚えると非常に便利です。ファイルやフォルダへのショートカットのようなものですが、ファイルシステムに直接組み込まれているため、Windowsでは本物のように動作します。実際には、シンボリックリンクは主にシステム調整に使用されます。例えば、大きなフォルダを別のドライブに移動してもシステムに影響がないようにしたり、SMBサーバー上のネットワーク共有をZIP形式で移動したりといった用途です。正直なところ、シンボリックリンクがないと、Windowsは必ずしもスムーズにファイルを移動できるとは限らないため、複雑な設定の管理は面倒になります。

難しいのは、Windows ではハードリンク、ジャンクション、シンボリックリンクという異なる種類のリンクが用意されており、それぞれに癖があるということです。ハードリンクはローカルファイル、ジャンクションはディレクトリ(ローカルまたはリモート)に関連し、シンボリックリンクはどちらにも使用できます。特にドライブやネットワークをまたいでシームレスなアクセスが必要な場合は、シンボリックリンクを使用するのが一般的ですが、シンボリックリンクの作成にはコマンドラインの魔法のような操作が必要です。そしてもちろん、グループポリシーをいじらない限り、管理者権限が必要です。手順自体はそれほど複雑ではありませんが、ワンクリックで完了するわけでもありません。

Windows でシンボリック リンクを作成する方法

方法 1: コマンドプロンプト (mklink) を使用する

mklink を使うのが最も一般的な方法です。なぜでしょうか?それは、組み込みでシンプルかつ柔軟だからです。しかし、ちょっとした難点があります。コマンドプロンプトを管理者として実行する必要があるのです。そうしないと、クラッシュしてブロックされてしまいます。これは少々面倒です。というのも、Windows では一般ユーザーがシンボリックリンクを作成するのが、当然ながら必要以上に難しくなっているからです。

管理者権限でコマンドプロンプトを開くには、スタートメニューで「cmd」を検索し、右クリックして「管理者として実行」を選択します。表示されるコマンドプロンプトの構文は簡単です。例えば、メモ帳へのシンボリックリンクを作成するには、次のようにします。

mklink C:\PS\note.exe c:\Windows\System32\notepad.exe

「 C:\PS\note.exe <==> c:\Windows\System32\notepad.exe のシンボリックリンクが作成されました」のようなメッセージが表示されます。これで、 note.exe を実行するたびに、単なるシンボリックリンクであるにもかかわらず、メモ帳が起動するようになります。便利ですか?ええ、特にワークフローにこのようなリンクが12個以上ある場合は便利です。

方法 2: ディレクトリ シンボリック リンクを作成する (/D スイッチを使用)

フォルダへのシンボリックリンクの作成も同様に可能です。例えば、ダウンロードディレクトリをリダイレクトするには、次のようにします。

mklink /D "C:\PS\Downloads" "C:\Users\youruser\Downloads"

これにより、すべてをコピーすることなく、任意の場所からダウンロードフォルダにアクセスしやすくなります。C:\PS\Downloads を開くと、実際のダウンロードフォルダの内容が表示されますが、リンクを通して表示されます。まるで別のフォルダへの窓のようです。

PowerShellアプローチ

PowerShellを使い慣れている場合は、そちらでもシンボリックリンクを作成できます。構文は少し冗長ですが、目的を達成できます。

New-Item -ItemType SymbolicLink -Path ".\test\tmpfiles" -Target "..\tmp\files"

この方法は、スクリプト作成や自動化に役立ちます。特に、リモート マシンで実行する場合や相対パスが必要な場合に便利です。

ネットワーク共有へのリンク

ネットワークフォルダへのシンボリックリンクを作成したいですか?簡単です。UNCパスを指定するだけです。

mklink /D c:\ps\share \\hq-fs01\Share

このトリックは、特に複数のユーザーやアプリが共有データに依存している場合、サーバーへのアクセスを集中化するのに最適です。ただし、Windowsはポリシーを調整しないとリモートシンボリックリンクをブロックする可能性があるため、注意が必要です。

リモート シンボリック リンクを有効にするには、次のコマンドで現在の設定を確認します。

fsutil behavior query SymlinkEvaluation

「リモートからローカルへのシンボリック リンクが無効になっています」と表示される場合は、次のコマンドを実行して有効にすることができます。

fsutil behavior set SymlinkEvaluation R2R:1 fsutil behavior set SymlinkEvaluation R2L:1

この設定後、Windowsはリモートリソースへのシンボリックリンクを許可しますが、設定によってはネットワークのセキュリティポリシーによって一部のリンクがブロックされる可能性があることに注意してください。少し面倒ですが、一度設定すれば問題なく動作します。

Windows ドライブ上のすべてのシンボリック リンクを見つける方法

ドライブに潜むシンボリックリンクをすべて見つけたいですか? Windowsでは分かりにくいですが、次のようなコマンドを使えば可能です。

dir /AL /S C:\ | find "SYMLINK"

これは「L」属性を持つすべてのファイルをリストし、サブフォルダも再帰的にスキャンします。これもあまり良い方法ではありませんが、ファイルの海に迷いたくない場合には役立ちます。

PowerShell を好む場合は、これを試してください。

Get-ChildItem -Path C:\ -Force -Recurse -ErrorAction 'silentlycontinue' | Where { $_. Attributes -match "ReparsePoint"}

このコマンドはC:\内のすべてのディレクトリを調べ、ReparsePoint属性(シンボリックリンク、ジャンクション、マウントポイントを示す)でマークされたオブジェクトを除外します。慣れれば簡単ですが、ドライブが大きい場合は多少の遅延が発生する可能性があるので注意してください。

正直に言うと、シンボリックリンクの管理はボタンをダブルクリックするほど簡単ではありませんが、一度クリックすると、ファイルを盲目的に複製することなく、整理してリンクするための強力な方法になります。

まとめ

シンボリックリンクの作成は、あまり活用されておらず、過小評価されていると言えるでしょう。ある環境では手軽な解決策として、また別の環境ではディスクスペースやネットワーク共有の管理に非常に役立ちます。ただし、ポリシーが変更されていない限り、シンボリックリンクの設定には管理者権限が必要です。また、Windowsが「ReparsePoint」と見なすものにも注意が必要です。そうでないと、システムが一部のリンクをブロックしてしまう可能性があります。

まとめ

  • ほとんどのリンクについては、管理者コマンドプロンプトからmklinkを使用します。
  • フォルダリンクの場合は、/D
  • PowerShellはスクリプトを書いたり、スクリプトを好む場合に便利です
  • ネットワークシンボリックリンクではリモート評価を有効にする必要があります
  • シンボリックリンクを見つけるには、dir /AL /SPowerShellスクリプトを使用します

最後に

シンボリックリンクの使い方を習得すれば、ファイルの移動や複雑なフォルダ設定の管理をする際に、かなりの手間を省くことができます。超絶に便利というわけではありませんが、大規模なデータセットやネットワークドライブを扱う人にとっては、試してみる価値は間違いなくあります。少しでも役に立つことを願っています。私が試したいくつかの設定では、実際に効果がありました。