天天看點

玩轉WIN7的MKLINK

基本介紹:

在CMD指令行輸入mklink /?,能獲得以下幫助:

建立符号連結。

MKLINK [[/D] | [/H] | [/J]] Link Target

       /D      建立目錄符号連結。預設為檔案

               符号連結。

       /H      建立硬連結,而不是符号連結。

       /J      建立目錄聯接。

       Link    指定新的符号連結名稱。

       Target  指定新連結引用的路徑

               (相對或絕對)。

在此,我僅僅對建立目錄的連結進行試用,是以以下讨論的皆是有關目錄方面的。

參數/D 與 /J 的差別:

在幫助裡面,這兩個參數的解釋,一個是“連結”,一個是“聯接”,僅僅一字之差。字面上的解釋或系統層次上的理論解釋,我無法深究,隻好通過實踐來比較兩者的差別。

使用/d參數指令建立一個連結:

mklink /d "Temp.link" "F:\SystemCache\Temp"

檔案夾屬性,顯示如圖所示:

玩轉WIN7的MKLINK

使用/J參數指令建立一個聯接:

mklink /J "Temp.link" "F:\SystemCache\Temp"

檔案夾屬性,顯示如圖所示:

玩轉WIN7的MKLINK

其中一眼就可以看到的差別就是,使用/D參數建立的“連結”,屬性裡面多了一項“快捷方式”頁籤。

同時在CMD指令行裡面DIR顯示目錄的時候,顯示的也是有所差別的,如圖:

玩轉WIN7的MKLINK

其中參數/D對應的是<symlinkd>而參數/J對應的是<junction>。網搜的時候,網上有人留意到微軟系統自己使用的都是<junction>,在此繼續留待考證。

表面的差別非常明顯啦,而我們關注的是在實際操作過程中,兩者又都有啥差別呢?首先我們對于一個檔案夾的操作不外乎“複制,剪切,删除”,是以依次對兩個檔案夾進行測試,結果如下。

【複制】的測試為:将兩個檔案夾同時複制,并在目前檔案夾粘帖,最終結果如下:

玩轉WIN7的MKLINK
  • 使用/D參數的檔案夾,成功的在目前檔案夾建立了一個testD的副本。
  • 使用/J 參數的檔案夾,複制N次,在目前檔案夾沒有任何效果,進入源目錄的時候,發現建立的副本都在“源目錄”裡面。

結論:

無論作為連結還是聯接,平常的複制操作都是對"源目錄" 的進行拷貝,而不是複制自身的連結或聯接屬性。要想實作複制自身,而不是所指向的目錄,可以使用網上介紹的方法,即在指令行下使用Xcopy 帶/B參數來進行複制。

【剪切】的測試為:同時剪切兩個檔案夾,粘貼到D 盤。效果如下:

  • 使用/D參數的檔案夾:沒有任何效果。
  • 使用/J 參數的檔案夾:目前盤的“聯接檔案夾”被删除,而卻在D盤建立了一個同名的普通檔案夾,檔案夾内無檔案。

結論:

對于連結後的檔案夾,無法對其進行剪切操作。而聯接的檔案夾可以被移動,但是不知道有啥意義。(此處對聯接後檔案夾的測試不是很嚴謹,留待好心的朋友指正)

【删除】的測試:(重新建立後)對兩個檔案夾直接右鍵删除。

  • 使用/D參數的檔案夾:目前連結檔案夾被删除,源目錄不受影響。
  • 使用/J 參數的檔案夾:目前聯接檔案夾被删除,源目錄不受影響。

正式使用:

花了大篇幅介紹了兩個參數的差別,或許有點多餘,但是在實際決定要使用哪個參數建立時,多少有了些直覺的參考。在這裡我個人使用的是/D參數,因為它多了一個“快捷方式”标簽友善“打開檔案夾位置”,僅此而已。

同樣網上也有很多關于如何使用MKLINK來轉移win7檔案夾位置的文章,大家可以一起參考:

1. 移動Windows 7/Vista中使用者檔案夾的位置

2. Win7/Vista 巧用 mklink.exe 實作系統和使用者檔案的分區存放

3. 移動Windows7中winsxs檔案夾位置

在這裡同樣需要用到一個小工具:PendMoves.zip,将其解壓放入系統盤的system32,就能在CMD指令行中任意調用了,當然也可以直接CD進入解壓後的檔案夾,再使用也可以。

  • ㈠:移動系統的TEMP檔案夾。

這個檔案夾我認為是比較安全的,至少操作失敗不會造成系統崩潰。

其中系統裡面一共有兩個TEMP變量,一個是使用者臨時變量,一個是系統臨時變量。首先就是按照參考連結3裡面學到的思想,進行檔案轉移。使用如下代碼建立連結:

@mklink /d "C:\Users\Administrator\AppData\Local\Temp.link" "F:\SystemCache\Temp"

@mklink /d "C:\Windows\Temp.link" "F:\SystemCache\Temp"

然後就是使用Pendmoves裡面的Movefile工具,在重新開機之後重命名或删除檔案夾。

@movefile "C:\Users\Administrator\AppData\Local\Temp" ""

@movefile "C:\Users\Administrator\AppData\Local\Temp.link" "C:\Users\Administrator\AppData\Local\Temp"

@movefile "C:\Windows\Temp" ""

@movefile "C:\Windows\Temp.link" "C:\Windows\Temp"

因為是臨時檔案,是以第一句就是直接删除檔案夾,然後再把建立的連結重命名為Temp即可。

  • ㈡:對使用者AppData檔案夾資料進行轉移。

