24

问题:我有一个无法删除的 Windows 7 子目录。

虽然我在这里认识其他人,并且 Internet 上的其他许多人都询问过此类 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

是什么原因造成的?在我的例子中,不可删除的子目录是几个月前使用我用于源树备份的自定义PHP程序创建的。它的名称中似乎有空格或其他不良字符,但我不能确定。它在文件目录中可见,但无法删除、重命名、rmdir 等。

调查:我可以在我的文件系统上移动它,并将它放在 C: 上一个名为“holds bad subdir”的子目录中。

在这里您可以使用 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中查看不可删除的子目录。当我浏览它时,它说,“这个文件夹是空的”。如果我尝试在那里删除它,我会得到:

在此处输入图像描述

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

在此处输入图像描述

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

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


问题范围:现在,这不是一个大问题,很容易将这个子目录埋在一个偏僻的子目录中而不必担心。

但对我来说,这已经变成了一项智力挑战,并且在一定程度上是了解更多关于 Windows 7 内容的一种方式。我想我很惊讶 Windows 中的这样一个错误可能存在于如此低的级别,并且安装了如此多的系统。世界。在这一点上很难知道这是一个 Windows 错误、错误数据(一个错误进入)还是只是错误数据。

4

5 回答 5

88

根据您无法删除 NTFS 文件系统卷上的文件或文件夹(需要 JavaScript 才能显示),以下应该可以工作(注意它使用UNC路径)。

rd "\\?\C:\holds bad subdir\20120530-04 "

请务必使用 cmd.exe 执行此操作。它似乎不适用于 PowerShell 的Remove-Item (rd)。

另见:

于 2014-01-12T12:04:39.713 回答
2

我有几个建议。

方法 1:已知 cmdlet 中的默认Path参数存在特殊字符问题。LiteralPath但是应该支持所有字符,并且通常可以解决您遇到的问题。

Get-ChildItem 2012* | % { Remove-Item -LiteralPath $_.FullName -Force }

方法 2:您可以尝试使用文件夹的短名称(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

方法 3:您还可以查看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()
于 2014-01-12T09:54:20.330 回答
1

你有没有尝试过

rd "C:\holds bad subdir\20120530-04 "

或者

rd /s "C:\holds bad subdir"

您说您已经尝试过del哪些已删除的文件,但您没有提到rd或它的同义词rmdir删除目录。

于 2014-01-12T08:45:05.770 回答
0

从父目录中,执行以下操作,希望能欺骗任何有用的翻译CMD

for /f "delims=" %i in ('dir /b /ad') do rd /s /q "%i"

(当你在那里时,也可以尝试"%~si"作为目标......)

于 2014-01-12T12:11:53.403 回答
0

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

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

于 2014-01-12T10:57:25.213 回答