在PowerShell中强制删除目录及其所有子目录的最简单方法是什么?我在Windows 7中使用PowerShell V2 .
我从几个消息来源了解到,最明显的命令 Remove-Item $targetDir -Recurse -Force
无法正常工作 . 这包括PowerShell V2在线帮助(使用 Get-Help Remove-Item -Examples
找到)中的声明,其中声明:
...由于此cmdlet中的Recurse参数有问题,因此该命令使用Get-Childitem cmdlet获取所需的文件,并使用管道运算符将它们传递给Remove-Item cmdlet ...
我已经看到了各种使用 Get-ChildItem 并将其传递给 Remove-Item 的示例,但这些示例通常会根据过滤器而不是整个目录删除一些文件集 .
我正在寻找最简洁的方法来吹灭整个目录,文件和子目录,而不使用最少量的代码生成任何用户警告消息 . 如果容易理解,单行会很好 .
15 回答
真的很简单:
确实像这里宣传的那样工作 .
是也适用的速记别名 .
据我所知,当您尝试递归删除过滤的文件集时,
-Recurse
参数无法正常工作 . 为了杀死一个单一的目录和下面的一切似乎工作正常 .......为我工作
试试这个例子 . 如果该目录不存在,则不会引发错误 . 您可能需要PowerShell v3.0 .
出于某种原因,约翰里斯的回答有时在我的案例中不起作用 . 但它引领我走向了以下方向 . 首先,我尝试使用buggy -recurse选项以递归方式删除目录 . 然后我进入左边的每个子目录并删除所有文件 .
使用旧式DOS命令:
写上面的内容来清理一些日志文件而不删除父目录,这非常有效!
使用简单的
Remove-Item "folder" -Recurse
递归删除文件时,我有时会看到间歇性错误:[folder] cannot be removed because it is not empty.
此答案尝试通过单独删除文件来防止该错误 .
一个重要的细节是使用
pspath -Descending
对所有项目进行排序,以便在根之前删除叶子 . 排序是在pspath
参数上完成的,因为它有更多机会为文件系统以外的提供程序工作 . 如果要过滤要删除的项目,-Include
参数只是一个方便 .它分为两个函数,因为我发现通过运行来查看我要删除的内容很有用
我采取了另一种灵感来自@ john-rees的方法 - 尤其是当他的方法在某些时候开始让我失败时 . 基本上递归子树并按路径长度排序文件 - 从最长到最短删除
关于-LiteralPath魔法,这是另一个可能会打你的可能:https://superuser.com/q/212808
删除包括文件夹结构使用的完整内容
添加到
remove-item
的-recurse
确保禁用交互式提示 .要避免接受的答案的“目录不为空”错误,只需使用之前建议的旧的旧DOS命令 . 准备好复制粘贴的完整PS语法是:
我用了:
这对我来说就像一个魅力(我从Ubuntu偷了它) .
Another useful trick:
如果您发现很多具有相同或相似名称约定的文件(例如带有点前缀名称的mac文件......那个着名的文件提取),您可以使用powershell中的一行轻松删除它们,如下所示:
这一行将删除当前目录中名称开头的所有带有点的文件,以及此目录中其他文件夹内具有相同情况的所有文件 . 使用它时要注意它 . :d
删除整个文件夹树有时会起作用,有时会因"Directory not empty"错误而失败 . 随后尝试检查文件夹是否仍然存在可能导致"Access Denied"或"Unauthorized Access"错误 . 我不知道为什么会发生这种情况,尽管可以从_489304获得一些见解 .
通过指定删除文件夹中项目的顺序以及添加延迟,我能够解决这些问题 . 以下对我来说运行良好:
PowerShell中的Microsoft TechNet文章Using Calculated Properties对于获取按深度排序的子文件夹列表非常有帮助 .
RD /S /Q 的类似可靠性问题可以通过两次运行_489308来解决 - 理想情况是两者之间有一个暂停(即使用 ping ,如下所示) .
要么
如果你有一个庞大的目录,那么我通常做的就是
在另一个PowerShell终端上运行它,它将在完成后停止 .