分类 Windows 下的文章

事情的起因要追溯到四五年前,和同学摸索出了创建..文件夹和.文件夹的方法,并且发现了其具有一些特殊的特性。最近上班摸鱼想起这事来就想复现当时的实现方式,并在此基础之上发现了一些拓展的特性。

...文件夹

稍微对Linux系统有点了解的都知道,.文件夹表示的是当前目录,..文件夹表示的是上级目录,在Windows中亦是如此。

在四五年前所摸索出来的创建...文件夹实际上并不是...,而是. , . .., .. ,即在前后有一个空格的,看起来像...文件夹的文件夹。

感兴趣的读者可以尝试在cmd中进入想要的目录输入以下命令并实际点开看看效果:

mkdir "\ ..\ "

以上命令创建的是 ..文件夹,即在最前面有一个空格的..文件夹。第一次进入时可以发现仍然在当前文件夹中,第二次进入时资源管理器会提示位置不可用,并且尝试对其进行删除、重命名操作都会提示操作无法完成。这个命令我推测是四五年前所发现的命令,它与下面这两个更易于理解的命令等价:

mkdir "./ ../"
mkdir " ../"

顺便说一句,如果直接尝试以下命令是不会成功的,推测创建时会截断末尾的dot与空格符号

mkdir " .."
mkdir "./ .."

会提示拒绝访问或者文件名、目录名或卷标语法不正确。

如果想要删除这个文件夹可以使用rmdir命令。

具有类似特性的还有 文件夹,即空格文件夹。

小结
. , ., .. , .., 文件夹
普通方式(即右键新建文件夹方式)无法创建
可使用类似mkdir "./.. /"方式创建
可使用类似rmdir "./.. /"方式删除
可使用类似rename "example" "./.. /"方式将其他文件夹重命名为特殊文件夹,但是本操作是不可逆的,反过来会提示系统找不到指定文件
在资源管理器中对其进行删除、重命名操作会提示操作无法完成,对其进行修改属性操作会无法保存
第一次双击进入文件夹会相当于没进,此时再次双击进入会提示目录不可用或进入一个无法操作的空文件夹

...文件夹

...文件夹与..文件夹的区别在于它是可以实际创建出来的,不需要添加先导与末尾空格,并且...文件夹与.........等大于三个.的文件夹性质相同,与上面类似,使用如下命令创建与删除,ren的命令特性也相似:

mkdir ".../"
rmdir ".../"

它与..文件夹在特性上的主要区别在于,..文件夹打开第二次就到头了(第二次还不一定打得开),而...系的文件夹可以打开无穷次(其实不一定有无穷次,取决于文件夹路径长度限制),不管打开多少次,始终打开的都是它所在的文件夹。

尝试对其进行删除取决于该文件夹所在位置,可能会导致资源管理器崩溃。如果它在磁盘根目录,相当于对删除磁盘,会提示操作不合法,如果它不在磁盘根目录,会导致资源管理器在检索文件时访问无穷层级导致崩溃。

小结
...与所有三个.以上的文件夹
普通方式(即右键新建文件夹方式)无法创建
可使用类似mkdir "./.../"方式创建
可使用类似rmdir "./.../"方式删除
可使用类似rename "example" "./.../"方式将其他文件夹重命名为特殊文件夹,但是本操作是不可逆的,反过来会提示系统找不到指定文件
在资源管理器中对其进行重命名操作会提示操作无法完成,对其进行修改属性操作会无法保存
可以无穷此进入该文件夹,进入的始终是其所在的文件夹
若其不在磁盘根目录,在资源管理器中对其进行删除操作可能会导致资源管理器崩溃,若其在磁盘根目录会提示文件夹不可用(实际的删除操作是对磁盘进行)

exampleexample..文件夹

在这里的example并不是特指example这个单词,而是指任意正常文件夹的前缀,下文中均用example代替。

假设当前文件夹下不存在example文件夹,若正常右键创建example..文件夹会被自动重命名为example文件夹,若使用类似上文中的方法使用mkdir "./example../"才可以成功创建,当然删除的方法也类似。

example文件夹不存在时,在资源管理器中对其的所有操作均是无效的,双击进入会提示位置不可用,对其进行重命名、删除与修改属性均会提示没有找到项目。

example文件夹存在时,对其所有操作实际上均是对example文件夹生效,包括但不限于删除,重命名,修改属性与双击打开,包括在命令行中使用ren进行重命名亦是如此。

