• 玩转WIN7的MKLINK


    转自:http://www.cnblogs.com/asion/archive/2011/03/10/1979282.html

    引言:

    换了新电脑,终于再次使用上啦WIN7 ,经过一个周每天重装N次系统,终于弄好一个像样的系统啦。由于使用rt7lite对WIN7SP1官方整合包进行了适当精简,所以最终系统的稳定性还得经过一段时间的使用才能知道。其中在安装的时候,仅仅为系统盘(C盘)分配了10G的磁盘空间,而装完后就占用了8G以上空间,再想装上工作软件,就明显不足了。于是网搜方法对系统进行再度的减肥的时候,发现了WIN7的一个新工具【MKLINK】,能够对系统文件或文件夹进行链接或联接。这可是个好工具,所以对其功能进行一番试用,以下是事后的小小总结,提供给有需要的朋友。

    基本介绍:

    在CMD命令行输入mklink /?,能获得以下帮助:

    创建符号链接。

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

            /D      创建目录符号链接。默认为文件
                    符号链接。
            /H      创建硬链接,而不是符号链接。
            /J      创建目录联接。
            Link    指定新的符号链接名称。
            Target  指定新链接引用的路径
                    (相对或绝对)。

    在此,我仅仅对创建目录的链接进行试用,所以以下讨论的皆是有关目录方面的。

    参数/D 与 /J 的区别:

    在帮助里面,这两个参数的解释,一个是“链接”,一个是“联接”,仅仅一字之差。字面上的解释或系统层次上的理论解释,我无法深究,只好通过实践来比较两者的区别。

    使用/d参数命令创建一个链接:

    mklink /d "Temp.link" "F:SystemCacheTemp"

    文件夹属性,显示如图所示:mklink的符号链接

    使用/J参数命令创建一个联接:

    mklink /J "Temp.link" "F:SystemCacheTemp"

    文件夹属性,显示如图所示:

    mklink文件夹联接

    其中一眼就可以看到的区别就是,使用/D参数创建的“链接”,属性里面多了一项“快捷方式”选项卡。

    同时在CMD命令行里面DIR显示目录的时候,显示的也是有所区别的,如图:

    JUNCTION和SYMLINKD其中参数/D对应的是<symlinkd>而参数/J对应的是<junction>。网搜的时候,网上有人留意到微软系统自己使用的都是<junction>,在此继续留待考证。

    表面的区别非常明显啦,而我们关注的是在实际操作过程中,两者又都有啥区别呢?首先我们对于一个文件夹的操作不外乎“复制,剪切,删除”,所以依次对两个文件夹进行测试,结果如下。

    【复制】的测试为:将两个文件夹同时复制,并在当前文件夹粘帖,最终结果如下:

    [By:AsionTang]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:UsersAdministratorAppDataLocalTemp.link" "F:SystemCacheTemp"

    @mklink /d "C:WindowsTemp.link" "F:SystemCacheTemp"

    然后就是使用Pendmoves里面的Movefile工具,在重启之后重命名或删除文件夹。

    @movefile "C:UsersAdministratorAppDataLocalTemp" ""
    @movefile "C:UsersAdministratorAppDataLocalTemp.link" "C:UsersAdministratorAppDataLocalTemp"

    @movefile "C:WindowsTemp" ""
    @movefile "C:WindowsTemp.link" "C:WindowsTemp"

    因为是临时文件,所以第一句就是直接删除文件夹,然后再把建立的链接重命名为Temp即可。

    • ㈡:对用户AppData文件夹数据进行转移。

    这里要说明一点就是,我并不是将整个Administrator的目录进行转移,而是仅仅对里面的AppData文件夹有针对的转移。原因有二,一个是我不需要保存Administrator根目录下的DAT文件,二个是这个目录里面有很多文件夹也是联接式的文件夹。一旦转移整个文件夹,从上面的区别中,我们知道,符号本身将无法通过普通复制一个副本,这也就可能造成未知的系统问题。于是,我就对AppData目录下的单个文件夹进行转移。

    同样,因为AppData目录下的Local文件夹内也有几个是联接式的文件夹,所以再次单独的将其分类开,分别进行转移。

    第一步:将Local下Microsoft文件夹,LocalLow和Roaming的文件全部复制到目标路径中;(在此可能需要获取“管理员权限”,方法请网搜。)

    第二步:再执行相应代码进行转移

    以下是AppData下,没有特殊文件夹的相应转移批处理代码:

    @mklink /d "C:UsersAdministratorAppDataLocalLow.link" "F:SystemCacheLocalLow"

    @movefile "C:UsersAdministratorAppDataLocalLow" "C:UsersAdministratorAppDataLocalLowMoved"
    @movefile "C:UsersAdministratorAppDataLocalLow.link" "C:UsersAdministratorAppDataLocalLow"

    @mklink /d "C:UsersAdministratorAppDataRoaming.link" "F:SystemCacheRoaming"

    @movefile "C:UsersAdministratorAppDataRoaming" "C:UsersAdministratorAppDataRoamingMoved"
    @movefile "C:UsersAdministratorAppDataRoaming.link" "C:UsersAdministratorAppDataRoaming"

    以下是AppData目录下的Local文件夹的转移代码,仅仅对Microsoft文件夹转移。

    @mklink /d "C:UsersAdministratorAppDataLocalMicrosoft.link" "F:SystemCacheLocalMicrosoft"

    @movefile "C:UsersAdministratorAppDataLocalMicrosoft" "C:UsersAdministratorAppDataLocalMicrosoftMoved"
    @movefile "C:UsersAdministratorAppDataLocalMicrosoft.link" "C:UsersAdministratorAppDataLocalMicrosoft"

    • ㈢:转移ProgramData目录下的Microsoft文件夹。

    第一步:将Microsoft文件夹的文件全部复制到目标路径中;(在此可能需要获取“管理员权限”,方法请网搜。)

    第二步:再执行相应代码进行转移

    @mklink /d "C:ProgramDataMicrosoft.link" "F:ProgramDataMicrosoft"

    @movefile "C:ProgramDataMicrosoft" "C:ProgramDataMicrosoftMoved"
    @movefile "C:ProgramDataMicrosoft.link" "C:ProgramDataMicrosoft"

    • ㈣:转移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 FilesCommon Files" "D:Program Files CCommon Files"
    @mklink /j "C:Program FilesInstallShield Installation Information" "D:Program Files CInstallShield Installation Information"
    @mklink /j "C:Program FilesInternet Explorer" "D:Program Files CInternet Explorer"
    @mklink /j "C:Program FilesReference Assemblies" "D:Program Files CReference Assemblies"
    @mklink /j "C:Program FilesWindows Defender" "D:Program Files CWindows Defender"
    @mklink /j "C:Program FilesWindows Journal" "D:Program Files CWindows Journal"
    @mklink /j "C:Program FilesWindows Mail" "D:Program Files CWindows Mail"
    @mklink /j "C:Program FilesWindows Media Player" "D:Program Files CWindows Media Player"
    @mklink /j "C:Program FilesWindows NT" "D:Program Files CWindows NT"
    @mklink /j "C:Program FilesWindows Photo Viewer" "D:Program Files CWindows Photo Viewer"
    @mklink /j "C:Program FilesWindows Portable Devices" "D:Program Files CWindows Portable Devices"

    说明:因为这个文件夹里面的目录众多,并且随着个人安装的软件不同,数量各不相同,所以一般不推荐转移此文件夹

    额外补充:

    一旦使用Movefile创建任务计划之后,可以使用Pendmoves检查总共创建的任务数。这里额外补充一个内容就是:当你创建的计划是错误的,比如Movefile使用的路径有误,或者你想取消Movefile计划等等,可以使用一下方法:

    打开注册表,查找路径“HKEY_LOCAL_MACHINESYSTEMControlSet001ControlSession Manager”,删除"PendingFileRenameOperations"的值就可以了。

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

    不过里面讲解的注册表路径不准确。

    相关文件下载:MKLINK的妙用.zip

  • 相关阅读:
    文件操作类2
    C# 统计文章中字符的种类和个数 哈希表和字典的使用
    hdu 1018 Big Number (求一个数的阶乘的位数,公式!!!)
    hdu 4313 Matrix (最小生成树krusual)
    孙子定理,求余定理
    poj 1005 Biorhythms (孙子定理,求余定理)
    poj 2151 Check the difficulty of problems (DP)
    poj1861/zoj1542 (最小生成树krusual)
    hdu 1256 画8 (模拟)
    hdu 2082 找单词 (母函数)
  • 原文地址:https://www.cnblogs.com/analyzer/p/3809310.html
Copyright © 2020-2023  润新知