无法删除带有尾随空格的文件夹(Windows 7)

26
问题:我有一个Windows 7的子目录,但无法删除。
虽然我知道其他人在这里以及互联网上的许多其他地方都问过这类Windows 7文件系统问题,但我在这里的问题特别涉及Windows 7上无法删除的特定类别的文件,这些文件名包含一个尾随空格。 是否有更好的工具来检查和/或编辑我的文件系统(如果需要,可以使用十六进制)?
操作系统:我正在运行x64专业版,并已完全更新。 尝试过的方法:我已经阅读了许多关于这个问题的网页,并尝试了许多潜在的解决方案。最近,我一直在使用PowerShell研究这个问题,它似乎完全能够处理系统内部。此时,我正在寻找类似于文件系统的十六进制编辑器之类的工具。 不是由以下原因引起的:
  • 文件名过长,或
  • 位于过长的路径中,
无法通过以下方式修复:
  • 使用旧的DOS文件命名方案进行重命名
  • 运行整个文件系统的CHKDSK(检查磁盘)
  • 关闭所有可能正在访问它的其他程序
  • 禁用病毒软件
  • 使用Delinvfile.exe 4.5实用程序。注意:Delinvfile说它无法修复,“包含无效字符的短名称的文件和文件夹。其中包括[在文件名中不允许使用的字符]:
<  -  Less than symbol
>  -  Greater than symbol
:  -  Colon
"  -  Quotation Mark
/  -  Forward Slash
|  -  Vertical Bar
?  -  Question mark
*  -  Asterisk
"What caused it?"在我的情况下,这个无法删除的子目录是几个月前由我使用用于源代码备份的自定义PHP程序创建的。它的名称似乎带有空格或其他不良字符,但我无法确定。它在文件目录中可见,但无法删除、重命名、rmdir等操作。

调查:我可以将其移动到文件系统中,并将其放置在名为“持有坏子目录”的子目录中。

在此处,您可以通过PowerShell看到它。首先,我使用Get-ChildItem(与别名“dir”相同)来显示它:

"
PS C:\holds bad subdir> Get-ChildItem


    Directory: C:\holds bad subdir


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        1/9/2014   3:01   AM            20120530-04

如果我在cmd窗口中尝试通过输入“del” 2 ' + tab' 来删除它,它会完成文件名扩展,如下所示: del "20120530-04",显示目录名末尾有一个空格。当我执行此命令时,结果是:
“无法找到C:\holds bad subdir\20120530-04”
如果我使用del 2*来删除它,系统会返回好像已经删除了它,但实际上没有。
如果我在PowerShell中发出相同的命令,并且还使用Force选项,它会报告:“指定路径C:\holds bad subdir\20120530-04上的对象不存在。”,如下所示:
PS C:\holds bad subdir> Remove-Item 2* -Force  Remove-Item : An object at the specified path C:\holds bad subdir\20120530-04  does not exist.At line:1 char:1
+ Remove-Item 2* -Force
+ ~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Remove-Item], PSArgumentException
    + FullyQualifiedErrorId : Argument,Microsoft.PowerShell.Commands.RemoveItemCommand

这有点奇怪,因为目录可以清楚地看到它,但任何方法似乎要么看不到它,要么不能应用于它。
我也可以在Windows Explorer中查看无法删除的子目录。当我浏览它时,它会显示“此文件夹为空”。如果我尝试在那里删除它,我会得到以下消息:

Enter image description here

此外,如果我查看此文件夹的属性,我可以看到名称为“20120530-04 ”,即末尾有一个额外的空格。

Enter image description here

有趣的是,安全选项卡报告“(X)所请求的安全信息不可用或无法显示。”

而且它既不是只读的,也不是隐藏的。


问题范围:现在,这不是一个大问题,很容易将此子目录埋藏在一个偏僻的子目录中,然后不用担心它。

但对我来说,这已经变成了一种智力挑战,同时也是学习更多关于Windows 7内部结构的一种方式。我想我很惊讶于Windows中这样一个低级的漏洞竟然存在,并且有如此多的系统安装在全球。此时很难知道这是Windows的漏洞、错误数据(由漏洞引入)还是仅仅是错误数据。


我在想所谓的空格是否真的是某个奇怪的(Unicode?)字符。也许 DIR >textfile 可以向十六进制编辑器展示更多信息? - Magoo
我的问题与原帖完全相同,只是有一个小细节:我甚至无法移动该文件夹。来自已接受解决方案的命令最终将其删除。最初,该文件夹是由WinRAR创建的,意外地多了一个空格。 - Henrique de Sousa
5个回答

91