小结
example..文件夹
普通方式(即右键新建文件夹方式)无法创建,会创建成example文件夹
可使用类似mkdir "./example../"方式创建
可使用类似rmdir "./example../"方式删除
可使用类似rename "example" "./example../"方式将其他文件夹重命名为特殊文件夹,但是本操作是不可逆的,反过来会对example文件夹进行操作,若其不存在会提示系统找不到指定文件
example文件夹不存在,在资源管理器中对其进行重命名、打开、删除、修改属性等操作会提示文件夹不存在
example文件夹存在,在资源管理器中对其进行重命名、打开、删除、修改属性等操作会对example文件夹生效,甚至于在命令行中使用ren命令亦是如此,使用move命令则会提示系统找不到指定的文件

设备文件夹

设备文件夹相比以上几种文件夹更为特殊,其是早期dos系统中用于设备的保留字,设备文件夹包括以下几种:CON, PRN, AUX, NUL, COM1, COM2,..., COM9, LPT1, LPT2,..., LPT9

虽然在资源管理器中无法直接创建,但仍可以用与上述类似的方法创建与删除,据说在早期Windows中创建会导致系统蓝屏

根据创建的文件夹名字的不同,包括但可能不限于不存在/函数无效/句柄无效几种类型的特性。

小结
CON, PRN, AUX, NUL, COM1, COM2,..., COM9, LPT1, LPT2,..., LPT9文件夹
普通方式(即右键新建文件夹方式)无法创建,会提示指定的设备名无效
可使用类似mkdir "./con/"方式创建
可使用类似rmdir "./con/"方式删除
对于PRN, AUX, COM1, COM2,..., COM9, LPT1, LPT2,..., LPT9文件夹,创建之后对文件夹本身的任何操作会提示没有找到项目、文件不存在等,而在这些文件夹中可以正常地创建文件夹,并且在新创建的文件夹中可以正常地使用与存放文件
对于con文件夹,对其进行包括打开的任何操作会提示句柄无效或无反应
对于nul文件夹,对其打开、修改属性操作会提示函数不正确,删除操作无效,重命名操作会提示文件过大

类标识文件夹

这类文件夹相比上述的文件夹,对于正常的系统来说实用性可能就高很多了,并且不需要命令行,直接右键重命名即可创建。

还是以example文件夹为例,直接右键重命名为example.{645FF040-5081-101B-9F08-00AA002F954E}文件夹,保存刷新即可。可以看到它变成了回收站的图标,并且打开也是回收站,而且该文件及可以进行正常地重命名、删除、修改属性等操作,此外这种方法还可以与设备文件夹结合使用。

最好用的一点是它可以在cmd中使用ren命令还原成普通的文件夹,这是与上面几点文件夹相比最具使用价值的优点(指藏东西)。如果在其中放入一个...文件夹还可以屏蔽对该文件夹的删除操作(导致资源管理器崩溃,删除失败),相信老司机们应该明白这玩意可以怎么用了。

该类文件夹的原理是利用了Windows类标识符来伪装文件夹,类似的类标识符还有:

参考资料:类标识符
我的电脑 {20D04FE0-3AEA-1069-A2D8-08002B30309D}
我的文档 {450D8FBA-AD25-11D0-98A8-0800361B1103}
拨号网络 {992CFFA0-F557-101A-88EC-00DD010CCC48}
控制面板 {21EC2020-3AEA-1069-A2DD-08002B30309D}
计划任务 {D6277990-4C6A-11CF-8D87-00AA0060F5BF}
打印机 {2227A280-3AEA-1069-A2DE-08002B30309D}
记事本 {1FBA04EE-3024-11D2-8F1F-0000F87ABD16}
网络邻居 {208D2C60-3AEA-1069-A2D7-08002B30309D}
回收站 {645FF040-5081-101B-9F08-00AA002F954E}
公文包 {85BBD920-42A0-1069-A2E4-08002B30309D}
字体 {BD84B380-8CA2-1069-AB1D-08000948F534}
Web 文件夹 {BDEADF00-C265-11d0-BCED-00A0C90AB50F
“上帝模式”{ED7BA470-8E54-465E-825C-99712043E01C}

更进一步

就目前来说最具有实用价值的只有类标识文件夹与...文件夹的结合使用,其他文件夹大多因为在cmd中无法还原为普通文件夹而无法存储文件。

但是

虽然cmd辣鸡,但是我们有无敌的Git Bash啊。

以上所有文件夹在Git Bash中均可以很轻松地进行创建、修改、重命名、访问等操作,由此使得上述所有文件夹均可以还原为普通的文件夹,使其真正具有了隐藏文件的价值。感兴趣的读者可以搜索linux下对文件的基本操作,套用到Git Bash中即可。

Git Bash 永远嘀神

问题背景

每次用windows to go在mac上跑,使用bootcamp装好驱动后D盘总是消失。在磁盘管理里重新设置盘符之后可以正常使用,但是重启之后又没了。对于习惯尽可能把软件装在D盘里的我来说很不方便,所以在查阅资料后找到了解决方法。

吐槽

网上很多使用diskpart的教程要么就是过期的,要么就是不知道哪里搞来的假教程,什么set id之类的全是假的,我搜索了好久,每次不是提示:

DISKPART> set id=07 override

指定的类型的格式不正确。
有关此命令类型的详细信息,请使用 HELP SET 命令

就是

DISKPART> set 07 override

为此命令指定的参数无效。
有关此命令类型的详细信息,请使用 HELP SETID 命令

还有设置注册表之类的,我对直接修改注册表向来是比较抵触的,因为随便修改底层的、自己完全不了解的东西是需要冒着极大的风险的,而且看着网上残次不齐抄来抄去的同一篇教程总是很不放心。

结论

  • win+R 开启 cmd
  • 命令提示符中输入 diskpart 将得到一个新的命令行窗口(此步骤可能需要获得管理员权限)
  • 使用 list disk 显示磁盘列表
DISKPART> list disk

  磁盘 ###  状态           大小     可用     Dyn  Gpt
  --------  -------------  -------  -------  ---  ---
  磁盘 0    联机              233 GB      0 B        *
* 磁盘 1    联机              472 GB      0 B        *
  • 使用 select disk 选择需要的磁盘
DISKPART> select disk 1

磁盘 1 现在是所选磁盘。
  • 使用list volume显示分卷列表
DISKPART> list volume

  卷 ###      LTR  标签         FS     类型        大小     状态       信息
  ----------  ---  -----------  -----  ----------  -------  ---------  --------
  卷     0         EFI          FAT32  磁盘分区         300 MB  正常         已隐藏
  卷     1     C                NTFS   磁盘分区         200 GB  正常         启动
  卷     2     D                exFAT  磁盘分区         271 GB  正常
  卷     3                      FAT32  磁盘分区         350 MB  正常         系统
  • 使用select volume选择分卷列表
DISKPART> select volume 2

卷 2 是所选卷。
  • 使用detail volume显示分卷信息
DISKPART> detail volume

  磁盘 ###  状态           大小     可用     Dyn  Gpt
  --------  -------------  -------  -------  ---  ---
* 磁盘 1    联机              472 GB      0 B        *

只读                   : 否
隐藏                   : 否
没有默认驱动器号       : 否
卷影副本               : 否
脱机                : 否
BitLocker 已加密       : 否
可安装            : 是

卷容量                 :  271 GB
卷可用空间             :   84 GB
  • 使用attribute volume set hidden来隐藏分卷,此时可以看到D盘(在我这里是D盘)在计算机中消失
DISKPART> attribute volume set hidden

卷属性设置成功。
  • 使用attribute volume clear hidden来显示分卷,此时可以看到D盘重新显示
DISKPART> attribute volume clear hidden

卷属性清除成功。

更进一步

  1. 顺便提一句,只读属性使用readonly字段设置,设置了只读之后除格式化外任何修改磁盘的操作会提示该卷被写保护。
  2. diskpart还可以进行磁盘管理中可做的对磁盘的任何操作,比如分卷、扩展等,功能还更多(我怀疑自带的磁盘管理底层用的就是diskpark)

又是吐槽

windows的命令行提示真的做的和屎一样,可设置的属性字段各种help的都不提示,可能对于英文用户来说这些属性可能是显而易见用英文标识的,但对于中文用户还要在不同的同义词中去猜程序具体使用的是哪一个。如果不能像 attribute volume set 隐藏 这样使用中文来输入命令,要么就加上英文字段,要么就干脆不要翻译,反正一般人也不会用这些命令。