Windows 逆天兼容性碰到了目录不加双引号的应用程序的逆天问题
事件起因
前一阵子折腾 Sleepy Android
, 捣鼓 Android Studio
, JDK
, Kotlin
和 gradle
Kotlin 安装在 C:/Program Files
不会存在任何问题, 但是安装在 D:/Program Files
会报错找不到文件
问题分析
JetBrain Kotlin 没有正确处理 Windows 下的目录空格问题 (没加引号), 参见 JetBrain/kotlin #4872 Add quotes to Windows paths
这个 PR 在 22年就有人发了, 还没被合并, JetBrain 效率感人
至于为什么安装在 C:/Program Files
没有任何问题, 这就得从 DOS 8.3
说起了, 详细点这里
简单来说就是 C 盘下的 Program Files
有一个短文件名 PROGRA~1
, 应用程序会优先使用这个
解决方案
在 C:
使用 dir /a /x
可以查看目录的短文件名
C:\>dir /a /x
驱动器 C 中的卷没有标签。
卷的序列号是 2333-2333
C:\ 的目录
2025/02/16 23:33 <DIR> $Recycle.Bin
2025/02/16 23:33 <DIR> $SYSRE~1 $SysReset
2025/02/16 23:33 <JUNCTION> DOCUME~1 Documents and Settings [C:\Users]
2025/02/16 23:33 <DIR> PerfLogs
2025/02/16 23:33 <DIR> PROGRA~1 Program Files
2025/02/16 23:33 <DIR> PROGRA~2 Program Files (x86)
2025/02/16 23:33 <DIR> PROGRA~3 ProgramData
2025/02/16 23:33 <DIR> Recovery
2025/02/16 23:33 <DIR> SYSTEM~1 System Volume Information
2025/02/16 23:33 <DIR> Users
2025/02/16 23:33 <DIR> Windows
在其他盘使用 fsutil file setshortname <longfilename> <shortfilename>
即可设置 DOS 8.3 短文件名
设置的时候记得关闭当前目录下的应用程序 (包括后台进程和服务)
参考命令
设置的时候记得关闭当前目录下的应用程序 (包括后台进程和服务)
- x86_64 (Intel/AMD处理器 64位系统)
fsutil file setshortname "Program Files" PROGRA~1
fsutil file setshortname "Program Files (x86)" PROGRA~2
fsutil file setshortname "ProgramData" PROGRA~3