這裡要說明一點就是,我并不是将整個Administrator的目錄進行轉移,而是僅僅對裡面的AppData檔案夾有針對的轉移。原因有二,一個是我不需要儲存Administrator根目錄下的DAT檔案,二個是這個目錄裡面有很多檔案夾也是聯接式的檔案夾。一旦轉移整個檔案夾,從上面的差別中,我們知道,符号本身将無法通過普通複制一個副本,這也就可能造成未知的系統問題。于是,我就對AppData目錄下的單個檔案夾進行轉移。

同樣,因為AppData目錄下的Local檔案夾内也有幾個是聯接式的檔案夾,是以再次單獨的将其分類開,分别進行轉移。

第一步:将Local下Microsoft檔案夾,LocalLow和Roaming的檔案全部複制到目标路徑中;(在此可能需要擷取“管理者權限”,方法請網搜。)

第二步:再執行相應代碼進行轉移。

以下是AppData下,沒有特殊檔案夾的相應轉移批處理代碼:

@mklink /d "C:\Users\Administrator\AppData\LocalLow.link" "F:\SystemCache\LocalLow"

@movefile "C:\Users\Administrator\AppData\LocalLow" "C:\Users\Administrator\AppData\LocalLowMoved"

@movefile "C:\Users\Administrator\AppData\LocalLow.link" "C:\Users\Administrator\AppData\LocalLow"

@mklink /d "C:\Users\Administrator\AppData\Roaming.link" "F:\SystemCache\Roaming"

@movefile "C:\Users\Administrator\AppData\Roaming" "C:\Users\Administrator\AppData\RoamingMoved"

@movefile "C:\Users\Administrator\AppData\Roaming.link" "C:\Users\Administrator\AppData\Roaming"

以下是AppData目錄下的Local檔案夾的轉移代碼,僅僅對Microsoft檔案夾轉移。

@mklink /d "C:\Users\Administrator\AppData\Local\Microsoft.link" "F:\SystemCache\Local\Microsoft"

@movefile "C:\Users\Administrator\AppData\Local\Microsoft" "C:\Users\Administrator\AppData\Local\MicrosoftMoved"

@movefile "C:\Users\Administrator\AppData\Local\Microsoft.link" "C:\Users\Administrator\AppData\Local\Microsoft"

  • ㈢:轉移ProgramData目錄下的Microsoft檔案夾。

第一步:将Microsoft檔案夾的檔案全部複制到目标路徑中;(在此可能需要擷取“管理者權限”,方法請網搜。)

第二步:再執行相應代碼進行轉移

@mklink /d "C:\ProgramData\Microsoft.link" "F:\ProgramData\Microsoft"

@movefile "C:\ProgramData\Microsoft" "C:\ProgramData\MicrosoftMoved"

@movefile "C:\ProgramData\Microsoft.link" "C:\ProgramData\Microsoft"

  • ㈣:轉移Program Files檔案夾。

個人經驗:在整個轉移此檔案夾之後,會使得“雲端”無法正常捕獲緩存。即,無法正常完成手動安裝到雲端,能夠使用,但是不正常!

是以,這裡提供兩個版本。所有版本的第一步:都是将檔案夾内的檔案全部複制到目标路徑中。

整個目錄轉移:

@mklink /d "C:\Program Files.link" "D:\Program Files C"

@movefile "C:\Program Files" "C:\Program Files Moved"

@movefile "C:\Program Files.link" "C:\Program Files"

分開轉移:

@mklink /j "C:\Program Files\Common Files" "D:\Program Files C\Common Files"

@mklink /j "C:\Program Files\InstallShield Installation Information" "D:\Program Files C\InstallShield Installation Information"

@mklink /j "C:\Program Files\Internet Explorer" "D:\Program Files C\Internet Explorer"

@mklink /j "C:\Program Files\Reference Assemblies" "D:\Program Files C\Reference Assemblies"

@mklink /j "C:\Program Files\Windows Defender" "D:\Program Files C\Windows Defender"

@mklink /j "C:\Program Files\Windows Journal" "D:\Program Files C\Windows Journal"

@mklink /j "C:\Program Files\Windows Mail" "D:\Program Files C\Windows Mail"

@mklink /j "C:\Program Files\Windows Media Player" "D:\Program Files C\Windows Media Player"

@mklink /j "C:\Program Files\Windows NT" "D:\Program Files C\Windows NT"

@mklink /j "C:\Program Files\Windows Photo Viewer" "D:\Program Files C\Windows Photo Viewer"

@mklink /j "C:\Program Files\Windows Portable Devices" "D:\Program Files C\Windows Portable Devices"

說明:因為這個檔案夾裡面的目錄衆多,并且随着個人安裝的軟體不同,數量各不相同,是以一般不推薦轉移此檔案夾。

額外補充:

一旦使用Movefile建立任務計劃之後,可以使用Pendmoves檢查總共建立的任務數。這裡額外補充一個内容就是:當你建立的計劃是錯誤的,比如Movefile使用的路徑有誤,或者你想取消Movefile計劃等等,可以使用一下方法:

打開系統資料庫,查找路徑“HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager”,删除"PendingFileRenameOperations"的值就可以了。

以下是官方原理說明:http://technet.microsoft.com/en-us/magazine/2009.06.utilityspotlight.aspx

不過裡面講解的系統資料庫路徑不準确。

轉載于:https://blog.51cto.com/wapcn/1366303

繼續閱讀