带引号的批处理命令无法移动含特殊字符的文件并删除对应文件夹
兄弟,太懂你这种重装Windows后手动整理开始菜单的痛苦了——能折腾出自动化批处理来省时间,绝对是把效率拉满了!不过碰到AMD这个特殊命名的文件夹卡壳,确实挺闹心的。
你说的没错,普通冒号:在NTFS里是禁用的,但AMD安装包偏要整个修饰符字母冒号(꞉),这玩意儿看着跟普通冒号一模一样,但其实是个完全不同的Unicode字符,批处理里就算用引号包裹,有时候还是会因为字符解析的问题掉链子。
给你几个靠谱的解决方案,挨个试试:
用短路径名绕开特殊字符:Windows会给长文件名自动生成8.3格式的短路径,比如你那个AMD文件夹的短路径可能是
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\AMDSo~1。想找准确的短路径?打开命令提示符,进到C:\ProgramData\Microsoft\Windows\Start Menu\Programs目录,输入dir /x就能看到每个文件夹对应的短路径了。替换后的命令大概是这样:cd "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\AMDSo~1" move "AMD Software꞉ Adrenalin Edition.lnk" "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\System\Settings" cd .. rmdir /S /Q "AMDSo~1"开启延迟变量扩展来解析特殊路径:有时候把路径存进变量里,用延迟扩展调用,能避开特殊字符的解析问题,试试这段代码:
@echo off setlocal enabledelayedexpansion set "amdFolder=C:\ProgramData\Microsoft\Windows\Start Menu\Programs\AMD Software꞉ Adrenalin Edition" set "targetFolder=C:\ProgramData\Microsoft\Windows\Start Menu\Programs\System\Settings" move "!amdFolder!\AMD Software꞉ Adrenalin Edition.lnk" "!targetFolder!" rmdir /S /Q "!amdFolder!" endlocal用robocopy替代move,对特殊字符支持更友好:robocopy是Windows自带的高级复制/移动工具,处理特殊命名的文件比原生move靠谱多了,用
/MOV参数就能移动后删除源文件,然后直接删空文件夹就行:robocopy "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\AMD Software꞉ Adrenalin Edition" "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\System\Settings" "AMD Software꞉ Adrenalin Edition.lnk" /MOV rmdir /S /Q "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\AMD Software꞉ Adrenalin Edition"
最后提醒一句:记得以管理员身份运行批处理!ProgramData是系统级目录,普通权限可能会碰到权限不足的问题,这也可能是命令失败的隐形原因哦。
备注:内容来源于stack exchange,提问作者John

