mklink

mklink

NTFS 符號鏈接又稱“符號鏈接”,是 NTFS 文件系統中指向文件系統中的另一個對象的一類對象,被指向的對象叫做“目標”。

mklink 是 Windows 下用於創建符號鏈接的工具,存在於 Windows Vista 及以後版本的 Windows 操作系統中。

使用方式:

MKLINK [[/D] | [/H] | [/J]] 鏈接名稱 目標

說明:

/D 創建目錄符號鏈接而不是文件符號鏈接(默認為文件符號鏈接)

/H 創建硬鏈接而不是符號鏈接

/J 創建目錄連接點

鏈接名稱 指定新的符號鏈接名稱

目標 指定新鏈接引用的路徑(絕對路徑或者相對路徑均可)

符號鏈接


NTFS 符號鏈接 又稱“符號鏈接”,是指 NTFS 文件系統中指向文件系統中的另一個對象的一類對象,被指向的對象叫做“目標”。
NTFS 符號鏈接在 Windows 資源管理器中顯示為正常的文件或目錄,並且用戶可以以管理普通文件或文件夾一樣的方法去管理操作 NTFS 符號鏈接。
NTFS 符號鏈接的目錄或者被稱為“連接點”和“掛載點”,這個概念是從 Windows 2000 時代的 NTFS 3.0 開始引入的。從 NTFS 3.1 開始,可以為任何類型的文件系統對象創建 NTFS 符號鏈接。
但是與 NTFS 3.1 一起發布的 Windows XP 並沒有通過 ntfs.sys 系統驅動對用戶模式應用程序提供支持。但是可以安裝第三方篩選器驅動程序(比如 Masatoshi Kimura 的開源驅動程序 senable)來使 Windows XP 支持 NTFS 符號鏈接。直到 Windows Vista 發布后,微軟才通過 ntfs.sys 在默認情況下對用戶模式應用程序進行支持。
NTFS 符號鏈接對文件的鏈接和對目錄的鏈接是不同的。
與 NTFS 連接點不同,NTFS 符號鏈接不僅可以鏈接文件,還可以鏈接 SMB網路中的路徑。NTFS 連接點只支持本地驅動器上的絕對路徑,而 NTFS 符號鏈接則既可以使用絕對路徑,也可以使用相對路徑。此外,NTFS 符號鏈接還對跨文件系統的鏈接提供了全力支持。然而,跨主機的符號連接功能要求本地主機和遠程主機同時支持 NTFS 符號鏈接。
NTFS 符號鏈接與 Windows 快捷方式文件不同,這是一個普通的文件。
Windows 快捷方式文件可以在任何文件系統(比如早期的 FAT32)下創建,可以包含元數據(比如在 Windows 資源管理器中顯示的圖標),並且不是對應用程序透明的。當應用程序訪問 Windows 快捷方式的時候,默認情況下訪問到的是快捷方式文件,而不會自動指向目標文件。
NTFS 符號鏈接是對用戶透明的,也就是說,在絕大多數情況下,訪問 NTFS 符號鏈接與訪問目標是完全相同的。當應用程序訪問 NTFS 符號鏈接的時候,操作系統會自動將其指向目標,此時應用程序訪問到的就是目標而不是 NTFS 符號鏈接了。

許可權限制


在 Windows Vista / Windows 7 下,系統默認的安全限制禁止非管理員許可權的程序創建符號鏈接。
可以在本地組策略中進行設置,位置是“本地計算機 策略” -》 “計算機配置” -》 “Windows 設置” -》 “安全設置” -》 “本地策略” -》 “用戶許可權分配” -》 “創建符號鏈接”。

使用方法


命令格式
mklink [ [/D] | [/H] | [/J] ] Link Target
參數
參數可選/必須說明
/D可選創建目錄符號鏈接而不是文件符號鏈接(默認為文件符號鏈接)
/H可選創建硬鏈接而不是符號鏈接
/J可選創建目錄連接點
Link必須指定新的符號鏈接名稱
Target必須指定新符號鏈接引用的路徑(絕對路徑或相對路徑均可)
注意:參數 Link 和 Target 要求不能使用 Windows 中不允許用作文件名的字元(\ / : * ? " < > |)。並且如果 Link 和 Target 這兩個參數中需要包含空格,則必須使用英文雙引號將內容引起來,以避免參數識別錯誤。
限制
符號鏈接在系統啟動的時候是不工作的,所以下面這些文件(夾)是不可以作為符號鏈接替換的:
• \Windows
• \Windows\system32
• \Windows\system32\config
Windows Install 並不完全支持符號鏈接,所以,如果將 \Windows\Installer 使用符號鏈接替換將會導致大多數基於 .msi 的 Windows Install 安裝程序出錯失敗,錯誤碼為 2755 或 1632。
以下文件(夾)可以被符號鏈接替換:
• \Documents and Settings
• \ProgramData
• \Program Files
• \Program Files (x86)
• \Users
但是注意:
將 \Users 和 \ProgramData 使用符號鏈接替換是不推薦的,這會破壞 Windows Update 自動更新和 Windows Store 中的應用。
將 \Users、\ProgramData、"\Program Files" 或 "\Program Files (x86)" 使用符號鏈接替換將會破壞 Windows 的安裝、部署和升級。
將 "\Program Files" 或 "\Program Files (x86)" 使用符號鏈接替換將會破壞那些從 \Windows\WinSxS 倉庫中硬性鏈接了文件到安裝目錄中的基於 Windows 組件的服務。
目錄符號鏈接與目錄連接點的區別
目錄符號鏈接(/D)與目錄連接點(/J)非常相似,但是本質是不同的。目錄符號鏈接依舊是符號鏈接,是指向目錄的符號鏈接,而目錄連接點不屬於符號鏈接。
目錄符號鏈接允許 Target 使用相對路徑,當使用相對路徑時創建目錄符號鏈接之後,如果移動了符號鏈接文件,操作系統將無法再找到原來的目標。
目錄連接點只允許 Target 使用絕對路徑,當創建目錄連接點時,如果傳入的參數是相對路徑,mklink 命令會自動將相對路徑補全為絕對路徑。
當目錄符號鏈接使用絕對路徑時,其行為與目錄連接點完全一樣。
此外,目錄符號鏈接還可以指定 SMB 遠程網路中的路徑,而目錄連接點不可以。

注意事項


使用 mklink 創建符號鏈接的時候,操作系統並不會檢查目標是否存在。所以可以創建指向不存在的目標的符號鏈接。
注意儘可能不要使用符號鏈接嵌套。也就是在一個文件夾 A 中創建一個符號鏈接指向 A 自己。這會產生一個無限循環遞歸的文件系統(Windows 下限制了路徑長度最大為 128 個位元組),會使大部分應用程在遍歷文件夾目錄的時候產生循環錯誤(因為對應用程序來說,文件夾的符號鏈接與普通的文件夾是完全一樣的)。