1
干得好,Lars。你是个天才。我没想到要使用网络路径。我欠你一个人情。尽管微软网页警告说这个解决方案不适用于Win 7,但这正是需要通过其他操作系统接口来完成的。 - Elliptical view
有点尴尬,我在研究这个问题时没有找到你引用的链接。当时我搜索的关键词不对,并且还没有意识到它与尾随空格有关,这一点我也不太确定。我事后改了标题以更好地描述问题,但之后没有用新标题重新搜索。自我提醒:谷歌搜索只能根据给定的关键词进行搜索,所以最好尝试多个查询。 - Elliptical view
1
最终删除了该目录。谢谢@Lars Truijens。 如果有人在末尾使用“/s”时收到“目录不为空”的消息 - KTYP
这对我有效,文件夹有点烦人 xD - HadesDX
我再次确认这个指令对我的情况有效。我曾经尝试过几个指令,但都失败了。 - Tung
在NTFS发布20多年后,这个漏洞仍然存在于Windows 10上。而Lars的解决方法仍然有效。 - Cœur

2
我有几个建议。
方法1: cmdlet中的默认`Path`参数已知在特殊字符方面存在问题。然而,`LiteralPath`应该支持所有字符,并且经常可以解决您遇到的问题。
Get-ChildItem 2012* | % { Remove-Item -LiteralPath $_.FullName -Force }

方法二: 您可以尝试使用文件夹的短名称(8.3 文件名)来命名。这是使用 cmd.exe 的方法。您也可以将这两个命令放在 cmd /c " YOUR COMMAND " 中以在 PowerShell 中运行它们。

D:\> dir /x
 Volume in drive D is Storage
 Volume Serial Number is *******

 Directory of D:\

12.01.2014  12:29    <DIR>          APPLEI~1     Apple iOS 7 GM


D:\> rd /s d:\APPLEI~1
 d:\applei~1, Are you sure (Y/N)? y

方法三: 您也可以尝试使用WMI途径:

#Remember to use \\ instead of \ in the path
$fold = Get-WmiObject -Query "select * from Win32_Directory where Name = 'C:\\holds bad subdir\\20120530-04'"
$fold

如果没有返回任何结果,请在文件名末尾添加一个空格再试。如果返回了一个对象,请运行以下命令:

$fold.Delete()

如果在末尾加上空格或不加空格都不能返回对象,请尝试以下使用通配符的方法(这可能需要运行1-15分钟)。
#Remember to use \\ instead of \ in the path
$fold = Get-WmiObject -Query "select * from Win32_Directory where Name like 'C:\\holds bad subdir\\20120530-04%'"
$fold

如果返回正确的文件夹,请将其删除:

$fold.Delete()

谢谢。使用第一种方法,“Get-ChildItem 2012*”没能成功执行到管道之前就失败了。而且我已经基本上尝试过第二种方法了。至于第三种方法,你的解释让我有点摸不着头脑,我还在通过谷歌搜索来了解你在做什么。但事实证明,这里提供的另一个解决方案有效,并且由于我只需要删除这一个目录,我无法再次测试它。但还是感谢你的帮助,Frode。 - Elliptical view
哦,太感谢你帮我解决了-LiteralPath的问题,不然我就要疯了。 - Casey

1
你尝试过了吗?
rd "C:\holds bad subdir\20120530-04 "

或者

rd /s "C:\holds bad subdir"(删除指定目录及其子目录)

您说您尝试了删除文件的del命令,但您没有提到rd或其同义词rmdir可以删除目录。


是的,谢谢。在PowerShell中也是一样的:Remove-item,“概要删除文件和文件夹。” - Elliptical view

0

启动Live Linux Ubuntu CDROM并查看文件管理器的运行情况。

Windows不应支持尾随空格,但支持前导空格。


Ubuntu已经下载完成,只是想安装一下看看它的工作原理。谢谢你的建议。 - Elliptical view
1
不要安装,从可启动的光盘启动。将ISO写入CD或创建可启动的USB版本。 - foxidrive
不错。4MB现在对于CD来说太大了,但是USB闪存盘可以使用。谢谢。 - Elliptical view

0
从父目录开始,执行以下操作,希望能够欺骗任何有用的翻译CMD正在执行的操作:
for /f "delims=" %i in ('dir /b /ad') do rd /s /q "%i"

当你在那里时,也不妨将"%~si"作为目标尝试一下...


再次感谢,但很抱歉,这个失败了。以下是返回的内容:第1行/第2行:C:\holds bad subdir>rd /s /q "20120530-04",系统找不到指定的文件。 - Elliptical view
我在Win2008 R2上也遇到了同样的问题。我使用提升权限的CMD shell解决了这个问题,并执行DIR * /X命令,列出了旧的文件命名约定。在同一个文件夹下有两个子文件夹,即"websites"和"websites "。然而,后者出现了WEBSIT2的别名,我可以使用REN WEBSIT2 BAD-DIR进行重命名并最终删除它。我想知道的是它是如何出现的。 - Marc Wilson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接